JIT SPRAY ÃÂÃÂÃÂÛØ× TDSS - Xakep Online
JIT SPRAY ÃÂÃÂÃÂÛØ× TDSS - Xakep Online
JIT SPRAY ÃÂÃÂÃÂÛØ× TDSS - Xakep Online
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