eXTracted INternals

eXTracted INternals
 
ФорумФорум  ЧаВоЧаВо  ПоискПоиск  РегистрацияРегистрация  ПользователиПользователи  ГруппыГруппы  Вход  

Поделиться | 
 

 Особенности реверсинга кода Motorola 68000: prc-аплеты.

Предыдущая тема Следующая тема Перейти вниз 
АвторСообщение
Hex

avatar

Количество сообщений : 397
Возраст : 35
Дата регистрации : 2006-07-12

СообщениеТема: Особенности реверсинга кода Motorola 68000: prc-аплеты.   Пт 13 Апр - 1:03

Название Prc расшифровывается как Pilot Resource. Это файлы - базы данных, используемые в Palm OS. В них могут содержаться как данные так и код. Код в них тоже может быть разный: ARM или Motorola 68000. Нас будут интересовать prc-аплеты с Motorola 68k кодом.

Формат prc файла вы можете найти тут: http://web.mit.edu/tytso/www/pilot/prc-format.html

Разбираться в нем особого смысла нет, потому что в ida уже есть загрузчик palm pilot файлов. Просто грузим файл, ставим процессорный модуль 68k и в перед.

На старте нас ждет вот такой интересный код:
Код:

code0001:00000000                link    a6,#-$C
code0001:00000004                movem.l d3-d7,-(sp)
code0001:00000008                pea    var_4(a6)
code0001:0000000C                pea    var_8(a6)
code0001:00000010                pea    var_C(a6)
code0001:00000014                systrap SysAppStartup()
code0001:00000018                lea    $C(sp),sp

команда link используется для задания значения регистра-указателя(a6) на стековый фрейм. А-ля EBP в x86. Дальше все стековые переменные адресуются относительно этого регистра. Потом в стек сохраняются значения регистров. pea - это аналог push. А вот что такое systrap? В системе palm os есть таблица системных API вызов которых делается через специальную команду trap. Номера системных трэпов можно найти в SDK в файле \include\Core\CoreTraps.h. О них IDA уже тоже знает, поэтому она именует такие вызовы systrap. В Sdk также можно найти описание параметров этих системных API. Например:
Err SysAppStartup(SysAppInfoPtr *appInfoPP, MemPtr *prevGlobalsP, MemPtr *globalsPtrP) SYS_TRAP(sysTrapSysAppStartup);

Все функции в 68k коде - cdecl. И systrap'ы тоже. Поэтому сразу после systrap SysAppStartup() видим восстановление указателя на стек.

Механизм библиотечных Trap'ов
Следующее, что может ввести в ступор это вот такие вот трэпы:
Код:

syslibtrap Custom()
или
Код:

code0001:0000504A                trap    #$F         
code0001:0000504A                dc.w    $A806

Команда trap #$F - это как раз и есть systrap, но тут IDA не знает какой трэп вызывается. Потому что здесь это вызов особых, для библиотечных. В palm os есть возможность делать shared libraries. Для этого придуман механизм библиотечных trap'ов. Детально он описан вот тут: http://www.isaac.cs.berkeley.edu/pilot/shlib.html
Я расскажу в общих чертах. Для того чтобы можно было вызывать код из другого prc файла используется набор библиотечных трэпов с номером sysLibTrapCustom (0xA805) и выше. То есть у каждой библиотеки есть набор экспортируемых функций доступ к которым делается через трэпы. У каждой библиотеки первая экспортируемая функция вызывается по trap sysLibTrapCustom, вторая - trap sysLibTrapCustom+1 и т.д. Для того чтобы можно было загружать несколько библиотек в каждый библиотечный trap первым параметром передается ссылка на библиотеку. Функция SysLoadLib() дает нам эту самую ссылку. Если вы хотите понять трэпы какой библиотеки вызываются - найдите чью ссылку передают первым параметром.
Объявления многих библиотечных трэпов можно также найти в SDK.


Регистр A5
Еще одная интересная особенность 68k prc - это работа с глобальными константами и переменными. Делается она через регистр A5. На старте программы его значение вычисляет система в функции SysAppStartup(). Узнает она его из самого prc файла. В IDA до версии 5.1 нет вычисления базового адреса A5, а начиная с IDA 5.1 благодаря товарищу igorsk эта функциональность появилась. Адресация глобальных переменных делается вычитанием. Например:
Код:

code0001:00007592                pea    -$B08(a5)     

Все глобальные константы и переменные вынесены в сегмент data0. Регистр A5 - указывает на последний из них. А чтобы доступаться к остальным приходится вычитать. В моем примере A5=B08, поэтому -$B08(a5) - это указатель на первую константу/переменную.

Big Endian в стеке
А вот такого я раньше не видел нигде. Казалось бы если процессор Big Endian, чтобы ему обратиться к нулевому байту 2-байтной стековой переменной - бери и пиши себе. А нет! Вот как оно выглядит.
Код:

code0001:00005BFA                clr.w  var_2(a6)
...
code0001:00005C2A                move.b  d3,var_2+1(a6)

Если представить это на Си (но только представить!) делается вот такой маневр:
Код:

unsigned short var_2=0;
((unsigned char *)&var_2)[1]=d3;

То есть вот так достигается big endian в памяти. НО! Если вы решите писать код для 68k на Cи. Этот код нужно декомпилировать вот так:
Код:

unsigned short var_2=0;
unsigned char d3;
var_2=d3; //Компилятор сам знает, где какой байт.

В остальном все доступно и понятно.

Информацию об ARM prc можно найти вот здесь: http://wiki.palmoid.com/?PalmNativeArmModules.
Вернуться к началу Перейти вниз
Посмотреть профиль
Hex

avatar

Количество сообщений : 397
Возраст : 35
Дата регистрации : 2006-07-12

СообщениеТема: Re: Особенности реверсинга кода Motorola 68000: prc-аплеты.   Пт 13 Апр - 1:31

Для разработки под Palm OS есть 4 варианта:
1) SDK от Palm c IDE eclipse для того чтобы его скачать надо региться на ихнем сайте. В нем идут SDK, IDE eclipse, GNU-шный компилер и различные симуляторы/эмуляторы.

2) Metrowerks Codewarrior for Palm OS его надо искать в осле, и его там предостаточно. IDE + компилер от Metrowerks, остальное такое же как в SDK от Palm.

3) Всякие там Pila Palm Pilot assembler и прочие извращения для любителей ассемблера 68к.

4) Pascal M68k и другие нестандартные языки программирования.
Вернуться к началу Перейти вниз
Посмотреть профиль
 
Особенности реверсинга кода Motorola 68000: prc-аплеты.
Предыдущая тема Следующая тема Вернуться к началу 
Страница 1 из 1

Права доступа к этому форуму:Вы не можете отвечать на сообщения
eXTracted INternals :: Cтатьи :: Mobile and Embedded-
Перейти: