Сrackme, прячущий код на API-функциях

       

Демонстрация перехватчика или попытки взлома


Законченная модель перехватчика содержится в файле kpnc-hack-uni.c, который по сути представляет самый настоящий crackme, выводящий диалоговое окно с заголовком "not-hacked yet" на экран. Во всяком случае, дизассемблер утверждает именно так (см. листинг 7), но в действительности там красуется строка "hacked", свидетельствующая о том, что дизассемблерам верить нельзя.

.text:004010CB _demo       proc near            ; CODE XREF: j__demo^j

.text:004010CB             push   ebp

.text:004010CC             mov    ebp, esp

.text:004010CE             push   0

.text:004010D0             push   offset aNotHackedYet ; "not hacked yet"

.text:004010D5             push   offset aDemo         ; "==[ demo ]=="

.text:004010DA             push   0

.text:004010DC             call   ds:__imp__MessageBoxA@16

.text:004010E2             pop    ebp

.text:004010E3             retn

.text:004010E3 _demo endp

Листинг 7 дизассемблерный листинг функции demo, создающей диалоговое окно с заголовком "not hacked yet", которое перехватывается нашим перехватчиком и "исправляется" на "hacked"

Первый раз MessageBox вызывается без перехватчика, затем с перехватчиком и в конце еще один раз снова без перехватчика (чтобы подтвердить, что перехватчик снимается правильно и без побочных последствий).

Рисунок 7 диалоговое окно, вызываемое функцией demo до (слева) и после (справа) перехвата; функция — одна, диалоговые окна — разные!

Конечно, данный crackme очень легко проанализировать и взломать, поскольку он невелик и защитный код сразу же бросается в глаза. Но в полновесной программе со всеми ее мегабайтами просто так захачить ничего не получится потому что, ну короче. Отладчик (потенциально) способен обнаружить перехват — для этого достаточно просто немного потрассировать API-функцию, но! Легко сказать "немного потрассировать". Это же очень даже до фига трассировать придется, особенно в свете того, что точка останова, установленная до перехвата, срабатывает не в перехватчике, а в оригинальной API-функции.

А вот еще идея — пусть в процессе распаковки программы, распаковщик копирует ключевой код поверх API-функций и удаляет его из самой программы. Тогда сдампленная программа окажется неработоспособной, ведь содержимое API-функций по умолчанию не дампиться! Конечно, хакер может сделать это вручную, если, конечно, разберется в ситуации, что будет совсем непросто!



Содержание раздела