#121 [22.09.08, 19:40] FAQ. Наиболее легкий способ портирования функций
Решил значит накактать FAQ по портированию функций библиотеки. как мне кажется уже проще моего - некуда. В примере будет описано портирование функции 0450: 00000000 B9616744 ; 114: int sprintf(char *buf, const char *fmt, ...); с W850 SW-R1KG001 для W580 SW-R8BE001 Что значит нам понадобится: 1) фактически единственная прога HxDen (прикрепил) (вместо нее можно использовать другие подобные проги, к примеру бинэдит. просто что в этой нет ничего лишнего). 2) Так же понадобятся уже сконвертированные прошивки w580 и w850 в формат raw. И так приступим. 1.Открываем программой HxDen обе прошивки. выбираем для начала w850. 2. теперь рассмотрим функцию "B9616744". для начала перевернем ее попарно. получаем 446761b9 . 3 теперь открываем виндовский калькулятор. вычитаем из 446761b9 - оффсет(конкретно в моем случае 44140000. чвой оффсет можно узнать с помошью программы babe2raw) получаем 5361B9 . 4.значит переходим по этому адресу(offset). и вот перед нами участок кода по этому адресу. я беру 7 байт(должно хватить)(в раззных случаях берем по-разному. иногда может хватить и 3 байт, иногда нужно больше) B4 10 B5 82 B0 04 1C 04 - вот они те самые 7 байт. 5. теперь переходим в прощивку w580. жмем Ctrl + F в открывшимся окне в поле Seath for: вводим те самые найденные "B4 10 B5 82 B0 04 1C 04" в поле Datatypes выбираем Hex-values ставим галочку на all и жмепм окей. получаем offset(в левом нижнем углу) 417079. 6.теперь снова открываем калькулятор. вводим получившееся значение "417079" и прибавляем 44140000. получаем 44557079. теперь попарно переварачиваем и получаем 79705544. вот впринципе и все.
Этот способ я считаю одним из самых простых. в место м предлагаемой мною проги HxDen можно использовать иду. Этим способом возможно получится портировать не все функции. Будут вопросы - задавайте. врятли получится портировать с одной платформы на другую. (с) zapret007 специально для сайтов mobilefree и se-team
P.S. не бросаемся сразу портировать все недастоющие функции. сначала нужно посмотреть ее описание вот к примеру функция для w580 непортированная. ;0B70: xxxxxxxx yyyyyyyy ; 2DC: void OrangeLED_Control(int _free_val, int or_LED_ID, int level, int fade_time); думаю дай-ко портану ага.. а если в название вчитаться - становится ясно, что ее в телефоне то нету нету оранжевого диода
прикрепляю программу для более быстрого переворачивания адресов и выитания\прибавления оффсета
#128 [26.06.09, 23:03] Re: FAQ. Наиболее легкий способ портирования функций
Портирование фунок с помощью плагина для 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 и переходим по этому адресу. мы должны увидеть
Если нет, то поднимаемся на один байт вверх, нажимаем С, не забыв при этом указать, что нам нужен 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. Вот мы и пришли к нашей искомой функе!
Структура немного не совпадает - это из-за разности платформ. Но для большей уверенности что мы нашли правильно, кликаем на sub_45555F34 и идём вперёд до адреса 450973CC. В прошивке от K810 делаем то же самое. Видим что по адресу 4510061C для К810 и 450973CC для W810 одинаковые функи, значит мы всё нашли правильно. Теперь остаётся записать её в либу. Берём наш адрес 45535C3C, прибавляем к нему 1 получается 45535C3D, переворачиваем 3D5C5345. получилось
Теперь устанавливаем функу в телефон и окончательно проверяем работоспособность. Напоследок могу сказать что xref-ов может быть много и не всегда так быстро можно найти что-то осмысленное, также некоторые функции могут по другому называться. Так что наберитесь терпения... Опыт приходит со временем. Надеюсь теперь запросов по портированию будет меньше. Успехов!
PS: Выражаю огромную благодарность den-po, UltraShot, Random, awg, MysticBeast и остальным за то что научили этой мудрёной науке добрыми советами и посылами в нужные темы
[ Редактировано MaxxxS в 27.6.09 02:19 ]
SE Пешиход 810 [R4EA031fix] ЭП v1.9.2 Philips W632_1228_V13_root Android 2.3.5
#130 [26.06.09, 23:52] Re: FAQ. Наиболее легкий способ портирования функций
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,=#число, то галку лучше поставить. мне же удобней видеть число
То же самое проделываем с прошивкой на которую портируем.
Напоследок могу сказать что xref-ов может быть много и не всегда так быстро можно найти что-то осмысленное,
я графический режим практически не использую. проще перейти в настройки, там на закладке cross references число отображаемых хрефов можно увеличить. ну и в дизасме по хрефам щёлкаю.
в целом одобряю, примеры это хорошо Slawwan про константы писал менее понятно (не, ну я-то понимаю )
Вы не можете начинать темы. Вы не можете редактировать свои сообщения. Вы не можете создавать опросы. Вы не можете вкладывать файлы в сообщения. Вы не можете отвечать на сообщения. Вы не можете удалять свои сообщения. Вы не можете голосовать.