Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #86, ФЕВРАЛЬ 2006 г.

В прятки с отладчиком

Крис Касперски ака мыщъх

Хакер, номер #086, стр. 086-120-10


[тупой, тупой компилятор MS VC]

Встроенный ассемблер компилятора Visual C++ 6.0 не вполне поддерживает синтаксис Intel и отказывается транслировать инструкцию "mov [esp+12], offset my_string", выдавая убийственное сообщение "fatal error C1001: INTERNAL COMPILER ERROR":

Ненавижу этот Microsoft! Приходится перепихивать offset через регистр, что длиннее и вообще выглядит некрасиво (mov eax, offset my_string/mov [esp+12], eax), но писать непосредственно в машинных кодах через _emit мыщъх'у как-то не улыбается.

[защита от Microsoft]

Ходят слухи, что последующие версии Windows запретят прикладному коду присваивать все три атрибута PAGE_EXECUTE_READWRITE одновременно, поскольку реально это нужно только зловредному коду типа червей. Это сможет делать только система или администратор. Поэтому перед копированием необходимо присвоить атрибуты PAGE_READWRITE, и только после — PAGE_EXECUTE.

[маскировка VirtualProtect]

Вызов VirtualProtect – это ахиллесова пята API-перехватчика, демаскирующая его присутствие. Если хакер установит точку останова, он не только обнаружит факт модификации API-функций, но еще и определит их адреса, переданные VirtualProtect в первом слева аргументе, поэтому необходимо прибегнуть к маскировке.

Самое простое (но не самое надежное) — вместо VirualProtect вызывать VirtualProtectEx, передавая вместо описателя процесса значение -1 (FFFFFFFFh). Вдруг хакер не догадается установить на нее точку останова? Так ведь нет, догадается же…

На NT-подобных системах мы можем использовать NtProtectVirtualMemory, вызывая ее не с первого байта. Подробное описание этого трюка можно найти в "Записках мыщъх'а" или в статье "Точки останова на win32 API и противодействие им", опубликованной в "Системном Администраторе". На 9x никакой NtProtectVirtualMemory нет, и там опять-таки нужно вызывать VirualProtectEx не с первого байта, тогда все точки останова не получат управления и наша шпионская деятельность останется незамеченной.

Некоторые предлагают заменить VirtualProtect на VirtualAlloc с флагом MEM_COMMIT | MEM_RESET, чтобы изменить атрибуты страницы памяти, однако по отношению к системным библиотекам этот трюк не работает, так что у нас остается только VirtualProtectEx.

Назад на стр. 086-120-9  Содержание