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

Портативный взлом

Gelios

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


Теперь также попробуем найти, где происходит вызов данной функции, для этого выделяем строчку, содержащую loc_1DDF8, и применяем поиск xref (cross reference), как было описано выше. На этот раз IDA выдала два места, которые так или иначе связаны с вызовом функции. Для начала попробуем пойти по первому обращению, находящемуся по адресу 1D9CC. И тут мы видим некую структуру, похожую на switch в С++, то есть условный переход, зависящий от значения какой-то переменной. В данном случае выясняется, что таких состояний 18, что соответствует количеству предметов в магазине игры. Из всего делаем вывод, что выбор какого-либо предмета обрабатывается отдельной функцией.

Здесь, опять же, видно, что переход к этому коду осуществляется условно где-то выше, о чем говорит пунктирная стрелка слева от надписи loc_1D9C8. Опять смотрим обращения к этому коду и находим только одно место по адресу 1D484. Вот это уже больше похоже на то, что мы ищем, а именно переход на switch в зависимости от какого-то условия с помощью условного перехода BEQ. Действительно ли это одно из условий, выводящих строку о просьбе зарегистрироваться? Чтобы проверить, открываем окно отладчика и жмем <CTRL>+<G> – появляется окно, в котором нужно указать адрес, в него мы и хотим перейти. Но тут вводится абсолютный адрес в памяти, а не смещение, поэтому первые три байта нужно посмотреть в основном окне. В данном случае это 2C0 (на разных машинах возможны разные значения), поэтому вводим 2C01D484, жмем Go To и оказываемся на том коде, что мы видели в IDA. Нажимаем правую кнопку мыши на адресе 2C01D484 и выбираем пункт Insert/Remove Breakpoint, после этого пробуем уже на самом КПК, войдя в магазин игры (shop), выбрать какой-нибудь предмет. И вот тут-то срабатывает breakpoint.

Теперь в окне регистров (его можно открыть, нажав на соответствующую кнопку на панели инструментов) смотрим значение флага Zero, который отвечает за условный переход BEQ. Здесь он равен единице, то есть переход будет осуществлен. Два раза кликнем на флаге Zero, чтобы поменять его значение на ноль, нажмем <F5> для продолжения работы программы и посмотрим результат. Отлично! Теперь вместо строки "Please register!" можно посмотреть цену предмета. Останавливаем программу в отладчике (<Shift>+<F5>). С помощью hex-редактора открываем на компьютере "подопытный" файл и переходим по адресу 1D484. Если используется hiew, то вводим ".1D484", так как это смещение не в файле, а в памяти, как уже упоминалось. По этому адресу находятся байты 4F 01 00 0A, и, чтобы убрать условный переход в этом месте, введем предыдущие четыре байта FF 30 10 E2, которые соответствуют команде "ANDS R3, R0, 0xFF".

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