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