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

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

Ara (ara@clteam.net)

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


Попадаются интересные места вроде:

0051B526 PUSH 1_.0051BD04 FileName = "\\.\NTICE"

0051B52B CALL <JMP.&kernel32.CreateFileA> CreateFileA

Оказывается, программа обнаруживает не только OllyDbg, но и SoftIce. Посмотришь сам: встроено и обнаружение некоторых инструментов взломщика - DeDe, RegMonitor и т.п.

И вот, кстати, занимательное место перед бесконечным циклом:

0055F10B CALL <JMP.&kernel32.GetFileSize> GetFileSize

0055F110 CMP EAX,1242A8

0055F115 JLE SHORT 1_.0055F136

Еще одна проверка на распаковку. Запомним это.

Исправив все переходы, нужно сохранить результат исправлений. Почему-то у меня некорректно работает функция сохранения всех сделанных изменений в OllyDbg, поэтому я делаю так: перемещаю указатель на начало секции кода (обычно это адрес 401000), затем в конец секции и, удерживая клавишу <Shift>, выделяю любую строку. Выделяется весь код, и его можно сохранять так же, как мы делали ранее при одном изменении.

Однако мы еще не до конца убрали проверку на распакованность, и радоваться нам рано. При обходе бесконечного цикла, который мы проделали ранее, было замечено, что перед циклом сначала вызывались функции GetFileSize и SetFilePointer. Некоторые из них мы уже обошли. Но у нас нет возможности проанализировать код: все строки в файле зашифрованы и расшифровываются по мере необходимости. Используя дизассемблер, мы не можем точно сказать, для каких именно файлов вызываются эти функции: может вычисляться, к примеру, размер форматируемого исходника, тогда этот участок нам обходить нельзя. Чтобы не попортить нужные участки кода, будем проводить анализ динамически, то есть с помощью отладчика. Конечно, тут возможны ошибки, какие-то места мы можем и пропустить, но делать нечего. В командной строке ставим точки останова:

bp GetFileSize

bp SetFilePointer

Жмем <F9> и смотрим. В тех местах, где полученный размер будет сравниваться с константой, мы будем менять условные переходы на безусловные. Подправив все необходимые места и сохранив изменения, мы можем нормально запустить свою программу. Теперь можно заняться собственно процессом взлома - радуемся.

Устранение ограничений

Сначала проверим, как работает наша модифицированная программа. Откроем какой-нибудь исходник и попробуем отформатировать его кнопкой Format. Получаем сообщение с предложением о регистрации. Это не для нас - отказываемся и видим свой отформатированный исходник. Только форматирование у него какое-то странное: вместо красивых рядов кода лишь одна строчка с непонятными значками, крякозябрами. Откроем еще один исходник и выберем в меню File пункт Obfuskate. В итоге та же строка с крякозябрами. Теперь попробуем отформатировать сразу два открытых исходника, выбрав пункт Format All. Появляется сообщение о недоступности данной функции в незарегистрированной версии, то есть форматировать исходники совсем отказываются.

Начнем исследование с нахождения процедуры обработки нажатия кнопки Format. Ты, наверно, уже заметил, что программа написана на Delphi, а если нет, то убедись в этом с помощью PEiD. При анализе программ, написанных на Delphi, может помочь декомпилятор DeDe (полную версию можно скачать из раздела "Инструменты" сайта craclab.ru или взять с диска). Запускаем исследуемую программу, затем сам DeDe, выбираем в нем пункт "Декомпиль активный процесс", указываем нашу программу в списке процессов и жмем "Дамп". Подождем, пока декомпилятор закончит работу, и начинаем искать нужный код. Сначала посмотрим процедуры, которые находятся в TmainForm. Их там оказывается довольно много, однако среди них легко выделить одну важную - FormatBtnClick, ее название говорит само за себя. Адрес начала процедуры - 0056C15C. Теперь можно глянуть программу в отладчике: загружаем ее в OllyDbg, переходим на адрес 0056C15C, ставим прерывание (<F2>) и запускаем программу. Теперь, если мы откроем исходник и нажмем Format, то остановимся как раз на начале процедуры форматирования. Здесь видим только одну инструкцию CALL, а за ней сразу RET. Придется немного потрейсить программу.

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