Портирование функций с помощью плагина для 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 |