Урок 5 - Взлом программы Noter

  1. Noter
  2. Взлом
  3. Важность тестирования

Noter

Noter
Рис. 1
В самом начале своей карьеры крэкера, моей целью был именно Noter (рис. 1). Эта программа является единственной в своем роде. Единственная программа, позволяющая писать и играть музыку на обычном Пилоте, без подключения его к MIDI клавиатуре и т. п. К тому же, записанная музыка может быть легко отредактирована. Конечно, вряд ли Noter может удовлетворить всем требованиям взыскательного профессионального музыканта, но для такого любителя как я, возможностей Noter'а вполне достаточно. Однако, в самом начале Noter стал моей первой неудачей. После легко взломанных Golf и DatePlan, к Noter'у я даже не знал как подступиться. Потребовалось немного набраться опыта, чтобы понять, как это сделать.

Взлом

Вначале, естественно, я сделал стандартные вещи: узнал, что окно ввода кода лежит в tFRM06a4.bin, а сообщения об удачной и неудачной регистрации в tFRM0708.bin и tFRM076c.bin, соответственно. Следующим шагом был поиск того места, где программа начинает идти по неправильному пути. Не буду перечислять всё, что я пытался сделать, попробуйте поискать сами (может быть, вам больше повезёт, чем мне), а после этого продолжайте читать дальше. Наученный опытом с MobileDB, я знал, что надо найти то место, где Noter записывает результат регистрации.

Это отняло у меня достаточно времени, но, наконец, я понял, что адрес, куда кладётся результат - это -6331(A5). Можете сами найти все места в программе, где туда что-то кладется или тестируется значение оттуда. Я долго искал ключевую позицию, поскольку ещё недостаточно хорошо понимал логику программы. В конце концов, я же не программист и не знаю ассемблера. ;-) Мне потребовалось немало поработать с debuffer'ом, ставя debugger break'и в подозрительных местах, наблюдая за тем, в каком месте Noter остановится и что из кода выполняется в этот момент. Подробно эта техника описывалась в третьем уроке. Наконец я понял, что нужная мне часть программы находится здесь:

00001cf0   487a000e                             PEA     L287
00001cf4   487a0004                             PEA     L286
00001cf8   06970000231c                         ADDI.L  #8988!$231c,(A7)
00001cfe   4e75                                 RTS
00001d00   1b40e745                     L287    MOVE.B  D0,-6331(A5)
00001d04   4a2de745                             TST.B   -6331(A5)
00001d08   671a                                 BEQ     L290
00001d0a   3f3c0708                             MOVE.W  #1800!$708,-(A7)

Noter - Registered
Рис. 2
Noter
Рис. 3
Несмотря на то, что после команды MOVE.W #1800!$708,-(A7) не было привычного TRAP, я понял, это как-то связано с удачной регистрацией. :) Проверить это было просто. По адресу 00001d08 я записал команду 4e71 (NOP) и насладился сообщением Noter'а "The application was successfully registered. Thanks!" (рис. 2). Однако, на самом деле программа была всё такой же нерегистренной, как и раньше, выводя об это сообщения (рис. 3) и отказываясь сохранять песни.

Рассмотрим поподробнее приведенный выше кусок программы. В 1d00 значение регистра DO записывается в -6331(A5), туда, где оно хранится и куда Noter будет смотреть, чтобы узнать, платил ли пользователь. :) Следующим шагом оно проверяется и, если оно равно нулю, то программа скачет на метку L290, куда нам совсем не нужно, потому что сообщение об удачной регистрации не там, а тут, почти следующей командой. Надо попробовать записать в -6331(A5), а лучше даже в D0, например, единичку. Мы помним, что для того, чтобы записать туда ноль, подходит такая команда как MOVEQ #0,D0 (7000). Это было ещё в третьем уроке. Единичка пишется почти также. Код команды будет 7001. Проблема, с которой столкнулся я, заключалась в том, что, когда я записывал двухбайтовую команду по адресу 00001d00, а после неё пустышку 4e71, они воспринимались как DC, то есть данные, а не код. И выполняться не хотели, а pilotdis мне вместо команд писал по этому адресу DC'шки. Мрачно. Немного помучавшись, я выбрал такое, не самое элегантное, но работающее решение. :)

00001d00   1b40e745			L287	MOVE.B	D0,-6331(A5)
00001d04   7001					MOVEQ	#1,D0
00001d06   1b40e745				MOVE.B	D0,-6331(A5)

Noter
Рис. 4
Раз уж это настолько принципиально, я оставляю в 00001d00 то, что и было, а вот дальше пишу то, что мне нужно. Переход BEQ L290 в 00001d08 мне не нужен и позволяет освободить ещё два байта. Так что сначала я записываю в D0 единичку, а потом повторяю копирование из D0 в -6331(A5). Это должно работать и это работает. Программа загружена в POSE и легко регистрируется. В меню About исчезла надпись unregistered и гордо красуется серийный номер "0". :)) (рис. 4)

Важность тестирования

Если вы думаете, что это всё, то нет. Noter преподал мне ещё один важный урок: взломанные программы надо как следует тестировать. Noter будет работать только до тех пор, пока из него не выйдут и не войдут заново. При следующем запуске сообщения о том, что программа не зарегистрирована (рис. 3) снова вернутся. Есть два пути борьбы: красивый и правильный. Красивый заключается в том, чтобы разобраться в том, как же всё-таки Noter хранит информацию о регистрации. А правильный в том, чтобы заставить Noter заработать нормально. :) Поскольку известно, что уже внесенные исправления позволяют работать до перезапуска, проще всего заставить Noter делать то же самое вместо вывода сообщения "Unregistered Version". Вначале надо найти, где используется ресурс tFRM08fc.bin. Таких мест три. Затем, по очереди меняя код в каждом из этих трех мест (ставя вызов дебаггера, меняя вызываемую форму или ещё как-то), нужно понять, какое из них используется (получается, что первое) и заменить лишние команды на копирование единицы в -6331(A5). Для этого нам нужно шесть байт.

00001988   4a2de745				TST.B	-6331(A5)
0000198c   6616					BNE	L251
0000198e   3f3c08fc				MOVE.W	#2300!$8fc,-(A7)

Вот в этом фрагменте нам и нужно установить нужные нам команды. Должно получиться следующее:

00001988   7001					MOVEQ	#1,D0
0000198a   1b40e745				MOVE.B	D0,-6331(A5)
0000198e   6014					BRA	L251

Вначале выполняется та же последовательность действий, которая сработала вначале (команды MOVEQ #1,D0 и MOVE.B D0,-6331(A5), а потом безусловный переход. Обратите внимание, что, поскольку наш переход находится на два байта ниже того, что был, нужно уменьшить на два смещение (с 16 до 14). Ну теперь, похоже, всё работает.

Урок 4 - MobileDB
TopList

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