Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #58, СЕНТЯБРЬ 2005 г.

Stealth patching своими руками

Крис Касперски

Спецвыпуск: Хакер, номер #058, стр. 058-050-7


Для осуществления задуманного ты должен перехватить одну или несколько ядреных функций, вызываемых из контекста атакуемого процесса еще до того, как защитный механизм получит управление (после уже будет поздно). Этим условиям отвечает функция ZwCreateFile, хотя, если защищенный код расположен в самом начале приложения, она нам ничем не поможет и потребуется встраиваться в загрузчик PE-файлов, что несколько труднее, так что оставим все частности за рамками разговора и вернемся к ZwCreateFile.

Дизассемблерный листинг будет выглядеть приблизительно так (естественно, линейный адрес функции в памяти будет совсем другим, но его легко определить по таблице экспорта, так как NTOSKRNL.EXE - это фактически обыкновенный исполняемый файл):

(Дизассемблерный листинг функции ZwCreateFile)

text:0042FC00 ZwCreateFile proc near ; CODE XREF: sub_49D192+4Dvp

text:0042FC00 ; sub_4B1D24+85vp ...

text:0042FC00

text:0042FC00 arg_0 = byte ptr 4

text:0042FC00

text:0042FC00 B8 20 00 00+ mov eax, 20h

text:0042FC05 8D 54 24 04 lea edx, [esp+arg_0]

text:0042FC09 CD 2E int 2Eh

text:0042FC0B C2 2C 00 retn 2Ch

text:0042FC0B ZwCreateFile endp

text:0042FBFE ; -------------------------------------

text:0042FBFE 8B FF mov edi, edi

Структура ассемблерного кода вполне типична для функций с префиксом Zw. Сначала идет загрузка регистров, затем INT 2Eh, а за ней RETN XX. Антивирусы об этом хорошо знают, и потому "тупое" внедрение команды JMP на_наше_тело сразу же вызовет подозрения (впрочем, к AVP и DrWEB это не относится). А вот подмена команды RETN XX гораздо менее заметна. Проблема в том, что RETN XX занимает три байта, а JMP на_наше_тело - целых пять! К счастью, за концом Zw-функций практически всегда присутствует последовательность 8B FF (команда MOV EDI, EDI, двухбайтовый аналог NOP), оставленная для выравнивания. Все вместе они и дают пять байт. Хорошо! Сохраняем оригинальную команду RETN XX в своем драйвере, делаем JMP, передающий управление хакерскому обработчику, также расположенному в драйвере. От него требуется взвести регистры Drx и восстановить команду RETN XX, тут же передав на нее управление. Другими словами, выключить свет и замести следы.

Ах, да! Непосредственно модифицировать память ядра не получится, так как она защищена от изменений, но эту защиту легко отключить. Способ первый, простой, документированный, но слишком заметный и вообще некрасивый: лезем в реестр, открываем раздел HKLM\SYSTEM\

CurrentControlSet\

Control\SessionManager\

MemoryManagement и создаем параметр EnforceWriteProtection типа REG_DWORD. Защита от записи отключена! Но и хакер отключен, причем тяжелым ударом сапога. Кто угодно может запустить редактор реестра и посмотреть. Правда, если на атакуемом компьютере установлен Soft-ice или некоторые пакетные фильтры (снифер или же брандмауэр), то этот ключик уже стоит и никаких дополнительных усилий от нас не потребуется.

Назад на стр. 058-050-6  Содержание  Вперед на стр. 058-050-8