eXTracted INternals

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

Поделиться | 
 

 Процессорный модуль Motorola M-Core для IDA Pro

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



Количество сообщений : 25
Дата регистрации : 2006-09-18

СообщениеТема: Процессорный модуль Motorola M-Core для IDA Pro   Пт 3 Ноя - 8:57

Около года назад мне необходимо было дизассемблировать код для семейства процессоров M-Core от Motorola. На тот момент необходимого модуля в IDA Pro не было. Ситуация не изменилась и сейчас. Именно по этой причине сам модуль можно найти здесь:

http://extint.narod.ru/Files/mcore.zip - для IDA Pro 4.8

Использование:
Распаковать содержимое в подпапку IDA\procs.
При загрузке нового файла в списке процессорных модулей должно появиться "Motorola:M*Core".

Поскольку задача уже имеет некий срок давности, то это уже вторая версия модуля. В первой версии уже было распознавание ф-й, также как и создание стековых фреймов. Делалось это все собственными алгоритмами и позже доказало, что использование того, что предлагает IDA гораздо эффективнее, как по быстродействию, так и по устойчивости к новым багам.

В этой версии уже много чего было переделано, ровно как и добавлено нового. И также по этой причине появились т.н.

Release notes:

03.11.2006
- Reimplemented functions detection
Previous version contained own too complex template algorithms for functions detection.
Current version uses native methods of functions detection, which IDA proposes.
It was found that these methods increased productivity a lot.

- Improved stack tracing and stack frame detection
The algorithm of stack frame creation relies on a fact that at least a link register must be saved into stack.
Thus there must be something like
Код:

...
subi sp, value      ; // First stack has to be allocated for registers
...                                                                 
stm r...-r15, (sp)  ; // There must be a reservation of the link register.
                            ; // For an instance, stm stores only into stack and           
                            ; // doesn't contain any sp modification effects

- Improved stack points and stack variables creation
Thanks to stack tracing now the complex ways of stack allocations are detected as well.
And any stack point changes in such cases are detected too.
A few such stack allocations:
Код:

subi    sp, 0x20
movi    r1, 0x39
stm    r8 - r15, (sp)
lsli    r1, 3
subu    sp, r1  ; // (! Allocation via left shifted register value)

Код:
 
subi    sp, 0x20
stm    r8 - r15, (sp)
bgeni  r1, 8
subu    sp, r1 ; // (! Allocation via bgeni register value)

Код:
 
bmaski  r1, 0xA
subi    sp, 0x20
subi    r1, 0xF
stm    r9 - r15, (sp)
subu    sp, r1 ; // (! Allocation via complex calculated register value)


Код:

subi    sp, 0x20
lrw    r1, 0x668
stm    r8 - r15, (sp)
subu    sp, r1 ; // (! Allocation via loaded register value)
Stack variables are detected and created on any appeal to SP register.

- Added switch instructions detection
Algorithm looks for the following group of instructions, which are treated as switch
Код:

lrw rx, [JumpTable]
ixw rx, ry
ld  rx, (rx)
jmp rx
It works only with functions. It is done for an easy, precise detection of the cases of the switch.
I.e. if the element of a jump table points on the some address within a current function with switch, in that case
this element definitely belongs to the function's switch jump table.

- Added convinient macro commands
All macro instructions are displayed with caps.
They are applied to the following group of original M-Core instructions.

- bmaski r, v becomes MOVI r, mv

where mv = (1 << v) - 1

- bmaski r, v1
bseti r, v2
become MOVI r, mv

where mv = ((1 << v1) - 1) | (1 << v2)

- bmaski r, v1
bclri r, v2
become MOVI r, mv

where mv = ((1 << v1) - 1) & (~(1 << v2))

- bmaski r, v1
addi r, v2
become MOVI r, mv

where mv = ((1 << v1) - 1) + v2

- bmaski r, v1
subi r, v2
become MOVI r, mv

where mv = ((1 << v1) - 1) - v2

- bmaski r, v1
{lsli | rotli} r, v2
become MOVI r, mv

where mv = ((1 << v1) - 1) << v2

- bmaski r, v1
{lsri | asri} r, v2
become MOVI r, mv

where mv = ((1 << v1) - 1) >> v2

- bgeni r, v becomes MOVI r, 1 << v

- bgeni r, v1
bseti r, v2
become MOVI r, mv

where mv = (1 << v1) | (1 << v2)

- bgeni r, v1
bclri r, v2
become MOVI r, mv

where mv = (1 << v1) & (~(1 << v2))

- bgeni r, v1
addi r, v2
become MOVI r, mv

where mv = (1 << v1) + v2

- bgeni r, v1
subi r, v2
become MOVI r, mv

where mv = (1 << v1) - v2

- bgeni r, v1
{lsli | rotli} r, v2
become MOVI r, mv

where mv = (1 << v1) << v2

- bgeni r, v1
{lsri | asri} r, v2
become MOVI r, mv

where mv = (1 << v1) >> v2

- movi r, v1
bseti r, v2
become MOVI r, mv

where mv = v1 | (1 << v2)

- movi r, v1
bclri r, v2
become MOVI r, mv

where mv = v1 & (~(1 << v2))

- movi r, v1
addi r, v2
become MOVI r, mv

where mv = v1 + v2

- movi r, v1
subi r, v2
become MOVI r, mv

where mv = v1 - v2

- movi r, v1
{lsli | rotli} r, v2
become MOVI r, mv

where mv = v1 << v2

- movi r, v1
{lsri | asri} r, v2
become MOVI r, mv

where mv = v1 >> v2

- bseti r, v becomes ORI r, mv

where mv = 1 << v

- bseti r, v1
bseti r, v2
become ORI r, mv

where mv = (1 << v1) | (1 << v2)

- bclri r, v becomes ANDI r, mv

where mv = ~(1 << v)

- bclri r, v1
bclri r, v2
become ANDI r, mv

where mv = ~((1 << v1) | (1 << v2))

Check this list also in a processor specific option's help.

- Added IDP options:
- Added using macro command option
Вернуться к началу Перейти вниз
Посмотреть профиль
erithion



Количество сообщений : 25
Дата регистрации : 2006-09-18

СообщениеТема: Апдейт   Пн 13 Ноя - 6:11

Лежит там же:
http://extint.narod.ru/Files/mcore.zip - для IDA Pro 4.8

09.11.2006
- Fixed bug with combining two instructions into a single MACRO command if there was an external reference between them. For an instance the following instruction will not be converted into a macro command
Код:

    movi rx, ...
locxxx:
    addi rx, ...
- Fixed code flow bug.
MACRO commands and switch support led to accidental violations of the ordinal code flow. It often could be seen when a part of a local literal pool with data within a procedure was converted into the code.
- Improved memory-referenced operand output:
1. Function calls are always printed as direct memory reference
Код:

jsri subXXX
2. Referenced memory operands output depend on its type in the literal pool, i.e.
- if the literal pool contained
Код:

offXXX      0xXXXX
then load instruction would look like
Код:

lrw rN, 0xXXXX
- if the literal pool contained
Код:

offXXX      offYYYY
then load instruction would look like
Код:

lrw rN, offYYYY

Known issues:
- Switch is not detected when its cases ain't within the fuction borders.
It happens when if jmpi instruction was met during the analysis of the function. JMPI is not treated as an ordinal code flow instruction. Thus, for an instance, if there was jmpi on a default case at the end of the function, this code at the end would not be treated as a part of the current function. And the borders of the function would not include switch cases.
Вернуться к началу Перейти вниз
Посмотреть профиль
erithion



Количество сообщений : 25
Дата регистрации : 2006-09-18

СообщениеТема: Re: Процессорный модуль Motorola M-Core для IDA Pro   Вт 21 Ноя - 11:48

http://extint.narod.ru/Files/mcore.zip - для IDA Pro 4.8


21.11.2006
- Minor fix for relative adressing mode of load/store instructions.
The previous representation
{ld|st}.{b|h|w} rn, (rm)
was replaced with a new one
{ld|st}.{b|h|w} rn, (rm, 0)
It was done in order to allow applying of the structure types
- Improved function detection.
Functions, which are referenced via JMPI instruction, are detected too.
It happens if the referenced via JMPI code contains such called stack prolog:
subi sp, XXX
stm/st.w {reg list}/reg, (sp)
- Improved switch recognition.
It is a fix of a previously known issue. When the switch was not detected
if its default case was referenced via JMPI
- Type info support is implemented.
There was implemented a function parameter tracing if have declared a function signature

Known issues:
Typeinfo was implemented only for the register parameters. M-Core specification declares them to be
r2 - r7. Parameter tracing doesn't include stack parameters.
Вернуться к началу Перейти вниз
Посмотреть профиль
erithion



Количество сообщений : 25
Дата регистрации : 2006-09-18

СообщениеТема: Re: Процессорный модуль Motorola M-Core для IDA Pro   Пн 7 Май - 4:16

То же самое, но для IDA Pro 5.0

http://extint.narod.ru/Files/mcore_50/mcore.zip
Вернуться к началу Перейти вниз
Посмотреть профиль
erithion



Количество сообщений : 25
Дата регистрации : 2006-09-18

СообщениеТема: Re: Процессорный модуль Motorola M-Core для IDA Pro   Чт 6 Дек - 11:47

erithion пишет:
То же самое, но для IDA Pro 5.0

http://extint.narod.ru/Files/mcore_50/mcore.zip


Оригинально сорцы были открыты. Их можно взять у хекса или у меня.
Сам давно уже разработкой не занимаюсь, поэтому исходники здесь 4.8
5.0
Единственная просьба для будущих поколений: если нет каких либо принципиальных препятствий - выкладывайте измененные сорцы с комментами. Детали изменений можно постить сюда же. А за логином/паролем на фтп можно к хексу.

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




СообщениеТема: Re: Процессорный модуль Motorola M-Core для IDA Pro   

Вернуться к началу Перейти вниз
 
Процессорный модуль Motorola M-Core для IDA Pro
Предыдущая тема Следующая тема Вернуться к началу 
Страница 1 из 1

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