• Приветствуем вас на MyAmazFit.ru!

    У нас вы можете:

    • Получить квалифицированную помощь;
    • Скачать эксклюзивные прошивки;
    • Скачать модифицированные шрифты;
    • Скачать лучшие циферблаты;
    • Найти много всего интересного для своих устройств AmazFit.

    Присоединяйтесь!

  • Регистрация пользователей!

    • Регистрацию учётной записи рекомендуем осуществлять на компьютере!!!
    • Если регистрируетесь со смартфона, обязательно отключите в браузере все блокираторы, в том числе рекламы, вроде Adblock, и прочие.
    • При возникновении любых проблем (не получается зарегистрироваться или не приходит письмо для подтверждения регистрации), свяжитесь с нами с помощью формы Обратной связи.

    Перед регистрацией рекомендуем ознакомиться с Правилами форума MyAmazFit.ru.

    Присоединяйтесь!

Инструкции по работе с прошивками через IDA Pro и BinEdit

SantaX

Разработчик
Команда форума
Сообщения
35
Симпатии
496
Баллы
53
#1
Данная тема создана для обучения форумчан секретам о том, как можно открыть прошивку (от Amazfit BIP, Cor и т.д.) в дизассемблере (программы IDA Pro и BinEdit), понять его код и как его можно модифицировать. Я в этом вопросе тоже не профессионал, поэтому учиться буду вместе с Вами. На первых порах я постараюсь поделиться с вами своими знаниями, чтобы Вы смогли освоить азы языка ассемблер для ARM процессоров. По мере обучения вы можете искать ответы на свои вопросы через поиск в Теме. А если Вы не смогли найти ответ, то создавайте новое сообщение и задавайте Ваш вопрос, мы постараемся найти на него ответ!

Данный пост считается главным, и будет содержать ссылки на все инструкции в теме, чтобы Вы не потерялись в большом количестве сообщений.
Ниже Вы можете ознакомиться с вашей первой инструкцией.
Надеюсь на нашу плодотворную совместную работу!
 
Последнее редактирование:

SantaX

Разработчик
Команда форума
Сообщения
35
Симпатии
496
Баллы
53
#2
Открытие прошивки Amazfit Bip в программе IDA Pro (v6.8) на примере версии 0.1.0.44

1. Открывайте IDA Pro (v6.8). Жмете кнопку "New - Dissasemble a new file". Не забудьте установить тип файла "All files (*)". Выберите файл прошивки Mili_chaohu.fw
1.png
2. Далее в поле "Processor Type" выберите "ARM Little-endian [ARM]" и жмите кнопку "Set". Потом нажмите Ok.
2.png
3. В следующем окне нужно введите в поля "ROM start address" и "Loading address" значение 0x08008000. Потом нажмите Ok.
3.png
4. Пройдет анализ прошивки. В конце в левом нижнем углу должно появится сообщение "The initial autoanalysis has been finished."
4.png
5. Теперь вы можете смотреть функции прошивки на языке низкого уровня Assembler. В левой части вы увидите блок "Function name" с названиями функций, а также их адреса. Жмем два раза по названию sub_802A9D8. В правой части откроется эта функция:
5.png
6. Чтобы облегчить анализ функциям sub_* можно задавать свои имена. Скачайте и распакуйте приложенный архив idc.zip. В меню IDA нажмите File - Script file... В появившемся окне укажите один из файлов IDC и откройте его. Повторите процедуру и откройте второй файл.
6.png
7. Окно с функцией преобразилось. Видим что под функцией sub_802A9D8 скрывалась функция def_wf_03. Название я дал ей сам.
7.png
8. Это вывод третьего циферблата. Почему я решил? Взгляните на цифры перед вызовом функции def_from_res_ID_X_Y. Она вызывается 2 раза. Посмотрите на команду "MOVS R0,0xD" - это в регистр R0 помещается значение 0xD (13).
Теперь попробуйте распакуйте файл Mili_chaohu.res с помощью утилиты Amazfit Bip Tools, и загляните в созданную папку mili_chaohu. В ней находятся файлы PNG с названиями 000, 001 и т.д. Посмотрите на файл 013.png - это фон третьего циферблата.
8.png
9. Вторая функция рисует ресурс с кодом 0x31 (49). Если вы посмотрите что это, то увидите иконку молнии, зарядка. Расположена она по смещению X=66 (регистр R1) и Y=108 (регистр R2) - верхний левый угол картинки.
 

Вложения

  • 12.8 KB Просмотры: 16
Последнее редактирование модератором:

ahsim

Разработчик
Команда форума
Сообщения
301
Симпатии
788
Баллы
143
#3
Попробовал найти смещение стрелочек в меню-настройки и ни черта не понял как найти.
Для начала хочу разобраться как искать.
Вот допустим открываю прошивку 0.1.1.05. Хочу найти смещение названий меню. Через

Пожалуйста войдите или зарегистрируйтесь для просмотра скрытого текста.

поляка делаю прошивку со смещением, в hex редакторе открываю прошивку со смещением и без, сравниваю их и нахожу отличия. Первое что нашел это вот
1521321699800.png
но это не то, похоже это включение принудительного английского.
Дальше ищу нахожу вот
1521321758978.png
это уже похоже на то что нужно. В прошивке со смещением значение 00, значит смещение в начало координат по Х как я понимаю.
Перехожу в IDA, нахожу там это значение
1521322215236.png
Но что за R0, [SP,#0x28+var_20] не понятно.
И где значение 38 которое в hex?
Короче я остановился на "понял чио адрес верен" из этой мини инструкции из нашел личной переписки))
1521322439310.png
 
Последнее редактирование:

SantaX

Разработчик
Команда форума
Сообщения
35
Симпатии
496
Баллы
53
#4
Приветствую за стремление учиться! Теперь по делу:
Первое различие: замена 0x78 на 0x72, это поляк в пятом WF центрировал название дня недели.
Второе различие: ты неверно высчитал адрес для IDA. оффсет в прошивке 0x31636. К этому числу прибавляем базовый адрес, равный 0x08008000. Теперь перейди по полученному адресу и посмотри код.
 

ahsim

Разработчик
Команда форума
Сообщения
301
Симпатии
788
Баллы
143
#5
@SantaX, прибавил, получилось 8039636
1521405202236.png
О, вот и 38. Нашёл!
Но как искать смещения картинок из ресурсов так и не понятно
 

SantaX

Разработчик
Команда форума
Сообщения
35
Симпатии
496
Баллы
53
#6
Открытие прошивки Amazfit BIP в программе BinEdit на примере версии 0.1.0.70

  1. Рекомендация: перед открытием прошивки в BinEdit, произведите её переименование - добавьте к имени файла расширение ".bin". Получится имя файла Mili_chaohu.fw.bin
  2. Запускаем утилиту BinEdit и открываем прошивку через иконку Открыть, либо через меню "Файл - Загрузить". Переходим в каталог, где лежит прошивка. Если вами был выполнен пункт 1, то вы увидите этот файл в списке. В противном случае измените в поле "Тип файла" с "Прошивки" на "Все файлы". Выбраем нужный файл и нажимаем кнопку "Открыть".
  3. Если ранее эта версия прошивки не открывалась в BinEdit, то утилита попросит вас просканировать прошивку. Поэтому отвечаем на возникшие вопросы так:
    • Введите идентификатор прошивки - 0.1.0.70 (Вводится номер версии прошивки)
    • Сканировать прошивку? - Да.
    • Уточните адрес загрузки прошивки в HEX-формате - 8008000 (это значение является Базовым адресом и одинаково для всех прошивок Amazfit BIP)
    • Подгрузить ещё файл прошивки - Нет.
    • Уточните адрес начала оперативной памяти - 80000 (Оставляем по умолчанию)
    • Введите длину оперативной памяти - 1000 (Оставляем по умолчанию)
    • Таблица языковых ресурсов не найдена - Ок.
    • Таблица MCC команд не найдена - Ок.
    • Сохранить данные о прошивке - Да.
  4. Дальше в правой части окна Переходим на последнюю вкладку "Свойства". Если вы всё сделали правильно, то в появившемся окне вы увидите следующие строки:
    Bin ID="0.1.0.70" adr="0x33A2C" base="0x8008000" TYPE_ARM="LittleEndian"
    RAM_Area Start="0x80000" Len="0x1000"
    FLASH_Area Start="0xFE0000" Len="0x20000"
    RemapBlok Start="0x0" Len="0x20" Goto="0x0"
    LangCount adr="0x0" Default="0" TableIdAdr="0x0"
    LangAdrTable adr="0x0" countadr="0x0" default="0x0"
    LangAdrTableS adr="0x0" countadr="0x0" default="0x0"
    SaveDataBin Enable="Y"
    Здесь же удаляем все строчки, кроме первой и последней. Должно получится следующее:
    Bin ID="0.1.0.70" adr="0x33A2C" base="0x8008000" TYPE_ARM="LittleEndian"
    SaveDataBin Enable="Y"
    И завершающий шаг нажимаем кнопки "Применить" (иконка Кнопка-гвоздик) и "Сохранить описание прошивки" (иконка Дискета)
  5. Закройте BinEdit, войдите в каталог с ним, перейдите в каталог befiles и вы увидите созданный файл 0.1.0.70.be, в нем хранится описание прошивки.
  6. Теперь снова откройте прошивку с версией 0.1.0.70 через BinEdit. В этот раз утилита самостоятельно определила версию прошивки и применила базовый адрес 0x08008000.
  7. В IDA Pro мы подгружали описание функций через IDC-файлы. В BinEdit есть аналогичная функция. После открытия прошивки в правой части окна откройте вкладку Символы. В ней нажмите на иконку Открыть и подгрузите файл 1070.sym из вложения в этом посте (в архиве 1070.zip). После этого вы увидите описание функций прошивки: адрес и название.
  8. Щелкните дважды по названию функции def_wf_01: в левой части окна откроется вкладка Код и вы увидите код функции вывода первого вотчфейса.
  9. Во вложении к этому посту находится сама утилита BinEdit.

На этом пока всё, следующая информация будет о SYM-файлах их структуре и как их конвертировать в IDC-скрипты для IDA Pro.
 

Вложения

SantaX

Разработчик
Команда форума
Сообщения
35
Симпатии
496
Баллы
53
#7
Но как искать смещения картинок из ресурсов так и не понятно
Открой адрес 0x0802A2C8 в BinEdit и в IDA Pro (прошивка 0.1.0.70). Это функция вывода первого вотчфейса. Посмотри на адрес. 0x0802A2DA. В IDA будет записан код movw R0, 0x11b. А в BinEdit определить код не удалось. Это потому что он не поддерживает команду movw. Это его минус, про плюс расскажу позднее.
Так вот. Функция def_from_res_ID_X_Y получает Id картинки через регистр r0. В нашем случае это 283 (0x011b).
Теперь перейди во вкладку HEX и посмотри какие байты идут с этого адреса: 40 f2 1b 10. Ida подсказывает, что следующая команда после этой начинается через 4 байта (0x0802A2DE). Поэтому мы взяли 4 байта. Первые 2 байта здесь означают что вызывается команда movw ( так называемые опкоды архитектуры ARM, рекомендую как домашнее задание почитать о них). Следующие два байта означают значение, которое помещается в регистр. посмотри 1b10 и 011b.. Вероятно (не знаком особо с командой movw) 0 последний означает регистр r0. А дальше берется его 1 и 1b. Получим наше число. То есть, чтобы найти это смещение в другой прошивке выполни поиск этой последовательности. Если ID другой, то преобразуй его как выше. И проверь, чтобы следующая команда была bl def_from_res_ID_X_Y.
Кстати, для ID меньше 256 эта последовательность может не подойти.. так как вместо movw в этос случае будет вызываться команда mov. Она занимает лишь 2 байта.
 
Последнее редактирование:

SantaX

Разработчик
Команда форума
Сообщения
35
Симпатии
496
Баллы
53
#8
О SYM,SIG,IDC-файлах и поиске функций в новых прошивках.

В первых двух инструкциях я уже упоминал о файлах SYM и IDC. Теперь остановлюсь на них подробнее.
SYM,SIG,IDC-файлы содержат в себе информацию о функциях: их адрес, название и описание. Все они являются текстовыми (не бинарными), поэтому вы спокойно можете открыть их в блокноте.
Самый простой по структуре это формат SYM. Он состоит из 2х колонок, первая колонка - это адрес функции, вторая - название функции. Пример его содержимого ниже:
0x08046204 def_check_12_24_HH_mode
0x08044924 def_check_lang_2EN
0x080202A0 def_from_res_ID_X_Y
Таким образом при анализе кода вы можете самостоятельно находить назначение безымянной функции и дать ей название, занеся эту информацию в SYM-файл.

В инструкции №2 я уже рассказал, как загрузить в BinEdit SYM-файл (в правой части, вкладка Символы). Теперь расскажу, как сделать так, чтобы при открытии прошивки вместе с ней подгружался SYM-файл к ней.
Поместите в один каталог и прошивку, н-р, Mili_chaohu_70.fw.bin, и SYM-файл "Mili_chaohu_70.sym". Откройте be-файл вашей прошивки (например 0.1.0.70.be) в каталоге befiles BinEdit'а и добавьте с новой строчки следующий текст и сохраните изменения: LoadSym Name="Mili_chaohu_70.sym" question="N"
Теперь, при открытии прошивки с версией 0.1.0.70 у вас автоматически будет подгружаться SYM-файл.

О структуре IDC-файла я не знаю, но вы сми об этом почитать, исопльзуя Google. Зато в BinEdit есть возможность создать IDC файл из SYM-файла. Для этого, нужно открыть прошивку, загрузить sym-файл к ней. После этого во вкладке Символы нажмите на иконку с дискетой ("Сохранить сигнатуры") и в типе файла просто выберите Скрипты IDA (*.idc), введите имя файла и сохраните. Вот и всё, можете открывать этот IDC-файл в IDA Pro совместно с прошивкой.

И самое вкусненькое на последок: как вы знаете(заметили) на разных версиях прошивки одни и те же функции расположены по разным адресам. И их приходится каждый раз искать. Как облегчить себе работы и сделать поиск этих функций проще? BinEdit для этого дает 2 способа: автоматический и ручной.

Автоматический режим:
  1. Откройте прошивку и SYM-файл к ней (на примере 70й прошивки).
  2. Перейдите во вкладку Символы, нажмите на стрелку вниз, которая находится справа от иконки "Шестеренка с лупой" и выберите пункт "Для адресов без сигнатур". Если вы всё сделали правильно, то ниже у вас заполнятся поля в колонках Комментарий и Сигнатура.
  3. Сохраните файл в формате SIG через иконку с дискетой (наподобие того-как вы сохраняли IDC-файл). Пусть это будет файл Mili_chaohu_70.sig
  4. Открываете ещё одну копию программы BinEdit, в ней открываете новую прошивку, н-р, с версией 1.0.1.05. Выполните сканирование прошивки по инструкции №2. Перейдите на вкладку Символы, нажмите на иконку Открыть и выберите ранее сохраненный файл Mili_chaohu_70.sig
  5. Теперь отвечаем на возникшие вопросы следующим образом:
    Вы пытаетесь загрузить сигнатуры от другой прошивки. Продолжить загрузку? - Да.
    Определить при загрузке эквивалентные адреса по данным сигнатур? - Да.
    Загружать адреса, для которых не удалось определить эквивалент - Нет.
  6. Всё, у вас есть автоматически определенные функции. Осталось только их сохранить в SYM-, IDC- форматах и работать с новой прошивкой.

Ручной режим:
  1. Предположим, что BinEdit не смог автоматически найти адрес функции def_from_res_ID_X_Y. Открываем в BinEdit (с 70й прошивкой) в левой части вкладку HEX и вводим в поле Адрес 080202A0 и жмем Enter. Мы перешли на эту функцию, во вкладке КОД мы можем посмотреть её структуру. Но пока остаемся на вкладке HEX.
  2. Выделим 16 байт (1 строчка) левой кнопкой мыши с адреса 0x080202A0. Жмем по выделенному правой кнопкой мыши и выбираем Копировать - Как HEX-сигнатуру (THUMB).
  3. Откройте BinEdit (с 0.1.1.05й прошивкой), выберите в правой части вкладку Поиск и вставьте скопированный текст в верхнее поле. Должна вставиться строка FEB504461?20??E?840015460E460090.
  4. Теперь нажмите Enter. Ура! Чуть ниже появилась строчка Расположение HEX-кода FEB504461?20??E?840015460E460090. Раскрыв плюсик видим, что нашлось два адреса: 0x8020588 и 0x804662С. И какой же и них нужный? Есть решение.
  5. Нажмите во вкладке ПОИСК на иконку корзины (Очистить) и выполните пункт 2 ещё раз, но теперь выделите 32 байта и повторите поиск. Ура! Нашлось опять два адреса! :(
  6. Но мы на этом не останавливаемся, и копируем 48, 64, 80, 96, 112 байт! Алилуя! С 112-ю байтами найден только 1 адрес 0x8020588. Мы нашли функцию def_from_res_ID_X_Y!
  7. А вдруг этот адрес не верный! Вдруг верный 0x804662С ? Это необходимо проверить.
  8. Откроем в BinEdit (с 70й прошивкой) функцию def_wf_03 по пдресу 0x0802A6B4. Скопируем ее сигнатуру (70B504460?20??F???F???F???F?0?22) по технологии выше и поищем аналогичную функцию в прошивке 0.1.1.05
  9. В прошивке 0.1.1.05 найден 1 адрес - 0x0802B140. Откроем её во вкладке Код. Теперь сравним код в версии 0.70 и в 1.05. В 70й прошивке по адресу 0802A6C6 указывается ID картинки 0xD (13) и вызывается функция def_from_res_ID_X_Y.
  10. В прошивке с версией 0.1.1.05 по этому же смещению от начала функции указывается аналогичный ID (0xD) и вызывается функция 0x08020588. Ура, то есть мы определили правильно адрес функции def_from_res_ID_X_Y
 

wisamasd

Новичок
Заблокированный
Сообщения
31
Симпатии
66
Баллы
13
#9
учитывая что интересоваться могут и совсем новички, яб от в шапке добавил ссылку на wasm.ru, там

Пожалуйста войдите или зарегистрируйтесь для просмотра скрытого текста.

вводный курс по IDA от Нарвахи. Перевод конечно кривенький, но при желании всё понятно. Ну и понятно дело что весь курс не нужно лопатить. Первых глав чтоб иметь представление как пользоваться IDA и что зачем наверно будет достаточно.
 
Сверху Снизу