[ Главная | Ресурсы | FAQ ] Уроки: [ Введение | DatePlan | SwissClock | HandMap | MobileDB | Noter | ThinkDB | HandMap33 | Lingua Franca | AlarmMaster | Race Fever | TinySheet | Strategic Commander | FlipChart ]
Вначале, естественно, я сделал стандартные вещи: узнал, что окно ввода кода лежит в 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)
Рассмотрим поподробнее приведенный выше кусок программы. В 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 преподал мне ещё один важный урок: взломанные программы надо как следует тестировать. 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 |
Copyright © PalmPot.
Последнее обновление 15.07.2000.