Демонстрация перехватчика или попытки взлома
Законченная модель перехватчика содержится в файле 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-функций по умолчанию не дампиться! Конечно, хакер может сделать это вручную, если, конечно, разберется в ситуации, что будет совсем непросто!