Урок 1 - Взлом программы DatePlan

  1. DatePlan
  2. Осматриваемся
  3. Расчленение
  4. Дизассемблирование
  5. Исправление

DatePlan

Для начала скачайте программу DatePlan с официального сайта (1.20a) или у меня (1.19). Версия 1.20a Вам не нужна, а я буду описывать взлом 1.19, так что лучше скачайте старую.

DatePlan (автор Denis Faivr) - это замечательное дополнение к стандартному планировщику PalmPilot.

Осматриваемся

DatePlan - Shareware
Рис. 1
Запустите эмулятор, загрузите туда DatePlan, запустите DatePlan. Как Вы видите, программа встречает нас не очень дружелюбно. Мы видим предупреждение о том, что она не зарегистрирована (рис. 1). Запомните всё, что там написано, оно нам понадобится.

Большая часть программ для Пальмов практически не защищена. Не знаю, чем это можно объяснить, скорее всего, тем, что кряки и варез на этой платформе мало распространены. Встречаются, конечно, и маньяки-извращенцы, которые, написав неплохую программу, защищают её по страшному и требуют 5 баксов даже за килобайтный хак. :)

DatePlan - Registration
Рис. 2
Для того, чтобы взломать программу, нужно, во-первых, избавиться от всех nag-screen'ов, а, во-вторых, попробовать убедить программу, что введенный во время "регистрации" код правильный. Посмотрим, как обстоят дела с регистрацией...

DatePlan - Registration Failed
Рис. 3
Сначала разберёмся, куда нужно вводить регистрационный код. Ага, меню Info, пункт Register (рис. 2). Попробуем ввести какой-нибудь код. Неудача, мы не угадали (рис. 3). Но зато теперь у нас есть вся необходимая информация, чтобы взломать программу. ;-)

Мы знаем теперь, какое сообщение выводится в качестве напоминания, мы знаем также, какое сообщение выводится, если мы не угадали с кодом. Осталось разобраться в коде программы и исправить его так, чтобы убрать первое сообщение, а второе заменить на что-нибудь более веселое.

Если у вас уже готовы все инструменты, которые описывались в нулевом уроке, тогда за дело.

Расчленение

Воспользуемся сначала программкой 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
TopList

Copyright © PalmPot.
Последнее обновление 22.07.2002.