Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #64, МАРТ 2006 г.

защита игр от взлома

КРИС КАСПЕРСКИ АКА МЫЩЪХ

Спецвыпуск: Хакер, номер #064, стр. 064-066-3


Листинг

дизассемблерный листинг исполняемого файла с отладочной информацией

.text:00405664 cmp _IsRegistered, 0

.text:0040566B jz short loc_40567A

Никогда не оставляй отладочную информацию в откомпилированной программе!

динамические библиотеки

Имена неэкспортируемых функций уничтожаются компилятором, экспортируемые же по умолчанию остаются «как есть». С++-компиляторы в дополнение «замангляют» имена, дописывая к ним «зашифрованный» прототип функции, но IDA PRO с легкостью возвращает их в исходный вид. Если защитный модуль реализуется в виде динамической библиотеки (очень часто случается именно так), наличие символьных имен (причем с готовыми прототипами) значительно упрощает анализ. Например, OO Software (создатель одноименного дефрагментатора) любит таскать за собой библиотеку oorwiz.dll (очевидно, расшифровывается как «OO Registration Wizard»), экспортирующую всего три функции, но зато какие...

Листинг

библиотека oorwiz.dll от OO Software экспортирует функции, говорящие сами за себя

3 0 00001FD0 RegWiz_InitLicMgr

1 1 000019D0 RegWiz_InitReadOnly

2 2 00001D00 RegWiz_InitTrial

Всегда удаляй все символьные имена из экспорта и вызывай функции только по ординалу.

rtti

Динамические классы, тесно связанные с механизмом RTTI (Runtime Type Identification) и активно используемые компиляторами DELPHI/Borland С++ Builder, сохраняют в откомпилированном файле не только свою структуру, но и символьные имена! Если брать как пример результат работы утилиты DEDE, реконструировавшей структуру классов программы Etlin HTTP Proxy Server, сразу в глаза бросится класс TfrmRegister, который соответствует форме fRegister и обрабатывает нажатие кнопки «OK» процедурой bOKClick, расположенной по адресу 48D2DCh. Благодаря динамическим классам сердце защитного механизма было локализовано всего за несколько секунд!

Не используй RTTI в защитных механизмах или, по крайней мере, не давай формам и обработчикам осмысленные имена!

Обфускация

Код, генерируемый компилятором, очень громоздок, и разобраться в нем крайне непросто, но возможно. Чтобы помешать злоумышленникам, некоторые протекторы используют «запутывание», или обфускацию (англ. obfuscation). В простейшем случае автоматический кодогенератор, свинченный с полиморфного движка, внедряет в код огромное количество незначащих команд типа NOP, XCHG EAX, EBX/XHG EBX, EAX, нашпиговывая ими программу как рождественскую утку/гуся. Более совершенные генераторы используют разветвленную систему условных переходов, математические операции и присвоения, результат которых никак не используется, и другие полиморфные технологии.

Листинг

фрагмент программы, защищенной протектором armadillo

.00434000: 60 pushad

.00434001: E800000000 call .000434006 -------- (1)

.00434006: 5D pop ebp

.00434007: 50 push eax

.00434008: 51 push ecx

.00434009: EB0F jmps .00043401A -------- (2)

Назад на стр. 064-066-2  Содержание  Вперед на стр. 064-066-4