Итак, в окне компилятора мы имеем следующий текст: Процесс переноса(портирования) патча обычо заключается в подмене адресов. Начинаем с подмены адресов функций, которые объявлены через .equ: 1) uhActivateVibrator Нам известно название функции. Первым делом нужно попытаться найти функцию по названию в Символах. Для этого переходим на вкладку Символы (в окне с прошивкой U300), вставляем название функции (uhActivateVibrator) в самое верхнее текстовое поле (где справа значок лупы) и жмём на эту самую лупу или на Enter. Когда программа находит функцию, она выделяет строку с ней, но в нашем случае этого не произошло. Можете попробовать поискать функцию в символах U600 и увидите, что там эта функция найдётся. В символах U300 этой функции нет, значит придётся её искать. Самый первый и лёгкий способ поиска функции - по HEX коду её начала. Такой способ проходит только когда прошивки сильно похожи между собой. Итак, мы нашли функцию uhActivateVibrator в символах U600. Строка с этой функцией выделилась, кликаем по ней 2 раза, чтобы программа перешла в прошивке на это место. Переходим на вкладку Код и смотрим, как выглядит функция: 1 столбик - это адрес расположения команды 2 столбик - это HEX код команды 3 столбик - это непосредственно команда 4 столбик - это операнды для команды 5 столбик - это комментарии По HEX коду в разных прошивках обычно совпадают только те команды, которые не содержат в себе адреса или смещения. Команды, которые в операндах содержат адрес (переходы, вызовы функций BL и др.) или смещение (например, LDR R0,[R1,смещение]) имеют различный HEX код. Дальше мы это учтём, а сейчас нам нужно скопировать HEX-код начала нашей функции до команды BL. Почему до команды BL? ну просто это оптимальный вариант, и такой последовательности байт хватит, чтобы найти функцию в U300. Чтобы выделить, запоминаем HEX-код той команды, до которой нам нужно выделить. В нашем случае это команда BL UHVibrator, которая имеет код 52F41CFA. Запомните визуально этот код и перейдите на вкладку Hex. Теперь нам нужно выделить байты до 52F41CFA, т.е. 70B5041C394D07D001202860 (выделяем мышкой). Теперь нажимаем Ctrl + C, чтобы скопировать. Итак, мы скопировали в буфер обмена HEX-последовательность, содержащию коды команды начала функции uhActivateVibrator до вызова BL. Теперь переходим в окно с прошивкой U300, переходим в нём на вкладку Поиск и вставляем из буфера при помощи Ctrl + V в текстовое поле нашу последовательность. Пытаемся найти такую последовательность, нажам на Enter. Как видите, результатов поиска нет, потому что в этой последовательности есть коды команды с адресами, которые имеют другой код в прошивке U300. При поиске в программе BinEdit те символы, которые могут быть любыми, можно заменить знаком ?. Переходим в окно с прошивкой U600, переходим на вкладку Код и и ищем команды, которые могли помешать нашему поиску. Очевидно, что это команда LDR R5, =0x30007F78, потому что она содержит адрес. Смотрим код этой команды слева: 394D, переходим в окно с прошивкой U300 и смотрим на нашу последовательность. Находим глазами код "мешающей" команды 394D, стираем это в последовательности, а вместо него ставим ????, т.к. там могут быть любые символы. Получается, что теперь мы будем искать 70B5041C????07D001202860, но поиск этой последовательности тоже ничего не даёт. Переходим в окно с прошивкой U600 и дальше смотрим, какая команда нам может ещё мешать. Очевидно, что это BEQ loc_20570402, т.к. она тоже содержит адрес. Опять смотрим на её код 07D0, переходим в окно с U300 и заменяем 07D0 в нашей последовательности вопросами. Получается, что мы будем искать 70B5041C????????01202860. Жмём Enter и Вуаля! Появились результаты поиска. Жмём на Плюсик слева, раскроется список найденных адресов, он у нас один. Жмём по нему 2 раза левой кнопкой. Программа BinEdit не понятно почему имеет такую особенность переходить на на сам адрес, а на адрес - 0x10. Наш адрес - это 2029672E, а программа перешла на 2029671E. В окне с кодом кликнем 2 рзаа левой кнопкой слева на адрес 2029672E, чтобы перейти уже конкретно на него. Теперь можно визуально сравнить как выглядят функции в U600 и U300. Визально они немного не похожи, но будьте уверены, чтобы мы нашли uhActivateVibrator в U300, просто по каким-то причинам она немного отличается. Пример получился сложным, обычно в начале функции побольше команд без адресов, и поиск не составляет особого труда. Итак, адрес функции uhActivateVibrator в U300 - 2029672E (функции в основном начинаются с команды PUSH). Переходим в окно компилятора и заменяем вверху адрес для функции uhActivateVibrator с 0x205703EA на 0x2029672E. Как переваришь, оптисывайся, продолжим.