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

Учимся портировать патчи! Уроки! Обсуждаем!, На основе IDA PRO

GALL
сообщение 10.7.2007, 15:59


Гуру
******

Группа: Почётные мотофаны
Сообщений: 706
Регистрация: 25.12.2004
Из: Барнаул
Пользователь №: 29 674
Модель телефона: Iphone 4s
Прошивка: IOS 7.1.1
Победитель конкурса 2008

Рейтинг: 274



Урок 1. Понятия и инструментарий.

Определимся вначале по предмету наших занятий. Мы не будем учиться писать патчи – заплатки на прошивки. Пусть этим занимаются люди, имеющие специальные знания по архитектуре прошивки в целом и способам доступа к требуемым функциям прошивки. В последнее время появляется всё больше и больше новых телефонов и ,соответственно, прошивок для них. Патчеры просто не в состоянии писать одновременно для всех свои разработки. Целью уроков является привлечение максимально широкого круга новичков, желающих перенести полезные функции патчей на свои прошивки. Надеюсь, что эти уроки заинтересуют и бывалых мастеров патчестроения в русле просвещения начинающих. Сам я не отношу себя к патчерам – я всего лишь пытаюсь перенести полезные функции на ту прошивку, которую я выбрал для себя. Я уверен, что многие мои выкладки будут оказаться наивными и вычурными для настоящих патчеров. Я знаю об этом, но с чего-то должно всё начаться. Сами патчеры не спешат делиться с нами, обычными пользователями, жаждущими творчества, своими секретами поиска и исправления функций прошивок. Не знаю почему, будем считать, что в этом виновата нехватка времени у патчеров =). Сам я пришел к первому успешному порту серьезных патчей, наступив предварительно лес граблей.
Поговорим о методах портирования патчей. Само портирование подразумевает перенос в нужные места искомой прошивки измененных определенным образом кодовых последовательностей. На начальном этапе нам даны некие кодовые последовательности и адреса их нахождения в прошивке-источнике. Конечная цель – найти правильным образом адреса переносимого кода, а также адаптировать его к логике работы нашей прошивки-приемника. Способ портирования сильно зависит от функции самого патча. На нашем форуме уже рассматривался один метод портирования кодовых последовательностей – паттерн – с помощью поиска 16-ричных схожих значений в Hex-редакторе (программа для просмотра и редактирования любого файла в виде 16-ричных байтовых последовательностей). Как показала практика¸ портирование методом поиска подходит для портирования очень незатейливых патчей, где изменению подвергаются либо какие-то уникальные константы, либо замена коротких переходов, либо отмена каких-либо действий (расстановка NOP-команд – отсутствие операции). Для портирования более сложных патчей, содержащих различные переходы к подпрограммам, обращения к массивам и т.д., требуется прибегать к ДИЗАССЕМБЛИРОВАНИЮ.
Что же такое дизассемблирование? Это процесс получения некоего кода функций и логики управления нашей прошивки на языке мнемоник АССЕМБЛЕР. Этот язык наиболее приближен к машинному языку центрального процессора. В телефонах Motorola используется, т.н. ARM-архитектура процессора. Очень настоятельно рекомендую новичкам накачать себе литературы по ARM-архитектуре для изучения хотя бы основных команд ARM- и THUMB-процессов, способов адресации и доступа к данным. В процессе изучения портирования, конечно же будем останавливаться на основных командах, которые необходимо знать, чтобы правильно перенести логику патча на другую прошивку.
Каким же образом будем переводить набор байтов в стройный ряд понятных мнемонических команд “асмы”?  А мы будем использовать отличную разработку для дизассемблирования – IDA PRO. Поработав с ней, понимаешь чуть позже, как нетрудно заниматься портированием сложного патча. Вся логика кода максимально разжевана для конечного пользователя. Занятия я буду проводить на примере версии 4.9, хотя уже появилась версия 5.0. Ничего страшного – все основные операции портирования подойдут для любой версии.
Что же ещё потребуется для работы? Составим для себя набор инструментов.
1. Binedit – маленький и простой редактор, компилятор, отладчик и прочая и прочая….=) Но я всё ж таки выбрал ИДУ для дизассемблирования! Я лично не смог адаптироваться к интерфейсу binedit, как не старался. В binedit я использую КАЛЬКУЛЯТОР КОДА
2. Стандартный калькулятор Windows, переведенный в режим операций с шестнадцатиричными числами. Устанавливаем в ВИД “Инженерный” и радиокнопку на Hex. Потребуется для вычислений адресов,значений¸смещений в Hex-формате.
3. WinHex в качестве Hex редактора. Нужен для поисков последовательностей. Показывает количество найденных значений. Может где-то и есть этот функционал в ИДЕ или BinEdit? Но я не нашел и прошу простить тупого учителя за это =)
Этот весь инструмент, которого достаточно для решения наших задач. На следующем уроке подробно изучим процесс дизассемблирования прошивки.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Cot
сообщение 10.7.2007, 16:26


Опытный
***

Группа: Пользователи
Сообщений: 118
Регистрация: 16.12.2006
Из: Украина , Запорожье
Пользователь №: 111 602
Модель телефона: RAZR V3x
Прошивка: E5P Ultimate

Рейтинг: 30



thumbsup.gif Просто класс!
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Neomoto
сообщение 10.7.2007, 17:01


Ветеран
*****

Группа: Разработчики
Сообщений: 615
Регистрация: 2.3.2006
Из: Белгород
Пользователь №: 72 604
Модель телефона: MotoZINE ZN5
Прошивка: sym X beta

Рейтинг: 481



Наконец кто-то все-таки начал рассказывать про тайную науку портирования патчей!
Все ставим плюсы щедрою рукой smile.gif.
GALL, и неплохо бы снабжать ссылками на все упоминаемые проги и т.п., найти пару ссылок на литературу по ARM, ассемберу и руководство по IDA (если оно существует, я не знаю).

Сообщение отредактировал Neomoto - 10.7.2007, 17:11
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
GALL
сообщение 10.7.2007, 17:19


Гуру
******

Группа: Почётные мотофаны
Сообщений: 706
Регистрация: 25.12.2004
Из: Барнаул
Пользователь №: 29 674
Модель телефона: Iphone 4s
Прошивка: IOS 7.1.1
Победитель конкурса 2008

Рейтинг: 274



Урок2. Дизассемблирование.

Пожалуй начнем ковырять прошивку. Используем полезную информацию из раздела “Учимся Дизассемблировать прошивку”.
Первым делом нам надо получить кодовую группу CG1 из самого файла прошивки. Для разложения файла прошивки по кодовым группам используем замечательную программу Flash@Backup 3. Устанавливаем в Активном профиле свою модель телефона, заходим в раздел “Обработка прошивок” и Выбираем файл. После обработки файла в таблице слева появится расшифровка кодовых групп по начальным и конечным адресам. Запоминаем диапазон адресов для CG1 в Hex-формате Далее сохраняем с расширением SMG. По умолчанию кодовые группы сохранятся в папку программы \Random's Developments\Flash&Backup 3\Backups. Из нашего последнего Backups извлекаем CG1. С ним и будем работать!
Итак, запускаем IDA pro и открываем сам файл *.smg: File-Open….-тип файлов: All files (*.*) – выбираем наш ****.smg. После этого появляется окошко, в котором надо указать тип процессора – Processor type. Наш выбор – ARM processors: ARMB – почти в самом верху списка. Жмём ОК и мподтверждаем изменение типа процессора. Следующее окно – “Disassembly memory organization”. Здесь-то нам и пригодятся значения диапазона адресов CG1. Заполняем значения:
RAM:
[V] Create RAM Section
RAM Start Adress – 0x03FC0000
RAM Size - 0x40000

ROM:
[V] Create ROM section
ROM start address – начальный адрес CG1
ROM size – ИДА вычисляет сама

Input file
Loading address – начальный адрес CG1

Остальные позиции оставляем в покое и жмем ОК… Идет процесс загрузки файла в базу..Далее нас IDA предупреждает о наличии двух форматов кода: ARM и THUMB и сама предлагает нам способ определения места нахождения кода. Но мы-то не её советами будем пользоваться! ….Жмем 2 раза ОК и ожидаем загрузки списка строк всей прошивки. Что видем перед собой? А мы видем пока ещё нераспознанный закомпилированный код прошивки в виде зеленой полосы на экране. Пора запускать скрипт распознавания ARM и THUMB команд, т.е. собственно сам процесс дизассемблирования. Воспользуемся файлом скрипта THUMB Big Endian.idc из нижнего закрепления. Заходим в меню: File-IDC file и выбираем наш скриптик. Скрипт попросит ввести начальный адрес CG1. вводим в формате: ROM: нач. адрес CG1. Потом конечный адрес CG1: ROM: кон. Адрес CG1. После этого можно заниматься другими делами и не подходить к компьютеру: процесс дизассемблирования длительный, в несколько проходов – вначале идет распознавание кода (бордовые полоски), потом идет инициализация процедур (синие полоски). Потом ещё проход. Окончание процесса полного дизассемблирования можно заметить по слову “idle” в нижнем левом углу вместо мельтешащих значений адресов. После окончания процесса дизассемблирования сохраняем нашу базу дизасма. Урок второй закончен – мы должны научиться получать на выходе рабочую базу дизассемблированной прошивки. На следующем уроке будем готовить инструментарий к работе по портированию патчей и искать смещения для патч-кодов!

Добавлено позже (10.7.2007, 17:23):
Neomoto, Вот домашним заданием и будет поиск рабочих ссылок на необходимый инструментарий и полезную литературу! smile.gif
Прикрепленный файл THUMB_Big_Endian.rar   ( 438 байт ) Кол-во скачиваний: 737
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Neomoto
сообщение 10.7.2007, 17:43


Ветеран
*****

Группа: Разработчики
Сообщений: 615
Регистрация: 2.3.2006
Из: Белгород
Пользователь №: 72 604
Модель телефона: MotoZINE ZN5
Прошивка: sym X beta

Рейтинг: 481



Ну что ж, вот что нашел. Что еще найду, буду сюда дописывать.
Это про не ассемблер для АРМ, а для х86, но написано очень понятно и поможет в учебе.
онлайн версия
Assembler.chm - скачать в формате .chm - 140 Kb
еще один учебник по обычному ассеблеру - весит ок. 9 метров.
IDA Pro - IDA Pro 5.0.0.879 Advanced Full with SDK, Flair and WinCE Debugger (54479 Кб)
ida_pro_4.9.0.863_full.rar
BinEdit
WinHex 12.0 SR9 (624 Кб)
Programnaya_sreda_ARM.zip ( 68.04кб ) - FAQ "Программная среда ARM" - это статья, рассказывающая и о командах процессора и о чтении прошивок через IDA.
http://sobakator.samsfan.ru/ - вот тут еще есть про ARM, в частости русская дока по ARM7, и про BinEdit там тоже есть.
Дизассемблирование и анализ кода ARM процессоров
Докладываю: домашнее задание выполнено!

Сообщение отредактировал Neomoto - 10.7.2007, 18:53
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Osta
сообщение 11.7.2007, 8:38


Freestyler
********

Группа: Легенды MotoFan.Ru
Сообщений: 10 329
Регистрация: 20.7.2004
Пользователь №: 8 235
Модель телефона: Moto
Прошивка: *#9999#


Настроение:
Все невыспавшиеся в следующей жизни будут котами



Рейтинг: 4362



Цитата(GALL @ Вчера, 17:59)

Нужен для поисков последовательностей. Показывает количество найденных значений. Может где-то и есть этот функционал в ИДЕ
*


ну... это ?
Прикрепленное изображение
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
GALL
сообщение 11.7.2007, 8:57


Гуру
******

Группа: Почётные мотофаны
Сообщений: 706
Регистрация: 25.12.2004
Из: Барнаул
Пользователь №: 29 674
Модель телефона: Iphone 4s
Прошивка: IOS 7.1.1
Победитель конкурса 2008

Рейтинг: 274



Osta, ну эт понятно. а ты покажи скрин с результатами поисков. Мне нужен такой результат: количество найденных соответствий и адреса на них.

Сообщение отредактировал GALL - 11.7.2007, 8:59
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Osta
сообщение 11.7.2007, 9:15


Freestyler
********

Группа: Легенды MotoFan.Ru
Сообщений: 10 329
Регистрация: 20.7.2004
Пользователь №: 8 235
Модель телефона: Moto
Прошивка: *#9999#


Настроение:
Все невыспавшиеся в следующей жизни будут котами



Рейтинг: 4362



Цитата(GALL @ Сегодня, 10:57)

Мне нужен такой результат: количество найденных соответствий и адреса на них.
*


ну так ? по щелчку мыши переходит на адрес..

Сообщение отредактировал Osta - 11.7.2007, 9:16
Прикрепленное изображение
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
GALL
сообщение 11.7.2007, 11:27


Гуру
******

Группа: Почётные мотофаны
Сообщений: 706
Регистрация: 25.12.2004
Из: Барнаул
Пользователь №: 29 674
Модель телефона: Iphone 4s
Прошивка: IOS 7.1.1
Победитель конкурса 2008

Рейтинг: 274



Osta, Спасибо! smile.gif
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
GALL
сообщение 11.7.2007, 15:22


Гуру
******

Группа: Почётные мотофаны
Сообщений: 706
Регистрация: 25.12.2004
Из: Барнаул
Пользователь №: 29 674
Модель телефона: Iphone 4s
Прошивка: IOS 7.1.1
Победитель конкурса 2008

Рейтинг: 274



Урок 3. Методы поиска последовательностей.

Портирование патчей подразумевает два основных процесса: а) поиск точек входа команд портируемого патча в прошивке-приемнике; б)конвертирование кодовых строк из логического контекста прошивки-источника в контекст прошивки-приемника. Обе операции в той или иной степени будут требовать определенных знаний в ассемблере ARM. В целях соблюдения рамок обучения будем стараться свести эти знания к минимуму.
И первым делом нам нужно подготовить своё рабочее место. Используя информацию урока 2, готовим дизасмы трёх баз:
1. База пропатченной прошивки-источника. Получите CG1 прошивки-источника с максимальным количеством совместимых друг с другом патчей. Вы, наверно, сами уже поняли, что процесс дизассемблирования несколько затянут по времени smile.gif.
2. База оригинальной прошивки-источника.
3. База нашей прошивки-приемника.
Эти три базы у нас всегда будут висеть во время портирования. Соответственно¸ и требования к оснастке компьютера довольно серьезные.
Для поиска последовательностей нам потребуются базы IDA Pro и открытый файл патча .fpa, который можно открыть тем же блокнотом. Итак, открываем файл .fpa и что мы видем? Под шапкой Patch_info идут строки такого формата: hex-адрес смещения: компилированный hex-код патча. Будем работать построчно, обрабатывая каждую строчку и фиксируя каждый раз выполненную стадию работы.
Прежде всего перейдем на участок пропатченного кода прошивки-источника в соответствующей базе IDA. Копируем смещение в опцию IDA: Jump-Jump to file offset и делаем прыжок в патченную область. Эту же операцию надо провести и в базе непатченной прошивки-источника. Находясь в патченной области, определите и зафиксируйте для себя точно место начала и окончания патч-кода. Здесь уже надо реально включать думалку и попытаться определить логику фрагмента патча. Попытаюсь обозначить самые общие алгоритмы патчей, а также способы нахождения их кодовых последовательностей в прошивке-приемнике:
1. Разрешительный. Это самый очевидный патч: снять какое-либо ограничение на выполнение каких-либо действий. По умолчанию в типовой прошивке в этом месте кода ставится проверка какого-либо условия и переход на подпрограммы обработки события. Патч вместо переходов по условию (команды сравнения CMP и соответствующие им команды переходов по результату сравнения BEQ, BNE,BLT и т.д) делает безусловные переходы на нужные участки кода (B 0xАдресПерехода), либо вообще отменяет какие-либо проверки пустой командой NOP. Обычно в файле fpa они представлены короткими закомпилированными строками команд безусловного перехода или пустой командой NOP: Exxx,46C0. Пока я для упрощения примеров имею в виду THUMB-команды, в основном 2-хбайтные и реже 4xбайтные. Попытаемся понять метод поиска. Начнем с простого случая, а если он не помогает, будем использовать более сложный. Итак, сейчас будем искать офсеты по НЕпатченной прошивке-источнику. Встаем в ней на наш текущий офсет. Рассмотрим различные методы поиска:
а) Оглянемся вокруг нашего места хранения патч-кода. Эта область входит в состав какой-либо процедуры, которая неизбежно обращается к данным и оставляет после себя логи работы. Если повезет, то где-то рядом с нашим кодом обнаружим строки такого вида: LDR R1, =aExitMsg_com_34 или ADR R1, aDbg_vidOta_c_0. Это хорошо для нас: мы нашли команды обращений к строковым комбинациям. Два раза щелкаем по переменной и уходим к месту расположения самой строки: aDbg_vidOta_c_1 DCB "DBG_VID- OTA_CONTENT_ACTION_SAVE_WITHOUT_PREVIEW",0. . Если там стоит имя переменной, а потом DCD, то это всего лишь адрес на место хранения строкового значения. Надо ещё раз два раза щелкнуть по переменной и прыгнуть к этому значению. Копируем всё что в кавычках находится и идем в базу прошивки-приемника
Открываем окно “Strings”, далее в меню Search…-Search вставляем строку и запускаем поиск. Если строка найдена, то можно сказать, что мы почти нашли то, что искали. Два раза щелкаем найденную строка и перескакиваем к месту раположения строки вида DCB. Далее всё делаем в обратном порядке и в конце концов допрыгиваем до команд LDR или ADR. Осталось делом техники найти предполагаемое место для патчения. Строго синхронизируйте свои действия при работе с двумя базами, чтобы не спеша подобраться к нужному месту. По пути поиска обращайте внимание на похожесть команд и переходов (пути переходов отмечаются треками стрелочек).
Если по поиску строки ничего не найдено – значит в прошивке-приемнике эта строка по другому называется или находится маленько в другом месте. Тогда попытайтесь найти ещё одну из команд обращения к строковым значениям LDR или ADR.
б) Не нашли мы в близлежащем окружении таких команд….Что делать? Тогда займемся поиском близко расположенных кодовых последовательностей, которые по идее должны быть одинаковыми как в источнике, так и в приемнике. С одной стороны размер кодовой hex-последовательности должен быть максимально большим, однако при этом следует учитывать то, что в состав последовательности не должны входить команды, зависящие от адресов обращения. Это такие команды как BL, LDR, ADR, длинные переходы B. Если в вашу последовательность попадет одна из этих команда, ты вы вряд ли найдете строку кода в прошивке-приемнике. Если правильно выбрана последовательность, на ваш взгляд, заходите в окно Hex View и копируйте оттуда hex-строку. Переходим в базу прошивки-приемника. Скопированную строку вставляем в окошко Search…- sequence of bites и смотрим на результаты поиска. Если найдена одна строка – наш поиск увенчался успехом. Двойным щелчком переходим в экран с кодом и подбираемся к предполагаемому месту патч-кода, сверяясь с базой прошивки-источника.

Продолжение следует…

Сообщение отредактировал GALL - 11.7.2007, 16:45
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Учимся портировать патчи! Уроки! Обсуждаем!, На основе IDA PRO · Патчи и всё для них · Forum
 

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

 



Текстовая версия Сейчас: 10.12.2024, 17:56

Форум живёт: