Портирование функций с помощью плагина для IDA page/sub find : Эльфостроение : Форум

Страница 1 из 9: [1] 2 3 4 5 ... 9 »

 zapret:
27.06.09, 00:11
 Смотрим второй пост.

 MaxxxS:
27.06.09, 00:15
 Портирование функций с помощью плагина для IDA page/sub finder.
Данный метод хорошо использовать для межплатформенного порта.

Если вы впервые пользуетесь этой программой, то необходимо скачать несколько дополнений:
- ida_babeldr от den_po (позволяет не париться с оффсетом и не надо переводить прошивку в raw) файл babeldr.ldw положить в \%ваша папка%\IDA\loaders\
- pagesub от den_po. положить в \%ваша папка%\IDA\plugins\

Итак, приступим. Открываем прошивку в IDA, в поле тип файла выбираем SonyEricsson firmware file (babeldr.ldw). В поле Processor type выбираем ARM processors:-> OK -> Yes
Hастраиваем далее: Options -> General -> IDA Options во вкладке Dissasembly в разделе Display disassembly line parts необходимо поставить галочку "Auto comments" и поставить в поле Number of opcode bytes 4. Для отображения хекс-кода в дисасме (опционально)
Далее Options -> general -> analysis -> processor specific analysis options -> disable pionter referencing, ставим туда галку, и нажимаем кнопку: Options -> general -> analysis -> reanalyze program

Теперь запускаем плагин: Edit -> Plugins -> sub/page finder
Некоторое время придётся подождать (от 5 до 10 минут, в зависимости от платформы телефона, прошивку которого вы открываете и мощности компьютера)
То же самое проделываем с прошивкой на которую портируем.

Приготовления окончены, теперь, собственно, сам процесс портирования:

Рассмотрим простенький порт функции 366: int IrDa_GetState(char *state); с K810 SW-R8BA024 на W810 SW-R4EA031.
Берём функу для K810
Патч: 
0D98: 00000000 E5693E45 ; 366: int IrDa_GetState(char *state);

переворачиваем её - должно получиться 453E69E5, В программе нажимаем G и переходим по этому адресу. мы должны увидеть
Код: 
ROM:453E69E4
ROM:453E69E4             sub_453E69E4                            ; CODE XREF: sub_44EF0884+2j
ROM:453E69E4                                                     ; sub_453E7A84+F2p
ROM:453E69E4                                                     ; DATA XREF: ...
ROM:453E69E4 00 B5                       PUSH    {LR}            ; Push registers
ROM:453E69E6 01 22                       MOVS    R2, #1          ; Rd = Op2
ROM:453E69E8 01 1C                       ADDS    R1, R0, #0      ; Rd = Op1 + Op2
ROM:453E69EA EE 20                       MOVS    R0, #0xEE       ; Rd = Op2
ROM:453E69FC 19 F5 B8 FD                 BL      sub_45100570    ; Branch with Link

Если нет, то поднимаемся на один байт вверх, нажимаем С, не забыв при этом указать, что нам нужен Thumb-режим (для этого нажимаем Alt+G и выбираем 1).
Получилась наша функа. Эти циферки мало что говорят человеку не занимающемуся программированием. Так что будем искать что-то более осмысленное.
Теперь переходим в графический режим: нажимаем на кнопку со структурой или пробел.
Наверху блок-схемы 3 кнопки: нам нужна кнопка с черными стрелочками "Jump to xref" Нажимаем её и видим окошко с 3-мя адресами. Переходим по первой строчке на адрес 44EF0884, повторяем процедуру, переходим дальше. Видим что теперь что переход осуществляется в более менее осмысленную функцию pg_ObEx_IR_AlignDevices. Если интересно, то можно нажать на кнопку ещё раз. Там будет ивент. Мы пришли к самому началу.
Теперь берём и копируем название pg_ObEx_IR_AlignDevices, переходим в окошко с прошивкой от W810, нажимаем Alt+T вставляем наш текст -> ставим галку на Find all occurences -> OK.
После продолжительного ожидания появляется окошко, где мы видим все строки, что содержат данные слова. Из них функций всего 3. Просматриваем их и видим, что больше всего похожа на функцию от K810 та, что находится по адресу 44FD373C.
Теперь смотрим куда идти дальше: в прошивке К810 нажимаем кнопки назад (Esc) вперёд (Ctrl+Enter) видим выделенную жёлтым sub_44EF0884. Она находится в третьем блоке снизу и второй вызов снизу (или говоря проще второй BL sub_xxxxxxxx). Смотрим то же место в прошивке W810. Нашли строчку
Код:
ROM:44FD3794 01 F0 14 FB                 BL      sub_44FD4DC0    ; Branch with Link
кликаем по ссылке и переходим по ней вперёд. Далее кликаем на off_44FD4DC4 и на sub_45535C3C+1.
Вот мы и пришли к нашей искомой функе!
Код: 
ROM:45535C3C             sub_45535C3C                            ; CODE XREF: sub_44FD4DC0+2j
ROM:45535C3C                                                     ; pg_IR_AutoOffTimerExpired__PAGE_EXIT_EVENT+Ep
ROM:45535C3C                                                     ; DATA XREF: ...
ROM:45535C3C 00 B5                       PUSH    {LR}            ; Push registers
ROM:45535C3E 01 22                       MOVS    R2, #1          ; Rd = Op2
ROM:45535C40 01 1C                       ADDS    R1, R0, #0      ; Rd = Op1 + Op2
ROM:45535C42 EE 20                       MOVS    R0, #0xEE       ; Rd = Op2
ROM:45535C44 20 F0 76 F9                 BL      sub_45555F34    ; Branch with Link

Структура немного не совпадает - это из-за разности платформ. Но для большей уверенности что мы нашли правильно, кликаем на sub_45555F34 и идём вперёд до адреса 450973CC. В прошивке от K810 делаем то же самое. Видим что по адресу 4510061C для К810 и 450973CC для W810 одинаковые функи, значит мы всё нашли правильно.
Теперь остаётся записать её в либу.
Берём наш адрес 45535C3C, прибавляем к нему 1 получается 45535C3D, переворачиваем 3D5C5345. получилось
Патч: 
;W810 SW-R4EA031
;(c) Hussein , IronMaster
;(p) %username%
0D98: FFFFFFFF 3D5C5345 ; 366: int IrDa_GetState(char *state);

Теперь устанавливаем функу в телефон и окончательно проверяем работоспособность.
Напоследок могу сказать что xref-ов может быть много и не всегда так быстро можно найти что-то осмысленное, также некоторые функции могут по другому называться. Так что наберитесь терпения... Опыт приходит со временем.
Надеюсь теперь запросов по портированию будет меньше. Успехов!

PS: Выражаю огромную благодарность den_po, UltraShot, Random, awg, MysticBeast и остальным за то что научили этой мудрёной науке добрыми советами ;-) и посылами в нужные темы :-)


Сообщение скопировал zapret007 из темы: FAQ. Наиболее легкий способ портирования функций

 zapret:
27.06.09, 00:15
 думаю отдельным топом будет лучше.

 InvisibleW:
27.06.09, 02:06
 а как действовать если в самом начале не все так красиво идет и ты попадаеш не на sub а на:
Код:
18 D0                       BEQ     loc_44EA4F94    ; Branch

тут надо перейти по адресу 44EA4F94? если так, то там нету таких "осмисленних" названий, поскажите что делать в таком случае? :-(

[ Редактировано InvisibleW в 27.6.09 01:07 ]

 dezertir:
27.06.09, 18:48
 Было бы хорошо сделать видео, тогда точно запросов в портирование будет минимум))
Легче было бы понять, наглядней.

 noa:
27.06.09, 20:03
 dezertir, типо читать уже очень сложно?

 dezertir:
27.06.09, 20:25
 Не сложно, но не очень понятно, по видео можно сразу же пошагово научиться, а читать придётся раз 100 т.к. сразу не понять.

 -Sanek-:
27.06.09, 22:54
 dezertir, прочитай 100 раз:-), так лучше будет,чем ты видео посмотришь)) Учиться по видео слишком низкий уровень,нужно почитать,вникнуть...

 snzuev:
27.06.09, 22:58
 Застрял на этапе- В программе нажимаем G и переходим по этому адресу. мы должны увидеть ....а вижу:
ROM:453E69F5 ?? % 1
Нажимаю Alt+G появляется segment reg volume-выбора 1 нет!Помогите!

 RaANdOoM:
28.06.09, 01:03
 snzuev,
Processor type: ARM Processor ARM710a
Это выбирал? Внимательней.
Страница 1 из 9: [1] 2 3 4 5 ... 9 »

URL этой темы:
https://mobilefree.justdanpo.ru/newbb_plus/viewtopic.php?topic_id=4083

© 2005-2018 supertrubka.org