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

ОБФУСКАЦИЯ И ЕЕ ПРЕОДОЛЕНИЕ

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

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


Вместо того чтобы анализировать код самой программы, хакер исследует, каким образом она взаимодействует с «внешним миром», то есть с ОС. Тогда на «внутренний» мир защиты можно будет забить. Конечно, не для всех программ это срабатывает, но многие ломаются именно так.

шпионаж за API-функциями несет в себе очень много информации

Art.exe|0FF6D4E|GetProcAddress(77F80000,01049A04:"NtContinue") returns: 77F92796

Art.exe|0FF6D4E|GetProcAddress(77F80000,01049A3C:"NtRaiseException") returns: 77F860F2

Art.exe|0FF6D4E|GetProcAddress(77F80000,01049A7C:"KiUserExceptionDispatcher")returns;

Art.exe|0FF6D4E|GetProcAddress(77F80000,01049AC4:"NtQuerySystemInformation") returns;

Art.exe|0FF6D4E|GetProcAddress(77F80000,01049B0C:"NtAllocateVirtualMemory") returns;

Art.exe|0FF6D4E|GetProcAddress(77F80000,01049B50:"NtFreeVirtualMemory") returns;

Art.exe|0FF6D4E|GetProcAddress(77F80000,01049B90:"NtMapViewOfSection") returns;

Art.exe|0FEE7C2|VirtualAlloc(00000000,0000027D,00001000,00000040) returns: 01220000

Art.exe|10000AE|GetModuleFileNameA(00400000, 0012FE61, 000000FF) returns: 0000003B

Art.exe|0FFDA16|CreateFileA(0012FE61:"C:\bin\ElcomSoft\AdvancedRegistryTrace...",,,,)

Art.exe|0FFDBC3|CreateFileMappingA(9Ch,00h,02h,00h,00h,00h) returns: 000000A0

Art.exe|0FFDBD3|CloseHandle(0000009C) returns: 00000001

Art.exe|0FFDBF8|MapViewOfFile(A0h, 04h, 00h, 00h, 00h) returns: 01230000

Art.exe|0FE4EDD|GetActiveWindow() returns: 00000000

Art.exe|0FD5D98|MessageBoxA(0,499DC:"Debugger detected.",,"Protection Error") returns;

Art.exe|FFFFFFF|ExitProcess(72542079)

[грубая ошибка] большинства обфускаторов в том, что, «запутывая» код, они забывают «запутать» структуру данных (разве что только зашифровывают их). Это позволяет использовать классические приемы взлома типа «прямой поиск регистрационных данных в памяти». Хакер вводит произвольный регистрационный номер, отладчиком находит его в памяти, ставит точку останова и всплывает в «запутанной» процедуре, а затем смотрит обстоятельства дел. В половине случаев после серии долгих разбирательств запутанная процедура возвращает TRUE/FALSE, и тогда хакер просто правит условный переход.

В другой половине случаев защита генерирует «эталонный» регистрационный номер, легко обнаруживаемый визуальным осмотром дампа памяти (в этом случае хакер просто вводит подсмотренный номер в программу). Более сложные защитные механизмы встречаются крайне редко, но и тогда часто удается сгенерировать валидный номер «руками» самой защиты, если она построена по схеме if (func_generate_reg_num(user_name) == entered_reg_num) all_ok() else fuck_off();. Как нетрудно догадаться, хакер находит процедуру func_generate_reg_num (по срабатыванию точки останова на user_name) и «подсматривает» возвращаемый результат. Данная методика совершенно «прозрачна» и пробивает любые навесные упаковщики, лишний раз подтверждая известный тезис о том, что грамотно защитить программу — не грибов надербанить :).

В «тяжелых» случаях помогает слежение за данными, то есть, опять-таки — за дампом памяти. Хакер включает трассер и вникает в окно Memory, анализируя характер изменения переменных. Переменные — это ключ ко всему. Они позволяют реконструировать алгоритм даже без знания кода. Точнее, существуют методики реконструкции кода по характеру изменения переменных. На данный момент они отработаны еще не очень хорошо и практически нигде не описаны, но в хакерских кулуарах уже идут оживленные разговоры. Это перспективное направление, в соответствии с которым стоит копать.

Назад на стр. 066-008-7  Содержание  Вперед на стр. 066-008-9