18.11.2014 Views

JIT SPRAY АНАЛИЗ TDSS - Xakep Online

JIT SPRAY АНАЛИЗ TDSS - Xakep Online

JIT SPRAY АНАЛИЗ TDSS - Xakep Online

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

ku<br />

вируса. В общем, на сегодняшний день под хуками<br />

следует понимать установку контроля над основными<br />

системными функциями операционной системы, от<br />

которых зависит жизнеспособность любой программы<br />

— речь идет, как правило, о функциях работы с<br />

процессами, потоками, сетью и интернетом и т.д.<br />

«А как же SetWindowsHook?» — спросишь ты меня.<br />

«Прошлый век», — отвечу я. Использовать их давно<br />

уже не кошерно.<br />

×ÒÎ ÈÌÅÅÌ?<br />

Проще всего установить хук в системе путем создания<br />

так называемой прокси-функции. Иначе говоря, тебе<br />

надо определиться, какую функцию ты перехватываешь,<br />

и найти адрес ее вызова. Для этого обычно используется<br />

функция GetProcAddress примерно вот так:<br />

GetProcAddress(GetModuleHandle("ntdll.dll"),<br />

"CsrNewThread").<br />

Однако просвещенные знают, что она практически всегда перехватывается<br />

аверами, и для нахождения адреса функции<br />

используют парсинг таблицы импорта той или иной библиотеки,<br />

обычно ntdll.dll, kernel32.dll (kernelbase.dll в Windows7)<br />

или advapi32.dll.<br />

Далее тебе нужно создать свою прокси-функцию, точь-в-точь<br />

повторяющую вызываемую примерно вот таким образом:<br />

int MyNewFunction(void *param1,<br />

int param2, bool param3)<br />

{<br />

return OriginalFunction(param1,<br />

param2, param3);<br />

}<br />

После этого следует перезаписать адрес вызова<br />

OriginalFunction на свой — то есть, на MyNewFunction.<br />

Теперь, если кто-либо захочет вызвать для исполнения<br />

OriginalFunction, сначала будет вызвана твоя прокси-функция<br />

MyNewFunction, которая уже потом передаст управление<br />

на оригинальный адрес. Вот таким вот нехитрым образом<br />

действуют, наверное, 8 хуков из 10. Этот способ удобен лишь<br />

своей простотой, но при этом представляет собой ужасное<br />

палево для аверов. Как? Поразмысли сам — все, что аверу<br />

нужно, это сравнить прежний, «законный», адрес функции<br />

с тем, что есть на самом деле. Если они отличаются — бьем<br />

тревогу. Кстати, встает и следующий вопрос: откуда взять<br />

этот самый адрес оригинальной функции? Тут особо гадать<br />

не надо — его считывают с нужного файла на диске. Этот<br />

подход основывается на том предположении, что вирус не<br />

будет патчить таблицу экспорта файла, лежащего на диске,<br />

ограничившись патчем виртуальной памяти.<br />

Итак, едем дальше. Как я уже говорил, использование хука<br />

в виде прокси-функции хоть и удобная вещь, но, во-первых,<br />

палевная, а во-вторых, подходит лишь для начинающих. То<br />

Ïåðåõâàò IAT - íåíîðìà<br />

есть не для тебя :). Самый распространенный вид хука — это<br />

сплайсинг. Уверен, ты не раз слышал это слово. В нашем<br />

случае это запись на начало функции пятибайтовой последовательности,<br />

которая представляет собой команду jmp по<br />

адресу обработчика перехвата. Здесь первый байт — опкод<br />

jmp, оставшиеся четыре байта — адрес твоей функции.<br />

Если необходимо вызывать перехватываемую функцию, то<br />

перед заменой необходимо сохранить ее начальные байты<br />

и перед вызовом восстанавливать их. Недостаток данного<br />

метода состоит в следующем: если после восстановления начала<br />

функции произошло переключение контекста на другой<br />

поток приложения, то он сможет вызвать функцию, минуя перехватчик.<br />

Этот недостаток можно устранить, останавливая<br />

все побочные потоки приложения перед вызовом, и запуская<br />

после вызова. Ну и конечно, сплайсинг, как и прокси-функции,<br />

тоже легко выявляется методом сканирования памяти,<br />

так как сразу будет видно, что вызов функции идет куда-то в<br />

другое место.<br />

Вообще, забегая вперед, должен донести до широкой<br />

общественности, что почти все методы перехвата вызова<br />

функций так или иначе детектятся сканированием памяти. За<br />

исключением двух методов, но об этом читай ниже.<br />

IAT, EAT È ÄÐÓÃÈÅ ÇÂÅÐÈ<br />

Возникает вопрос: а на что и, самое главное, где можно<br />

ставить свои хуки? Первое, что приходит на ум — конечно же,<br />

поставить перехват на Import Address Table (IAT).<br />

Когда приложение использует функцию из библиотеки, приложение<br />

должно импортировать адрес функции. Каждая DLL,<br />

используемая приложением, описана в структуре, называемой<br />

IMAGE_IMPORT_DESCRIPTOR. Эта структура содержит<br />

имя DLL, чьи функции импортированы приложе нием, и два<br />

указателя на два массива структур IMAGE_IMPORT_BY_<br />

NAME. Структура IMAGE_IMPORT_BY_NAME содержит имена<br />

импортированных функций, используемых приложением.<br />

Когда операционная система загружает приложение в<br />

память, читается структура IMAGE_IMPORT_DESCRIPTOR и<br />

каждая требуемая DLL загружается в память приложения.<br />

Как только DLL отображена (mapped), операционная система<br />

располагает каждую импортированную функцию в памяти и<br />

записывает поверх одного из массивов IMAGE_IMPORT_BY_<br />

NAME с исполнительным адресом функции.<br />

Как только hook-функция появляется в адресном пространстве<br />

приложения, твой вирус сможет прочесть формат PE<br />

DVD<br />

dvd<br />

На диске ты сможешь<br />

найти программную<br />

реализацию<br />

прочитанного,<br />

выложенную, кстати,<br />

исключительно для<br />

ознакомления.<br />

HTTP://WWW<br />

links<br />

http://vx.netlux.org —<br />

своеобразный музей<br />

вирусов, вирусных<br />

движков и прочей<br />

интересной ерунды.<br />

Must visit, одним<br />

словом.<br />

XÀÊÅÐ 09 /140/ 10 087

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!