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

Пример взлома: SourceFormatX

Ara (ara@clteam.net)

Спецвыпуск: Хакер, номер #057, стр. 057-052-2


Распаковка

При помощи PeiD определим, чем запакована программа. PEiD говорит, что это "PECompact 1.68 - 1.84->Jeremy Collake". Что ж, поверим. Загружаем программу в отладчик, вызвав плагин CommandLine клавишами <Alt>+<F1> или написав в командной строке команду hr esp-04 (установка hardware-прерывания), и пару раз нажимаем <F9> (Run). Остановимся прямиком на ОЕР (адрес - 00573258). Теперь можно снять дамп. Я воспользуюсь OllyDump, а ты - любым привычным тебе дампером - LordPE, PETools и т.п. Для восстановления таблицы импорта лучше всего подойдет ImpREC. Выбираем нашу программу в списке процессов, выставляем найденное ОЕР (573258-400000=173258), жмем GetImports. ImpREC определит все функции, поэтому кликаем Fix Dump и находим полученный ранее дамп. Все, программа распакована. Проверим правильность наших действий, запустив ее. Сразу видим сообщение, что программа заражена вирусом или модифицирована.

Однако несколько минут назад никакого вируса не было - наша система регулярно проверяется антивирусными средствами. Поэтому логично предположить, что таким образом программа проверяет себя на распакованность, тем самым сопротивляясь взлому. Что делать? Далее будем приводить программу в нормальный вид, устранив всяческие проверки и получив корректно работающий экземпляр.

Устранение защиты от взлома

Запускаем программу в отладчике (клавиша <F9>), и она благополучно закрывается. Причем вместе с отладчиком и безо всяких сообщений. Вывод тут один - имеет место проверка на наличие отладчика, что может осуществляться множеством разных способов. Начнем искать самые популярные: поиск окна по заданному классу с помощью FindWindows и получение хэндла процесса OpenProcess'ом. Ставим точки останова на эти функции:

bp FindWindow

bp OpenProcessA

Запускаем программулину, и нам попадется такой код:

kan1:00556144 push eax

kan1:00556145 call FindWindowA ; поиск окна

kan1:0055614A test eax, eax

kan1:0055614C jz short loc_556171 ; переход, если не найдено

kan1:0055614E lea edx, [ebp+dwProcessId]

kan1:00556151 push edx

kan1:00556152 push eax ; hWnd

kan1:00556153 call GetWindowThreadProcessId

kan1:00556158 mov eax, [ebp+dwProcessId]

kan1:0055615B push eax ; dwProcessId

kan1:0055615C push 0 ; bInheritHandle

kan1:0055615E push 1 ; dwDesiredAccess

kan1:00556160 call OpenProcess

kan1:00556165 test eax, eax

kan1:00556167 jz short loc_556171

kan1:00556169 push 0 ; uExitCode

kan1:0055616B push eax ; hProcess

kan1:0055616C call TerminateProcess

Вырезку кода я снабдил комментариями. Хотя и так понятно, что программа ищет окно с классом OLLYDBG и, если такое имеется, просто завершает процесс, то есть закрывает отладчик. Обойти это довольно просто: поменять условный переход по адресу 0055614C на безусловный (JMP), что можно сделать прямо в отладчике - двойной щелчок по нужной команде, правка команды и <ENTER>. Теперь можно сохранить сделанные изменения: выделив их, вызвать контекстное меню и выбрать пункт Copy to executable-Selection. Затем там же - Save to file.

Назад на стр. 057-052-1  Содержание  Вперед на стр. 057-052-3