FAQ

  1. Не понятно как из отредактированного ассемблерного файла получить prc. Чем надо пользоваться?
  2. А как править эту строку, что собственно и куда вводить? Короче говоря, я не знаком с Hex.
  3. Встречяются проги, состоящие только из ресурсов - их не сломать, так ли это?
  4. Не могли бы вы пояснить ваши действия в уроке 1, где нужно исправлять байты в программе. Я не понял расчета и строку 00000c3a 60000016 L98 BRA L99
  5. К сожалению, не совсем понятно каким образом вставить команду на вызов debuffer'а.

1. Не понятно как из отредактированного ассемблерного файла получить prc. Чем надо пользоваться?

Изначально в первом уроке об этом было написано слишком кратко и догадаться было сложно. Сейчас я его дополнил и можете просто посмотреть исправленную версию. А суть в следующем - разобравшись, какие изменения нужно сделать, мы открываем оригинальный prc-файл в hex-редакторе и правим именно его. Обычно это лишь несколько байт, так что проблем быть не должно. При желании можно использовать один из многочисленных универсальных патчеров.

2. А как править эту строку, что собственно и куда вводить? Короче говоря, я не знаком с Hex.

Без проблем.

В dateplan.prc.s команд по адресу C3A (и C3C за ней) сейчас выглядит вот так:

00000c3a   4a01                         L98     TST.B   D1
00000c3c   6714                                 BEQ     L99
Должна выглядеть так:
00000c3a   60000016                     L98     BRA     L99

Второй столбик (где 4a01 и 6714) - это команды процессора. Каждые два символа вместе образуют один байт, записанный в 16-ричной системе (hex). Числа от 0 до 255 в hex будут записаны так: 00, 01, 02, ... 08, 09, 0A, 0B, 0C, 0D, 0E, 0F, 10, 11, 12, ... 19, 1A, 1B, 1C, ... EF, F0, F1, F2, ... FE, FF.

prc файл фактически состоит из этих команд процессора (а также заголовков, ресурсов и т.п., но та часть, которую нам нужно менять, это только команды процессора). Если в нем где-то идут четыре байта 4A016714, то дизассемблер их расшифровывает и записывает более понятным образом (см. выше). Так что если мы хотим заменить 4a01 и 6714 на 60000016, то надо заменить в prc файле кусок 4a016714 на 60000016. Открыли hex редактор. Пришли на C3a, так что у нас сверху этот адрес показан (00000C3A/000045AE). Курсор наш стоит на 4A, выглядит это так:

3C 00 01 0C 40 00
02 1D 42 FF FE 52
01 4A 01 67 14 3F       4A 01 67 14 - это наш фрагмент, который
FE 3D 6E FF C2 FF                     нужно заменить
FA 58 4F 48 6E FF

Прямо поверх этих чисел набирай 60 00 00 16. Будет вот так:

3C 00 01 0C 40 00
02 1D 42 FF FE 52
01 60 00 00 16 3F
FE 3D 6E FF C2 FF
FA 58 4F 48 6E FF

Потом выходи и сохраняй изменения. Все. Готово.

3. Встречяются проги, состоящие только из ресурсов - их не сломать, так ли это?

Нифига не получается - когда запускаю "pilotdis.exe myroots.prc", то полученный файл не содержит комманд, а все строки (asm) начинаются на DC.W и DC.B.

Бывает, что дизассемблер не может правильно определить, где начинается код. В этом случае надо взять ресурсы code????.bin и дизассемблировать их. Найти в них нужные проверки и все сделать.

Обратно можно либо с помощью PalmRI вставить ресурс, либо просто запомнить, в каком месте байтики менять нужно (и какие именно) и ручками в hex-editor'е поправить в исходном prc.

Адрес для изменений можно посчитать (или просто взять кусок в ~5 байт из того места, куда вносятся изменения, и сделать поиск по ним в hex-редакторе, чтобы найти, где нужно менять).

В принципе, дизассембляция всего файла целиком делается только для простоты - адрес в листинге совпадает с реальным адресом. Почему иногда команды не видны? Не знаю. Скорее всего, это некий глюк дизассемблера...

4. Не могли бы вы пояснить ваши действия в уроке 1, где нужно исправлять байты в программе. Я не понял расчета и строку 00000c3a 60000016 L98 BRA L99

Не очень ясно, что именно непонятно, но попробую. Вначале у нас есть 4 слова, занятые двумя командами, каждая длиной по два слова.

00000c3a   4a01    L98      TST.B   D1
00000c3c   6714             BEQ     L99

Первая команда - это тестирование регистра процессора. Вторая - условный переход. Неважно, что именно тестирует первая, главное, что возможны два результата: хороший (программа зарегистрирована) и плохой (не зарегистрирована). В зависимости от результата (который с помощью битовых флагов пишется еще в какой-то регистр, если я правильно помню. Но это для нас сейчас неважно) вторая команда либо ничего не делает (тогда будет выводиться на экран "Please register!"), либо выводит нас из этого опасного места и переводит на метку L99.

Теперь мы хотим заменить условный переход на безусловный, чтобы мы всегда шли на L99. Команда безусловного перехода занимает больше места, чем BEQ (4 слова вместо 2-х). Поэтому мы пожертвует TST.B, который нам все равно уже не нужен. Дальше. Метки типа L99 даны лишь для удобства. Они рассчитываются дизассемблером при дизасембляции. Реально, куда переходить, процессор определяет по смещению во втором слове команды (14 в 6714). Число, ясное дело, в 16-ричной системе счисления (14h, hex). Смещение считается от начала команды перехода до начала метки и уменьшается на 2. Разница 0с52-0с3c равна 16h. Минус 2 будет 14h. Поэтому в команде 6714 и было 14h. Наша новая команда BRA будет идти на 2 слова (4 байта) ниже (у меня на страничке была опечатка, уже исправил), чем BEQ. Поэтому смещение нужно увеличить на 2 - новая разность 0с52-0с3a будет 18h, и уменьшаем на 2. Итого 16h. Записываем новую команду, получаем 60000016. Все, осталось это исправить в бинарнике PRC с помощью hex-редактора.

5. К сожалению, не совсем понятно каким образом вставить команду на вызов debuffer'а.

Ну, во-первых, вызов дебаггера - это прерывание (номер не помню, можно посмотреть в листинге дизассемблера, если его натравить на файл с вставленным вызовом), двухбайтовый код которого - 4e48. Вставить его можно вместо любой команды. Когда процессор встречает эту команду, то он пытается вызвать дебаггер разными способами. Если это произошло на реальном устройстве, то смотрит, не присобачен ли компьютер через порт, если на эмуляторе, то пытается обратиться к резидентному дебаггеру (debuffer).

Команда вставляется так. Пусть есть кусок кода.

0000b142   2f0a        MOVE.L     A2,-(A7)
0000b144   4ebafc14    JSR        L1736
0000b148   222efffc    MOVE.L     -4(A6),D1
0000b14c   b380        EOR.L      D1,D0
0000b14e   2b40fc5c    MOVE.L     D0,-932(A5)
0000b152   4aadfc5c    TST.L      -932(A5)
0000b156   504f        ADDQ.W     #8,A7
0000b158   670c        BEQ        L1768

Ее можно записать вместо любой команды. К примеру, по адресу 0000b14c. Тогда код программы превратится в

0000b142   2f0a        MOVE.L     A2,-(A7)
0000b144   4ebafc14    JSR        L1736
0000b148   222efffc    MOVE.L     -4(A6),D1
0000b14c   4e48        <что будет тут написано, я не помню наизусть>
0000b14e   2b40fc5c    MOVE.L     D0,-932(A5)
0000b152   4aadfc5c    TST.L      -932(A5)
0000b156   504f        ADDQ.W     #8,A7
0000b158   670c        BEQ        L1768

Понятно, что патчить prc-файл так же, как и в остальных случаях - в hex-редакторе.

Теперь процессор выполнить команду 0000b148, а потом остановится и громко спросит, есть ли здесь дебаггер. Если debuffer уже запущен и его консольное окошко открыто, то он отзовется и выдаст строку приглашения. Как с ним работать - см. либо третий урок (сверхкратко), либо его help.

Вообще, у debuffer'а есть гораздо большее количество использований, описаны самые основные. Сам я его использую не очень часто, только когда листинга недостаточно, чтобы понять, что происходит.

TopList

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