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

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

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

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


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

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

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

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

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

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

[заключение]

Большинство антиотладочных трюков утрачивают свою силу, когда становятся известными. Но только не этот! Обнаружить факт перехвата, даже зная о его возможности, очень сложно, так что мы имеем довольно могучий защитный прием с широким спектром действия и убойным радиусом поражения, а если его еще и усовершенствовать, то получится термоядерное оружие, которое можно применять как для взлома чужих приложений, так и для защиты своих собственных.

[как это отлаживают?]

Без отладочной информации отлаживать программу очень хреново, а отладочной информации у нас нет, потому что с ключом /Zi компилятор ведет себя не совсем адекватно. Чтобы не трассировать весь код целиком, в нужное место исходного кода можно внедрить __asm{int 03}, что вызовет исключение, передающее Just-In-Time отладчику бразды правления. Обычно этим отладчиком является Microsoft Visual C++ Debugger, но можно использовать и OllyDbg (Options -> Just-In-Time Debugging) или другие отладчики.

Назад на стр. 086-120-8  Содержание  Вперед на стр. 086-120-10