x64 и kernel-хуки

Тема в разделе "WASM.NT.KERNEL", создана пользователем Yrees, 19 дек 2011.

  1. Yrees

    Yrees New Member

    Публикаций:
    0
    Регистрация:
    19 дек 2011
    Сообщения:
    6
    Знающие люди, подскажите пожалуйста...

    В целях защиты собственной софтины, начал заморачиваться с ее сокрытием, нашел доки, начал писать драйвер, поставил хук на ZwQueryProcessInformation, под 32 бит винду все получилось на высшем уровне, радости нет предела.

    Пришло время посмотреть как это все сделать на 64 битной ОС..........:-((((( Наткнулся на неприятнейшую вещь в виде

    1. Отсутствие возможности ASM вставок. Спасибо этому форуму, нашел как решить.
    2. PatchGuard - насколько я понимаю, помимо техник записи определенного кода в MBR, что в принципе возможно, я так понимаю его можно отключить с помощью bcedit заставив машину думать что она под отладкой находится, только так и не понял, даст ли это ТОЛЬКО лишь возможность просто запускать свои драйверы (самоподписанные), или же можно будет так же как и в 32 битной использовать хуки?
    3. Собственно самое поганое. Не понимаю почему, но даже скомпилировать драйвер не могу в среде x64 Checked. Видел в соседней теме у парнишки тоже была такая проблема, но так и не решил он ее. Не ужели нет способа?
    У меня build стал орать на строки

    (ZWQUERYSYSTEMINFORMATION)(SYSTEMSERVICE(ZwQuerySystemInformation)) = NewZwQuerySystemInformation;
    и соответственно
    (ZWQUERYSYSTEMINFORMATION)(SYSTEMSERVICE(ZwQuerySystemInformation)) = OldZwQuerySystemInformation;

    В которых вобщем-то весь смысл. А орет он следующее:

    c:\drivers\sc.x64\main.c(44) : error C2106: '=' : error C2106: '=' : left operand must be l-value

    Что ему надо то? Ума не приложу. Подскажите пожалуйста как исправить? Как переписать строку? Или если таким способом все же не установить хук, то каким способом это сделать можно?

    Да и вообще, где почитать на эту тему? Я читаю Хоглунда "Руткиты Внедрение в ядро Windows", но блин. По ходу в x64 все по-другому...?:-(( Может книгу посоветуете под х64 заточенную..?

    Спасибо всем неравнодушным за помощь новичку.:derisive:
     
  2. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    1. В статьях вроде был описан метод обхода патч-гуард.
    2. Может можно делать перехват в ринг - 3 ?
     
  3. Yrees

    Yrees New Member

    Публикаций:
    0
    Регистрация:
    19 дек 2011
    Сообщения:
    6
    Да, по патч-гуарду читаю, и здесь, и еще в phrack, правда у них как-то оно кусками описано. Часть есть, а часть "догадайся сам"...:-(

    ring 3 не хочется. тогда любой пионер может отдебажить экзешник, надо заморачиваться с собственными проверками и т.д., а вот лазить отладчиком в драйверах уже не каждый сможет. И в любом случае, очень хочется разобраться именно в этой технологии, я думаю не один я этим интересуюсь, и многим людям этот пример был бы хорошим наглядным пособием.

    Если бы это все удалось слепить, то я бы с удовольствием поделился с народом исходниками. Пока я драйвер сделал в таком виде, что он скрывает процесс имя которого посылается ему из программки. Думаю если заставить его работать, то можно по крайней мере рабочую версию дать людям посмотреть чтоб знали как делать и куда двигаться...
     
  4. kejcerfcrv

    kejcerfcrv New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2011
    Сообщения:
    320
    Yrees
    Даже ведущие конторы в области защиты не могут никак закодить защиту, не открыв новые дыры. Любой фаер уязвим, до сих пор актуальна рк атака на память. Это грубейшая ошибка, которую только можно допустить. Нульдиреференсы и прочие ошибки это ошибки в коде, а рк атака выполняется не на код, а на алгоритм. А вы не зная азов хотите запилить защиту, смешно до слёз.
     
  5. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    Yrees
    ObRegisterCallbacks?
     
  6. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    Yrees
    А как ты запретишь перечисление отрытых хэндлов в CSRSS ?

    qwe8013
    Разве при помощи ObRegisterCallbacks можно отфильтровать вызовы ZwQuerySystemInformation ?
     
  7. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Yrees - если цель - действительно защита софта, то хочу тебя расстроить.
    Ни один адекватный человек не будет ставить прогу, которая без необходимости инсталлит свои драйвера, отключает патч-гуард, меняет опции загрузки ОС и хучит кучу всего в системе.
    А прога - какой-нибудь блокнот очередной.
     
  8. Yrees

    Yrees New Member

    Публикаций:
    0
    Регистрация:
    19 дек 2011
    Сообщения:
    6
    Я не хочу развивать дискуссию на тему кто и что умеет. Вот вы молодой человек, блещете умными словами, и тем не менее ни слова о конкретно поставленном вопросе. Я что, написал что я претендую на создание фаера? Все до банального просто, мне нужно скрыть программу от обнаружения через упомянутую функцию. Еще более интересует вопрос о том, как вообще в x64 сделать перехват ядерных функций, и возможно ли это, при условии, что PatchGuard будет отключен, тем или иным способом, вплоть до инструкции для пользователя что ему нужно сделать чтоб программа заработала.
    Причем здесь высокие материи о крутючих конторах? И потом, все с чего-то начинают. Я всегда и во всем начинал с интересующих меня вопросов, и как бы это странно не казалось, приходил к решению поставленной задачи, вопрос лишь в том, сколько времени на это уходило, и каким способом в конце концов реализовывалось. С драйверами я раньше не связывался никогда, но тем не менее связавшись, прочитав и продолжая читать книгу, кое что для себя нужное уже сделал, и собираюсь продолжать дальше.
    Прошу помочь мне как человеку новому в этом деле, найти ответы на интересующие вопросы. Это что, из ряда вон выходящее? Вы никогда в школе учителя не спрашивали как решить что-то что вы еще не проходили..?
    Одним словом, если можете что-то по сути подсказать, то буду премного благодарен. Если нет, то изречений о ведущих конторах в области защиты... Ну как-то не укладываются они в поставленный вопрос.

    Боюсь что никак, но ведь в основном отладчики и не ищут процессы по хендлам CSRSS а используют стандартные API для получения списка процессов, которые в свою очередь берут их с помощью вызова Zw/NtQuerySystemInformation... Или я не прав?

    Тот же вопрос что и у T800 возник у меня. Да и направление все же хотелось бы выдержать о перехвате функций ядра...?

    Не вдаваясь в детали, но в моем случае будут, для одной из прог, например отключают антивирусы и ничего не случилось, пользуются человек 100. Это больше вопрос доверия к автору. О ее функциональном назначении говорить не хотелось бы, но поверьте, это софт для определенного рода защиты, чего и от кого вопрос второй.

    И все же речь не об этом. Речь о том, как перехватить функцию, и почему такой метод как я привел выше работает в win32 а в win64 не компилируется?
     
  9. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    T800
    Yrees
    http://www.wasm.ru/forum/viewtopic.php?pid=422640#p422640
    Разве это не то, что вам нужно?

    Yrees
    На мой взгляд перехват функций нужно использовать если нет других вариантов.
     
  10. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Это тоже способ для юзер мода, но все же чуть мощнее чем просто сплайс в юзер моде.
    Нет под рукой х64.

    Посмотри сводятся ли системные вызовы к ntdll!KiFastSystemCallRet ?
    Если да то ее можно просплайсить и сделать анализ стека. После чего можно узнать какой сервис вызвали и вернуть ложный результат. (кроме случая если сервис вызывается напрямую через sysenter)
    Зато если вызов делается через вторую копию ntdll то можно словить этот момент.
    Но в вин8 такого уже точно нет.
     
  11. Satsura

    Satsura S4(uR4 __r00tw0rm__

    Публикаций:
    0
    Регистрация:
    22 апр 2010
    Сообщения:
    374
    Адрес:
    Узбекистон, бляать!!11 :D
    Копать : Rootkit Arsenal, Security Exposed.
     
  12. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    qwe8013
    По этой ссылке обсуждают фильтрацию вызовов NtOpenProcess, а не ZwQuerySystemInformation.
    Я полагаю, что ObRegisterCallbacks срабатывает только тогда, когда требуется увеличение счётчика ссылок на объект. При вызове ZwQuerySystemInformation такое не должно происходить.

    Yrees
    Может и другие способы получения списка хендлов есть ....
    Полагаю Process Explorer не только стандартные API юзает.
     
  13. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Никаких "стандартных API" для получения списка хендлов в природе не существует, - обычным приложениям это не требуется.
     
  14. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    1. Переменная KeServiceDescriptorTable не экспортируется на 64-битных системах.
    2. Перехватить таки можно даже там, но проблему с PG это ни в коей мере не решает.
     
  15. Yrees

    Yrees New Member

    Публикаций:
    0
    Регистрация:
    19 дек 2011
    Сообщения:
    6
    Спасибо. Сейчас буду гуглить...

    Спасибо за идею. Попробую глянуть, сам сейчас на 32битке на работе...

    По KeServiceDescriptorTable понятно. Спасибо за разъяснение. Так же буквально за пару минут назад нашел это в англоязычном нете.:-((( Но вы говорите перехватить можно, но как?

    PG я так полагаю отключить то можно. В конце концов сделали же это в TDL4, хотя конечно же его делали гуру, и я совершенно на это не способен на данном этапе, однако я так понимаю можно его отключить, один из методов например как описывает Fyyre в статье Disable PatchGuard - the easy/lazy way.

    Что до подписи драйверов, есть разные способы их установки и запуска, несмотря на защиту. Например утилита Driver Signature Enforcement Overrider, или отключение проверки в политиках безопасности через редактирование проверки подписи в политиках безопасности через gpedit.msc, и запуск с помощью dseo13b.exe.

    Но я так понимаю это не решает проблемы с доступом к защищенным PatchGuard-ом мест. Но судя по статье Fyyre, его решение я так понял решает.

    Остается вопрос - как же все-таки перехватить функцию ZwQuerySystemInformation и установить свой обработчик для нее?
     
  16. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Искать адрес KeServiceDescriptorTable эвристическими методами (по вспомогательным адресам и ссылкам), плюс там формат чуть другой у этой таблицы (смещения вместо адресов), дальше в поиск.
     
  17. Yrees

    Yrees New Member

    Публикаций:
    0
    Регистрация:
    19 дек 2011
    Сообщения:
    6
    Понял. Спасибо за наводку. Буду гуглить. Если что найду, отпишусь дабы поделиться инфой с народом...
     
  18. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    x64
    Решил тоже погуглить.
    Тут http://www.codeproject.com/KB/system/sst-unhook.aspx?msg=3636292 вы даёте ссылку на документ http://www.msuiche.net/papers/Windows_Vista_64bits_and_unexported_kernel_symbols.pdf , в котором описан способ поиска KeServiceDescriptorTable для Vista x64.
    Решил проверить это на Win7 SP1 (ntoskrnl.exe 6.1.7601.17640).
    В функции KiInitializeKernel теперь нету указателя на KeServiceDescriptorTable. Идёт сразу вызов функции KeCompactServiceTable , смысл работы которой не понятен. Хотя тут http://www.debugman.com/thread/5288/1/1 китайцы описали, что функция просто смещения высчитывает относительно базы.

    В итоге нашёл только в функции KiSystemServiceRepeat ссылку на KeServiceDescriptorTable (точнее смещение).

    А на какую таблицу указывает KiServiceTable?
     
  19. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Я никогда ничего не писал на CodeProject.com, ты ошибся. И я имел в виду другой метод поиска, к сожалению, навскидку не помню, в исходниках где-то валяется. В конце концов, господа, подумайте сами уже, как это можно реализовать, чего вы всё готовое-то ищете.
     
  20. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Попробуй посмотреть в сторону перехвата KeBugCheck может что-то даст.