FAQ. Наиболее легкий способ портирования функций : Эльфостроение : Форум

Страница 13 из 16: « 1 ... 9 10 11 12 [13] 14 15 16 »

 UltraShot:
21.06.09, 12:00
 Oganyan-Arthur, в "портировании констант" глянь=)

 zapret:
21.06.09, 13:42
 den_po, а.. ну нормально.. инструкции год уже почти, а он только прочитал=)) так держать=)

 den_po:
21.06.09, 14:17
 zapret007, ну а моему варианту почти три года. сравни их =)

 zapret:
21.06.09, 14:35
 ну да, похожи=) могу грохнуть этот=) а то надоели с вопросами=)

 Oganyan-Arthur:
21.06.09, 15:34
 zapret007,

а то с той инструкцией вопросов меньше.... Пусть уже живёт.

 zapret:
21.06.09, 15:39
 да я шутя=)

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

Если вы впервые пользуетесь этой программой, то необходимо скачать несколько дополнений:
- ida_babeldr от IronMaster 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 и остальным за то что научили этой мудрёной науке добрыми советами ;-) и посылами в нужные темы :-)

[ Редактировано MaxxxS в 27.6.09 02:19 ]

 Oganyan-Arthur:
26.06.09, 23:38
 Интересно и много фунок Ты Портанул с 2020 на 2010 ?

 den_po:
26.06.09, 23:52
 
MaxxxS пишет:
Итак, приступим. Открываем прошивку в IDA, в поле тип файла выбираем SonyEricsson firmware file (babeldr.ldw). В поле Processor type выбираем ARM processors:-> OK -> Yes
если открывать мэйн от А1, то можно вообще ничего не выбирать. для того idababeldr и делался. открываешь файл, в диалоге тупо жмёшь enter и всё.

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
теперь ида не будет скрывать хрефы.
ида и так не скрывает. если тебе удобней видеть команды вроде LDR Rx,ADDRESS вместо LDR Rx,=#число, то галку лучше поставить. мне же удобней видеть число =)

То же самое проделываем с прошивкой на которую портируем.
ты ещё забыл про константы =)
http://supertrubka.org/newbb_plus/viewtopic.php?topic_id=3171&post_id=131797#131797

Напоследок могу сказать что xref-ов может быть много и не всегда так быстро можно найти что-то осмысленное,
я графический режим практически не использую. проще перейти в настройки, там на закладке cross references число отображаемых хрефов можно увеличить. ну и в дизасме по хрефам щёлкаю.

в целом одобряю, примеры это хорошо =) Slawwan про константы писал менее понятно (не, ну я-то понимаю =) )


Добавлено 26.6.09 23:54

MaxxxS пишет:
- ida_babeldr от IronMaster

эммм... =)

 Zormax:
29.06.09, 12:16
 HxDen прикрепил к первому посту.
Страница 13 из 16: « 1 ... 9 10 11 12 [13] 14 15 16 »

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

© 2005-2018 supertrubka.org