motofan logo
21 страниц V  1 2 3 > »         
> 

Учимся Патчить Прошивку., Дисассемблируем ARM.

Arkasha18
сообщение 24.11.2005, 21:32 Закрепленное сообщение!



****

Группа: Администраторы
Сообщений: 242
Регистрация: 27.4.2004
Из: Санкт-Петербург
Пользователь №: 2

Рейтинг: 249.5



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

Я не буду объяснять как 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.
Задавайте вопросы, я понимаю что не чего не понятно, так что не стесняйтесь.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
hobbit19
сообщение 24.11.2005, 21:38


квант истории
******

Группа: Пользователи
Сообщений: 1 043
Регистрация: 1.4.2005
Из: Рязань
Пользователь №: 39 980
Модель телефона: (M)oTorola
Прошивка: testing/unstable
Победитель конкурса 2008

Рейтинг: 739.5



Arkasha18
Выставляем адреса:
RAM start address - 0x03FC0000
RAM size - 0x40000
ROM start address - 0x10080000
ROM size - 0x1F80000
Loading address - 0x10080000

это для всех прошивок?
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Arkasha18
сообщение 24.11.2005, 21:41



****

Группа: Администраторы
Сообщений: 242
Регистрация: 27.4.2004
Из: Санкт-Петербург
Пользователь №: 2

Рейтинг: 249.5



hobbit19,
Да. т.к. начало у всех одинаковое (ROM start address - 0x10080000)
а RAM тоже
RAM start address - 0x03FC0000
RAM size - 0x40000
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Inlined
сообщение 25.11.2005, 12:30


Интересующийся
**

Группа: Пользователи
Сообщений: 91
Регистрация: 5.9.2005
Из: Санкт-Петербург
Пользователь №: 50 635
Модель телефона: E398, DEFY

Рейтинг: 73.5



Самое плохое это то, что IDA в общем-то плохо умеет сам понимать, где код, а где данные.
Даже если запускать его анализ с EntryPoint, то он подумает-подумает, и определит от силы 1-2% процента кода.

Можно схитрить, выделить часть кода через скроллинг, и нажать C (предварительно выбрав нужный режим).
Тогда он лучше автоматически анализирует, но все. Большие блоки кода он считает данными, и их приходится обрабатывать руками :-(

Второе что плохо - так это сам код прошивки. Из-за особенностей адресации ARM архитектуры, данные и код находится рядом. А иногда таблицы по вызовам процедур прямо в самом коде.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Vilko
сообщение 25.11.2005, 13:59


Мотокодер
******

Группа: Легенды MotoFan.Ru
Сообщений: 1 331
Регистрация: 23.6.2003
Из: Москва
Пользователь №: 71
Модель телефона: E398+, Е1000, ...

Рейтинг: 1116



Inlined,
никто и не обещал, что будет легко и что ида сама все сделает :)
руками придется работать ОЧЕНЬ много. и твой метод - выделить все и пометить кодом - далеко не самый лучший и правильный.
правильнее будет идти по ходу выполнения кода и там где у иды цепочка прерывается - подсказывать ей - как найти код дальше...
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Arkasha18
сообщение 25.11.2005, 14:11



****

Группа: Администраторы
Сообщений: 242
Регистрация: 27.4.2004
Из: Санкт-Петербург
Пользователь №: 2

Рейтинг: 249.5



Добавляю:
Можно так же ориентироваться на примеры по сименам, вот например
http://forum.allsiemens.com/viewtopic.php?...der=asc&start=0
или вот
http://forum.siemens-club.org/viewtopic.php?TopicID=55280
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Inlined
сообщение 25.11.2005, 16:03


Интересующийся
**

Группа: Пользователи
Сообщений: 91
Регистрация: 5.9.2005
Из: Санкт-Петербург
Пользователь №: 50 635
Модель телефона: E398, DEFY

Рейтинг: 73.5



Vilko,
Цитата
никто и не обещал, что будет легко и что ида сама все сделает
руками придется работать ОЧЕНЬ много. и твой метод - выделить все и пометить кодом - далеко не самый лучший и правильный.


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

очень хочется еще реализовать такой метод - из прошивки CG0 вытащить все 32-битные значения, находящиеся в ее диапазоне адресов и имеющие значения первых 4 бит - 01,05,09,13 (32bit-align +1)
таких чисел должно быть много, и все они `defacto' - на 95% = указатели на куски THUMB-кода (понятно, почему)
запихать их в IDA - и пусть он их анализует себе часа 2-3. тогда может что путное и выйдет

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

кроме того, я бы порекомендовал подгружать в IDA не только остальные CG-куски, а еще и обе области RAM.
в процессорную часть RAM копируется определенный код - причем для каждый прошивки разный, по разным адресам и т.п. да и в области основной RAM тоже много важных данных. эти дампы нужно предварительно снять - обязательно на той же версии прошивки.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Vilko
сообщение 25.11.2005, 16:25


Мотокодер
******

Группа: Легенды MotoFan.Ru
Сообщений: 1 331
Регистрация: 23.6.2003
Из: Москва
Пользователь №: 71
Модель телефона: E398+, Е1000, ...

Рейтинг: 1116



Цитата(Inlined @ Пятница, 25 Ноября 2005, 19:03)
это и ежу понятно, что легко не будет.
этот метод лишь грубая обработка, после которой следует метод ручной обработки. согласись, что он лучше, чем ничего. хоть какую-то часть работы он может сделать - особенно, если если выделять непомногу.

нет, этот метод скорее все-таки больше навредит, ибо таблица, обозначенная кодом или код не в том режиме только запутает.
Цитата
очень хочется еще реализовать такой метод - из прошивки CG0 вытащить все 32-битные значения, находящиеся в ее диапазоне адресов и имеющие значения первых 4 бит - 01,05,09,13  (32bit-align +1)
таких чисел должно быть много, и все они `defacto' - на 95% = указатели на куски THUMB-кода (понятно, почему)
запихать их в IDA - и пусть он их анализует себе часа 2-3. тогда может что путное и выйдет
найти такие куски можно, но вот как их засунуть в IDA я пока не знаю, с его скрипт-языков пока не разбирался.

ну тогда уж все указатели в пределах прошивки ис младшим битом=1, ибо thumb инструкции выровнены на 16 а не на 32.
но зато сами указатели(эти самые 32-битные значения) как раз будут выровненными на 32.
на самом деле подобное достаточно легко реализуется idc скриптом, но метод надо еще немного оптимизировать, например проверять наличие push в начале кода, на который идет указатель. скоро выложу подобный скрипт...

Цитата
кроме того, я бы порекомендовал подгружать в IDA не только остальные CG-куски, а еще и обе области RAM.
в процессорную часть RAM копируется определенный код - причем для каждый прошивки разный, по разным адресам и т.п. да и в области основной RAM тоже много важных данных. эти дампы нужно предварительно снять - обязательно на той же версии прошивки.
*


не, дампы снимать не самый правильный метод. точнее снять дамп "верхней RAM" - 12000000.. можно, а вот нижней - 03FC.... - большая часть затирается загрузчиком при переходе во флеш. НО! в самом начале кода легко находится процедура , всегда одинаковая, и ее таблица, которая перемещает код и данные из флешки в обе RAM, что легко повторяется скриптом IDA memcpy.idc
опять-же на днях будет скрипт, находящий процедуру и таблицы и проводящий все перемещения сам.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
hobbit19
сообщение 25.11.2005, 20:42


квант истории
******

Группа: Пользователи
Сообщений: 1 043
Регистрация: 1.4.2005
Из: Рязань
Пользователь №: 39 980
Модель телефона: (M)oTorola
Прошивка: testing/unstable
Победитель конкурса 2008

Рейтинг: 739.5



Vilko
а вобще какая достоверность кода будет после
дисассемблировании прошивки?
как ее можно повысить ( что бы потом меньше править)?
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Vilko
сообщение 26.11.2005, 8:28


Мотокодер
******

Группа: Легенды MotoFan.Ru
Сообщений: 1 331
Регистрация: 23.6.2003
Из: Москва
Пользователь №: 71
Модель телефона: E398+, Е1000, ...

Рейтинг: 1116



как и обещал - скриптик, ищущий все потенциальные указатели на thumb код и помещающий их как указатели и код, на который они указывают - как код :)
//

Код

//

#include <idc.idc>

//------------------------------------------------------------------------
static main(void) {
 auto bx_pc, ptr,from,to,size;

 from = AskAddr(here, "Please enter the start address");
 if ( from == BADADDR ) return;
 to = AskAddr(here, "Please enter the end address");
 if ( to == BADADDR ) return;

 ptr = from;
 while(ptr < to){
   bx_pc = Dword(ptr);
   if ((bx_pc > from)&&(bx_pc < to)&&((bx_pc & 1) == 1)){
     Message("Found %x\n", ptr);
     MakeDword(ptr);
     OpOff(ptr,0,0);
     SetReg(bx_pc-1,"T",1);
     MakeCode(bx_pc-1);
   }
   ptr = ptr + 4;
 }
 Message("Done\n");
}

начальный адрес задавать выровненным на 32бита!
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Учимся Патчить Прошивку., Дисассемблируем ARM. · Патчи и всё для них · Forum
 

21 страниц V  1 2 3 > » 
Ответ в темуСоздание новой темы
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 9.12.2024, 16:38

Форум живёт: