Всем привет.
И так будем учиться дисассемблировать прошивку. Тут все просто не чего сложного.
Я не буду объяснять как SHX разобрать, надеюсь все знают. Единственное условие… CG0(MemoryMap) должна быть слита с прошивкой, а то не чего не выйдет, т.е. один файл д.б.
--------------------------
ссылка на программу IDA Pro Advanced https://motofan.ru/soft/?action=view&id=246&parent=5
Запускаем IDA , выбираем файл прошивки (CG1), потом выбираем Processor type – ARMB, жмем ок.
Тут ставим галки на Create RAM section и Create ROM section.
Выставляем адреса:
RAM start address - 0x03FC0000
RAM size - 0x40000
ROM start address - 0x10080000
ROM size - 0x1F80000
Loading address - 0x10080000
Остальное оставьте так как есть.
Жмем Ок, и ждем.
По хорошему теперь еще оперативку будет правильно сделать, идем в меню:
Edit>segments>create>segment
Пишем:
Segment name – любое придумайте;
Start address - 0x12000000
End address - 0x12800000
Base – 0
Теперь переходи на сегмент ROM (жмем на Клаве ”g” пишем 10080000, должны перескочить на 10080000 адрес ).
Объявляем dword (жмем Alt-D, потом на кнопку Double word).
у меня это вылезло это
ROM:10080000 DCD 0x10BCD3D0
Появилось (оранжевым цветом).
Теперь жмем "O" (Буква латинская О ), должен появиться указатель на точку входа
у меня это вылезло это
ROM:10080000 DCD byte_10BCD3D0
Встаем на этот (byte_10BCD3D0) адрес курсором и жмем на Enter или просто двойной щелчок мышкой по этому адресу, вы перепрыгнете на адрес (10BCD3D0).
И так мы сейчас на 10BCD3D0.
Теперь сморим. ARM умеет работать в 2х режимах:
ARM - режим 32хразрядных опкодов и
THUMB - режим 16тиразрядных опкодов.
Для самой иды режим задается младшим битом адреса опкода.
т.е. если адрес например был бы 10A01D18 - то это был бы опкод в режиме ARM по адресу 10A01D18
а если адрес 10A01D19 то это опкод по адресу 10A01D18 в режиме THUMB
в ARM режиме набор команд более гибкий, но в THUMB за 1 цикл выполняется 2 команды - он быстрее.
Это мне так Vilko объяснял…я конечно же не Х.. не понял, так что буду говорить своими словами.
Нам сейчас надо задать ИДЕ режим в котором мы будем работать.
Мы стоим на адресе 10BCD3D0, если мы посмотрим на этот адрес в двоичной системе исчисления, то будет видно что это 000100000101111001101001111010000, так вот если последний байт – 0, то значит режим ARM, а если 1 – THUMB.
Теперь говорим идее в каком мы режиме будем работать:
Если THUMB то надо встать на один адрес выше, т.е если стояли например на 10BCD3CF этот адрес говорит что режим THUMB, значит встаем на один адрес выше (10BCD3CE) и
жмем (Alt+G) , выбираем ”T”,а в поле Value ставим 1 (режим THUMB).
А если мы бы определили что режим ARM, то на один адрес выше вставать не надо! Просто на этом же адресе жмем (Alt+G) , выбираем ”T”,а в поле Value ставим 0 (режим ARM).
И так…фух…устал уже (
У меня получилась такая картина:
ROM:10BCD3CC DCB 0xE7; ч
ROM:10BCD3CD DCB 0xF9; •
ROM:10BCD3CE DCB 0;
ROM:10BCD3CF DCB 0;
ROM:10BCD3D0 CODE32
ROM:10BCD3D0 byte_10BCD3D0 DCB 0xE3 ; DATA XREF: ROM:10080000 o
ROM:10BCD3D1 DCB 0x21; !
ROM:10BCD3D2 DCB 0xF0; Ё
ROM:10BCD3D3 DCB 0xD1; T
У меня режим ARM !
Теперь встаем курсором на ROM:10BCD3D0 и жмем на Клаве ”c” (объявляем код). (кнопку С надо давить на адресе, около которого появилсяь надпись CODE16 или CODE32 в зависимости от режима )
Должен появиться АСМ примерно такого плана.
M:10A01DA4; ---------------------------------------------------------------------------
ROM:10A01DA4 CODE16
ROM:10A01DA4 LDR R1, =0x28880020; DATA XREF: ROM:10BCD424o
ROM:10A01DA6 LDR R0, =0x2201
ROM:10A01DA8 PUSH {R4,R5,R7,LR}
ROM:10A01DAA STMIA R1!, {R0}
ROM:10A01DAC LDR R0, =0x3011
ROM:10A01DAE MOV R5, #0
ROM:10A01DB0 STR R0, [R1]
ROM:10A01DB2 MOV R0, #3
ROM:10A01DB4 ADD R1, #4
ROM:10A01DB6 LSL R0, R0, #0x11
ROM:10A01DB8 STMIA R1!, {R0,R5}
ROM:10A01DBA MOV R0, #0
Собственно и все…дальше только остается объявлять код (вызов unk_address)…..и менять режим….режим меняется только после оператора BX.
Ссылка на литературу по ARM.
Краткий справочний по командам ARM. (Это от ARM9 в нашем ARM7 многих команд нет, учтите это)
P.S.
Задавайте вопросы, я понимаю что не чего не понятно, так что не стесняйтесь.
И так будем учиться дисассемблировать прошивку. Тут все просто не чего сложного.
Я не буду объяснять как SHX разобрать, надеюсь все знают. Единственное условие… CG0(MemoryMap) должна быть слита с прошивкой, а то не чего не выйдет, т.е. один файл д.б.
--------------------------
ссылка на программу IDA Pro Advanced https://motofan.ru/soft/?action=view&id=246&parent=5
Запускаем IDA , выбираем файл прошивки (CG1), потом выбираем Processor type – ARMB, жмем ок.
Тут ставим галки на Create RAM section и Create ROM section.
Выставляем адреса:
RAM start address - 0x03FC0000
RAM size - 0x40000
ROM start address - 0x10080000
ROM size - 0x1F80000
Loading address - 0x10080000
Остальное оставьте так как есть.
Жмем Ок, и ждем.
По хорошему теперь еще оперативку будет правильно сделать, идем в меню:
Edit>segments>create>segment
Пишем:
Segment name – любое придумайте;
Start address - 0x12000000
End address - 0x12800000
Base – 0
Теперь переходи на сегмент ROM (жмем на Клаве ”g” пишем 10080000, должны перескочить на 10080000 адрес ).
Объявляем dword (жмем Alt-D, потом на кнопку Double word).
у меня это вылезло это
Код
ROM:10080000 DCD 0x10BCD3D0
Появилось (оранжевым цветом).
Теперь жмем "O" (Буква латинская О ), должен появиться указатель на точку входа
у меня это вылезло это
Код
ROM:10080000 DCD byte_10BCD3D0
Встаем на этот (byte_10BCD3D0) адрес курсором и жмем на Enter или просто двойной щелчок мышкой по этому адресу, вы перепрыгнете на адрес (10BCD3D0).
И так мы сейчас на 10BCD3D0.
Теперь сморим. ARM умеет работать в 2х режимах:
ARM - режим 32хразрядных опкодов и
THUMB - режим 16тиразрядных опкодов.
Для самой иды режим задается младшим битом адреса опкода.
т.е. если адрес например был бы 10A01D18 - то это был бы опкод в режиме ARM по адресу 10A01D18
а если адрес 10A01D19 то это опкод по адресу 10A01D18 в режиме THUMB
в ARM режиме набор команд более гибкий, но в THUMB за 1 цикл выполняется 2 команды - он быстрее.
Это мне так Vilko объяснял…я конечно же не Х.. не понял, так что буду говорить своими словами.
Нам сейчас надо задать ИДЕ режим в котором мы будем работать.
Мы стоим на адресе 10BCD3D0, если мы посмотрим на этот адрес в двоичной системе исчисления, то будет видно что это 000100000101111001101001111010000, так вот если последний байт – 0, то значит режим ARM, а если 1 – THUMB.
Теперь говорим идее в каком мы режиме будем работать:
Если THUMB то надо встать на один адрес выше, т.е если стояли например на 10BCD3CF этот адрес говорит что режим THUMB, значит встаем на один адрес выше (10BCD3CE) и
жмем (Alt+G) , выбираем ”T”,а в поле Value ставим 1 (режим THUMB).
А если мы бы определили что режим ARM, то на один адрес выше вставать не надо! Просто на этом же адресе жмем (Alt+G) , выбираем ”T”,а в поле Value ставим 0 (режим ARM).
И так…фух…устал уже (
У меня получилась такая картина:
Код
ROM:10BCD3CC DCB 0xE7; ч
ROM:10BCD3CD DCB 0xF9; •
ROM:10BCD3CE DCB 0;
ROM:10BCD3CF DCB 0;
ROM:10BCD3D0 CODE32
ROM:10BCD3D0 byte_10BCD3D0 DCB 0xE3 ; DATA XREF: ROM:10080000 o
ROM:10BCD3D1 DCB 0x21; !
ROM:10BCD3D2 DCB 0xF0; Ё
ROM:10BCD3D3 DCB 0xD1; T
У меня режим ARM !
Теперь встаем курсором на ROM:10BCD3D0 и жмем на Клаве ”c” (объявляем код). (кнопку С надо давить на адресе, около которого появилсяь надпись CODE16 или CODE32 в зависимости от режима )
Должен появиться АСМ примерно такого плана.
Код
M:10A01DA4; ---------------------------------------------------------------------------
ROM:10A01DA4 CODE16
ROM:10A01DA4 LDR R1, =0x28880020; DATA XREF: ROM:10BCD424o
ROM:10A01DA6 LDR R0, =0x2201
ROM:10A01DA8 PUSH {R4,R5,R7,LR}
ROM:10A01DAA STMIA R1!, {R0}
ROM:10A01DAC LDR R0, =0x3011
ROM:10A01DAE MOV R5, #0
ROM:10A01DB0 STR R0, [R1]
ROM:10A01DB2 MOV R0, #3
ROM:10A01DB4 ADD R1, #4
ROM:10A01DB6 LSL R0, R0, #0x11
ROM:10A01DB8 STMIA R1!, {R0,R5}
ROM:10A01DBA MOV R0, #0
Собственно и все…дальше только остается объявлять код (вызов unk_address)…..и менять режим….режим меняется только после оператора BX.
Ссылка на литературу по ARM.
Краткий справочний по командам ARM. (Это от ARM9 в нашем ARM7 многих команд нет, учтите это)
P.S.
Задавайте вопросы, я понимаю что не чего не понятно, так что не стесняйтесь.