Pull to refresh

Comments 19

5-й метод встречал в троянах.
А полностью ручная загрузка всего необходимого не поможет?
5 метод действительно может использоваться для того чтобы скрыть api функцию из импорта приложения, когда через PEB (Process Environment Block) находят адрес GetProcAddress, далее LoadLibrary и все необходимые функции, это можно реализовать не прибегая к использованию inline asm-а.
уточните пожалуйста, что вы имеете ввиду под «полностью ручной загрузкой»?
Ну, программа, к примеру, не имеет импортов вообще. Через PEB находим ntdll, из нее операции работы с файлами, дополнительно сверяем их с таковыми на диске. После этого либо через NtReadFile грузим все что надо, либо грузим только kernel32 и через нее получаем все что надо.
Как применить метод 5, если NtCreateFile и NtReadFile уже перехвачены и «читают» из библиотек искажённое содержимое?

Видимо, нужно проверять, что NtCreateFile и NtReadFile выглядят так, как полагается в данной ОСи.

От Windows XP до Vista Nt-функции однообразны:
mov     eax, ...
mov     edx, 7FFE0300h
call    dword ptr [edx]
retn    ...

А начиная с Windows 7, по-видимому, становятся таким как в статье, причём NtCreateFile и NtReadFile становятся существенно различными между собой.

Итог. Нужно иметь два варианта (XP и 7) массива dNtCreateFile и сравнивать с телом NtCreateFile, допуская несовпадение только в константе в
mov     eax, ...

То же для NtReadFile.
От Windows XP до Vista Nt-функции однообразны: А начиная с Windows 7, по-видимому, становятся таким как в статье

Начиная с XP SP2 вид функции не зависит от версии системы и определяется разрядностью ядра. Вариант с вызовом dword ptr [7FFE0300h] используется на 32-битных системах и вызывает непосредственно ядро. Вариант с вызовом fs:[0C0h] используется на 64-битных системах и вызывает подсистему эмуляции WOW64 (wow64cpu.dll, в свою очередь вызывающий wow64.dll+wow64win.dll), которая преобразует 32-битный вызов в 64-битный (расширяет параметры, осуществляет filesystem/registry redirection).
В XP до SP2, кстати, было
mov     eax, ...
mov     edx, 7FFE0300h
call    edx
retn    ....

Раньше — вообще int 2Eh.
Если догадаться, что этот метод используется (а наличие VirtualProtect хорошо заметно и наталкивает на такие мысли), то тот же самый VirtualProtect можно перехватить, взять из него номер syscall, сформировать свой блок нужного кода и вернуть его. Не?

P.S. Но вообще статья — отличная.
я не совсем понял, можно ли защититься или определить перехват через через kernel драйвер?
защитится можно, как и детектировать перехваты в нашем приложении, но kernel драйвер порой не то решение, которое хочется использовать.
Система у врага, защиться невозможно! Можно усложнить и отсеять кидисов.
Система не у врага. Система у порядочного пользователя. Подверглась нападению злого софта.

Автор вируса видел предыдущую версию антивируса, но не видел текущую. Поэтому не может просто править код антивируса. Вирус не проник в ядро, потому что запущен без администраторских прав.
Против каждого антихука найдётся свой хук на функцию проверки на наличие хуков.
UFO just landed and posted this here
Дык это, самый простой хук — подложить длл и всё.
Еще парочку вариантов сходу предложу:

1. Перед вызовом записать magic, а сразу после смотреть стек по адресу меньше вершины — хук засветится лишним адресом.
2. Сделать MD5 digest используемых библиотек после инсталляции. Особо параноидальный вариант — подписать RSA.
Ключи RSA факторизуются или подменяются на свои, как и хэши.
Чтобы их подменить, их нужно найти в коде программы. Но если исходить из зловредной среды — тут не поможет ничего, куда гораздо проще пропатчить саму проверку на хуки, чем возиться с каким-то конкретным методом.
да x86SwitchTo64BitMode надо фиксить, совместно с KiFastSystemCall на х64
Sign up to leave a comment.

Articles