[ Главная | Ресурсы | FAQ ] Уроки: [ Введение | DatePlan | SwissClock | HandMap | MobileDB | Noter | ThinkDB | HandMap33 | Lingua Franca | AlarmMaster | Race Fever | TinySheet | Strategic Commander | FlipChart ]
Для начала скачайте программу DatePlan с официального сайта (1.20a) или у меня (1.19). Версия 1.20a Вам не нужна, а я буду описывать взлом 1.19, так что лучше скачайте старую.
DatePlan (автор Denis Faivr) - это замечательное дополнение к стандартному планировщику PalmPilot.
Большая часть программ для Пальмов практически не защищена. Не знаю, чем это можно объяснить, скорее всего, тем, что кряки и варез на этой платформе мало распространены. Встречаются, конечно, и маньяки-извращенцы, которые, написав неплохую программу, защищают её по страшному и требуют 5 баксов даже за килобайтный хак. :)
Мы знаем теперь, какое сообщение выводится в качестве напоминания, мы знаем также, какое сообщение выводится, если мы не угадали с кодом. Осталось разобраться в коде программы и исправить его так, чтобы убрать первое сообщение, а второе заменить на что-нибудь более веселое.
Если у вас уже готовы все инструменты, которые описывались в нулевом уроке, тогда за дело.
Воспользуемся сначала программкой prc2bin. Выполним как учили:
prc2bin.exe dateplan.prc
Получим кучу файлов (заголовок и бинарные ресурсы):
APPL0001.bin Talt03e8.bin Tbmp03eb.bin code0000.bin Talt03e9.bin tFRM03e8.bin code0001.bin Talt03ea.bin tFRM03e9.bin data0000.bin Talt03eb.bin tFRM03ea.bin dateplan.hdr Talt03ec.bin tFRM03eb.bin MBAR03e8.bin Talt03ed.bin tSTR03e8.bin pref0000.bin Talt03ee.bin tSTR03e9.bin rloc0000.bin Tbmp03e8.bin tSTR270f.bin tAIB03e8.bin Tbmp03e9.bin tver0001.bin tAIN0001.bin Tbmp03ea.bin
Теперь покопайтесь в этих файлах (можно просто FAR'овским просмотрщиком). Нам надо найти те диалоги, которые выводились с сообщением о неудачной регистрации и о необходимости регистрировать программу. Нашли? Правильно, Talt03ec.bin, Talt03ed.bin (то, что нам от программы нужно) и Talt03ee.bin.
Теперь приступим к дизассемблированию. Запустим дизассемблер, как учили:
pilotdis.exe dateplan.prc
Откроем в FAR'е созданный файл dateplan.prc.s. Нам нужно найти места в программе, где выводятся задолбавшие нас сообщения. В названиях бинарных файлов первые четыре символа - это тип ресурса (code, pref, Talt, Tbmp, tFRM, tSTR, tver и т.п.). Можно легко догадаться, что Talt - это alert, а tFRM - это form. Один чёрт, короче. Вот именно с этими двумя типами ресурсов мы и будем иметь обычно дело. Последние четыре символа - это идентификатор ресурса. По нему-то мы и будем искать.
Сначала найдём, где используется Talt03ec. Для этого сделаем поиск по "03ec". Ищем...
000000c0 03ec0000 DC.W #1004,#0
DC означает, что это не код, а кусок ресурса. В файл dateplan.prc.s выведен не только текст программы, но и все ресурсы, такие как формы и картинки. Вообще-то, можно этого избежать, но для этого вам придется самим разобраться с параметрами запуска pilotdis. Первая попытка мимо, так что ищем дальше.
000003ec b68a CMP.L A2,D3
CMP - это, как легко можно догадаться, инструкция сравнения. Справа видно, что сравниваются регистры процессора A2 и D3 и не наша вина, что эта команда находится по адресу 000003ec. Нам нужно, чтобы 03ec было в настоящем коде, а не в адресе. Надеюсь, это ясно?
00000c30 0c000004 CMPI.B #4,D0 00000c34 6304 BLS L98 00000c36 123c0001 MOVE.B #1,D1 00000c3a 4a01 L98 TST.B D1 00000c3c 6714 BEQ L99 00000c3e 3f3c03ec MOVE.W #1004!$3ec,-(A7) 00000c42 4e4fa192 TRAP #15,$A192 = sysTrapFrmAlert 00000c46 422efffe CLR.B -2(A6) 00000c4a 3d6effc2fffc MOVE.W -62(A6),-4(A6) 00000c50 544f ADDQ.W #2,A7 00000c52 486efff6 L99 PEA -10(A6)
Вот. Оно. MOVE.W в сочетании с TRAP - это загрузка указателя на форму и её открытие. Очень важно то, что предшествует этим инструкциям. А это TST (тестирование) и BEQ (условный переход в зависимости от результатов тестирования). На всякий случай надо проверить файл до конца, изучая все ссылки на эту форму. Сделайте это сами.
Обратите внимание на то, как записываются команды ассемблера в машинных кодах. Например, команда BEQ состоит из двух байт. Первый байт 67h - это сама команда, а 14 в данном случае - это смещение до метки, на которую нужно перейти. Посчитайте сами, 0с52-0с3c=16 (22 в десятичной системе счисления). Между прочим, для расчетов можно использовать стандартный калькулятор винюков, переведя его в scientific режим. А почему же тогда в команде записано 14, а не 16? Да потому, что там всегда пишется на 2 меньше. :)
Я надеюсь, что вам понятен алгоритм программы в этом месте. Перед L98 программа определяет, зарегистрирована ли она, а если нет, то прошло ли 30 дней и т.п. Если она решает, что денег автор всё ещё не получил, то TST.B D1 должен дать отрицательный результат и BEQ L99 не сработает. Тогда будет выведена форма и нам надо будет жать OK...
Хорошо бы поменять немного программу, так, чтобы она всегда переходила на L99, независимо от того, регистреная она или нет. Нет ничего проще, команда BRA - это безусловный переход. Ниже вы видите, что двухбайтовый код для команды - это 6000h, а смещение нужно увеличить на двойку потому, что команда наша будет на два слова выше, чем был условный переход. Теперь один тонкий момент. В самом начале дизассемблятор вывел в файл не только коды, но и массу дополнительной информации. Поэтому вместо обратного компилирования исправленного файла нам придется поступить иначе. Всё довольно просто. Мы внесем исправления ручками в оригинальный prc-файл. С помощью hex-редактора (я использую Hex-editor плагин для FAR'а) мы открывает dateplan.prc и правим четыре байта по адресу 00000c3a.
00000c3a 60000016 L98 BRA L99
Полученный файл грузим в эмулятор и проверяем. Работает! Теперь надо поменять дату, прибавив два-три месяца. Ведь никогда не знаешь, чего там автор в программе наворотил. Прибавили - всё равно работает. Вот теперь можно радоваться. Программа сломана. Программа работает!
Урок 0 - Введение | Урок 2 - SwissClock |
Copyright © PalmPot.
Последнее обновление 22.07.2002.