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

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

Ara (ara@clteam.net)

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


Это производится с заходом в процедуры (клавиша <F7>) или без (<F8>). Другими словами, если мы будем трейсить по <F8>, то выполнится вся процедура, в том числе вложенные, что не позволит посмотреть выполнение кода. Поэтому заходим в процедуру по <F7>, а дальше уже обходим все процедуры по <F8>. Чтобы не терять времени, я сначала прогнал все процедуры без захода в них и нашел ту, которая вызывает сообщение с предложением зарегистрироваться. Чуть выше по коду стоит условный переход, который обходит эту процедуру в зарегистрированной версии. Меняем его на безусловный.

По ходу можно отметить, что программа ищет занятный файл License.dat. Думаю, не надо объяснять, зачем он нужен. Для эксперимента я создал пустой файл с таким именем в каталоге программы, в итоге надпись "Unregistered user" в About пропала. Больше ничего интересного при первом просмотре не попалось.

Ну что же? Если мы точно уверены, что все дело в том, что программа распакована, что именно из-за этого исходник не хочет нормально форматироваться, поищем по-другому. Все проверки типа SetFilePointer и GetFileSize мы уже устранили ранее. Теперь я решил посмотреть вызовы функции ReadFile (чтение из файла). Перезапускаем программу в отладчике, прописываем в командной строке bp ReadFile и снова пытаемся отформатировать злосчастный исходник. Всякий раз брякаясь, будем смотреть стек (правая нижняя секция отладчика). Как известно, параметры при вызове процедур обычно передаются именно через стек. Нас интересует хэндл открытого файла и буфер, куда будут занесены считанные байты.

Нажимаем кнопку "H" на панели инструментов отладчика и смотрим, какой хэндл соответствует открытому файлу нашей программы. Далее ждем момента, когда программа брякнется и в стеке будет лежать именно это подсмотренное значение. Другие файлы нас не интересуют, поэтому на остальных всплытиях отладчика жмем <F9>.

Наконец, программа останавливается и в стеке лежит нужное значение. В коде рядом при этом читается 360 байт из нашего файла. Находим параметр Buffer, кликаем по нему правой кнопкой мыши и выбираем из появившегося контекстного меню пункт Follow in Dump. В окне, где отображается дамп памяти (правое нижнее) видим, что находится в данный момент в памяти, начиная с адреса параметра. Немного прогнав код, проследим, как заполнятся ячейки считанными из файла байтами. Отметим, что считался заголовок нашего файла - в памяти ясно видны имена секций. Похоже, это очередная уловка разработчиков - подсчитать контрольную сумму заголовка, так как при распаковке изменения в нем неизбежны. Чтобы отловить момент вычисления этой контрольной суммы, поставим точку останова на обращение к памяти, для чего выделим несколько первых байт памяти, вызовем контекстное меню и выберем пункт Breakpoint. Теперь можно продолжить выполнение программы (<F9>). Оно остановится как раз на месте, где и происходит искомая нами калькуляция.

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