Знающие люди, подскажите пожалуйста... В целях защиты собственной софтины, начал заморачиваться с ее сокрытием, нашел доки, начал писать драйвер, поставил хук на 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 заточенную..? Спасибо всем неравнодушным за помощь новичку.
Да, по патч-гуарду читаю, и здесь, и еще в phrack, правда у них как-то оно кусками описано. Часть есть, а часть "догадайся сам"...:-( ring 3 не хочется. тогда любой пионер может отдебажить экзешник, надо заморачиваться с собственными проверками и т.д., а вот лазить отладчиком в драйверах уже не каждый сможет. И в любом случае, очень хочется разобраться именно в этой технологии, я думаю не один я этим интересуюсь, и многим людям этот пример был бы хорошим наглядным пособием. Если бы это все удалось слепить, то я бы с удовольствием поделился с народом исходниками. Пока я драйвер сделал в таком виде, что он скрывает процесс имя которого посылается ему из программки. Думаю если заставить его работать, то можно по крайней мере рабочую версию дать людям посмотреть чтоб знали как делать и куда двигаться...
Yrees Даже ведущие конторы в области защиты не могут никак закодить защиту, не открыв новые дыры. Любой фаер уязвим, до сих пор актуальна рк атака на память. Это грубейшая ошибка, которую только можно допустить. Нульдиреференсы и прочие ошибки это ошибки в коде, а рк атака выполняется не на код, а на алгоритм. А вы не зная азов хотите запилить защиту, смешно до слёз.
Yrees А как ты запретишь перечисление отрытых хэндлов в CSRSS ? qwe8013 Разве при помощи ObRegisterCallbacks можно отфильтровать вызовы ZwQuerySystemInformation ?
Yrees - если цель - действительно защита софта, то хочу тебя расстроить. Ни один адекватный человек не будет ставить прогу, которая без необходимости инсталлит свои драйвера, отключает патч-гуард, меняет опции загрузки ОС и хучит кучу всего в системе. А прога - какой-нибудь блокнот очередной.
Я не хочу развивать дискуссию на тему кто и что умеет. Вот вы молодой человек, блещете умными словами, и тем не менее ни слова о конкретно поставленном вопросе. Я что, написал что я претендую на создание фаера? Все до банального просто, мне нужно скрыть программу от обнаружения через упомянутую функцию. Еще более интересует вопрос о том, как вообще в x64 сделать перехват ядерных функций, и возможно ли это, при условии, что PatchGuard будет отключен, тем или иным способом, вплоть до инструкции для пользователя что ему нужно сделать чтоб программа заработала. Причем здесь высокие материи о крутючих конторах? И потом, все с чего-то начинают. Я всегда и во всем начинал с интересующих меня вопросов, и как бы это странно не казалось, приходил к решению поставленной задачи, вопрос лишь в том, сколько времени на это уходило, и каким способом в конце концов реализовывалось. С драйверами я раньше не связывался никогда, но тем не менее связавшись, прочитав и продолжая читать книгу, кое что для себя нужное уже сделал, и собираюсь продолжать дальше. Прошу помочь мне как человеку новому в этом деле, найти ответы на интересующие вопросы. Это что, из ряда вон выходящее? Вы никогда в школе учителя не спрашивали как решить что-то что вы еще не проходили..? Одним словом, если можете что-то по сути подсказать, то буду премного благодарен. Если нет, то изречений о ведущих конторах в области защиты... Ну как-то не укладываются они в поставленный вопрос. Боюсь что никак, но ведь в основном отладчики и не ищут процессы по хендлам CSRSS а используют стандартные API для получения списка процессов, которые в свою очередь берут их с помощью вызова Zw/NtQuerySystemInformation... Или я не прав? Тот же вопрос что и у T800 возник у меня. Да и направление все же хотелось бы выдержать о перехвате функций ядра...? Не вдаваясь в детали, но в моем случае будут, для одной из прог, например отключают антивирусы и ничего не случилось, пользуются человек 100. Это больше вопрос доверия к автору. О ее функциональном назначении говорить не хотелось бы, но поверьте, это софт для определенного рода защиты, чего и от кого вопрос второй. И все же речь не об этом. Речь о том, как перехватить функцию, и почему такой метод как я привел выше работает в win32 а в win64 не компилируется?
T800 Yrees http://www.wasm.ru/forum/viewtopic.php?pid=422640#p422640 Разве это не то, что вам нужно? Yrees На мой взгляд перехват функций нужно использовать если нет других вариантов.
Это тоже способ для юзер мода, но все же чуть мощнее чем просто сплайс в юзер моде. Нет под рукой х64. Посмотри сводятся ли системные вызовы к ntdll!KiFastSystemCallRet ? Если да то ее можно просплайсить и сделать анализ стека. После чего можно узнать какой сервис вызвали и вернуть ложный результат. (кроме случая если сервис вызывается напрямую через sysenter) Зато если вызов делается через вторую копию ntdll то можно словить этот момент. Но в вин8 такого уже точно нет.
qwe8013 По этой ссылке обсуждают фильтрацию вызовов NtOpenProcess, а не ZwQuerySystemInformation. Я полагаю, что ObRegisterCallbacks срабатывает только тогда, когда требуется увеличение счётчика ссылок на объект. При вызове ZwQuerySystemInformation такое не должно происходить. Yrees Может и другие способы получения списка хендлов есть .... Полагаю Process Explorer не только стандартные API юзает.
Никаких "стандартных API" для получения списка хендлов в природе не существует, - обычным приложениям это не требуется.
1. Переменная KeServiceDescriptorTable не экспортируется на 64-битных системах. 2. Перехватить таки можно даже там, но проблему с PG это ни в коей мере не решает.
Спасибо. Сейчас буду гуглить... Спасибо за идею. Попробую глянуть, сам сейчас на 32битке на работе... По KeServiceDescriptorTable понятно. Спасибо за разъяснение. Так же буквально за пару минут назад нашел это в англоязычном нете.:-((( Но вы говорите перехватить можно, но как? PG я так полагаю отключить то можно. В конце концов сделали же это в TDL4, хотя конечно же его делали гуру, и я совершенно на это не способен на данном этапе, однако я так понимаю можно его отключить, один из методов например как описывает Fyyre в статье Disable PatchGuard - the easy/lazy way. Что до подписи драйверов, есть разные способы их установки и запуска, несмотря на защиту. Например утилита Driver Signature Enforcement Overrider, или отключение проверки в политиках безопасности через редактирование проверки подписи в политиках безопасности через gpedit.msc, и запуск с помощью dseo13b.exe. Но я так понимаю это не решает проблемы с доступом к защищенным PatchGuard-ом мест. Но судя по статье Fyyre, его решение я так понял решает. Остается вопрос - как же все-таки перехватить функцию ZwQuerySystemInformation и установить свой обработчик для нее?
Искать адрес KeServiceDescriptorTable эвристическими методами (по вспомогательным адресам и ссылкам), плюс там формат чуть другой у этой таблицы (смещения вместо адресов), дальше в поиск.
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?
Я никогда ничего не писал на CodeProject.com, ты ошибся. И я имел в виду другой метод поиска, к сожалению, навскидку не помню, в исходниках где-то валяется. В конце концов, господа, подумайте сами уже, как это можно реализовать, чего вы всё готовое-то ищете.