четверг, 12 января 2017 г.

GPT Parser Tool. Определение разметки мобильных устройств.

В этом посте мы рассмотрим одну небольшую утилиту, которую я написал недавно, под названием GPT Parser Tool. Как и следует из названия - утилита делает не что иное, как парсит разметку GPT и экспортирует считанную таблицу разделов в удобном для восприятия виде. Прежде всего, хочу заметить что утилита писалась для себя и вообщем-то не планировалось выкладывать ее в public, но так или иначе, я решил это сделать, т.к. подходящих альтернатив все равно что называется "раз, два и обчелся", а, тем неменее, утилита может оказаться очень полезной, например, при определении разметки мобильных устройств (в том числе и на базе MediaTek), например, в ситуации, когда у вас есть полный backup прошивки устройства (ROM_0), а вы хотите сделать scatter-файл для SP Flash Tool или просто посмотреть какие блоки / разделы имеются у вас на устройстве.

Вначале расскажу о функционале и о том что умеет утилита на данный момент, ну а потом мы, возможно (если успею) рассмотрим практические аспекты ее применения. Интерфейс утилиты предельно простой и выглядит следующим образом:


Здесь, как видно, мы открыли full backup прошивки одно из смартфонов на MTK-чипсете, нажали кнопку Parse и получили отображение таблицы разделов на экране. На данный момент утилита позволяет экспортировать содержимое таблицы разделов (GPT) в двух форматах - это обычный текст, в виде название раздела, стартовый адрес (offset) раздела в hex и size (размер раздела) в шестнадцатиричной и десятичной системах счисления. Второй формат - это формат BoardConfig.mk, который может понадобиться разработчикам прошивок. Что получается при экспорте GPT в оба эти формата можно увидеть на скриншотах ниже (скриншоты сделаны из Far Manager с установленным плагином Colorer):


Те, кто устал вручную искать таблицу GPT в Backup'е ROM'а, пересчитывать Start LBA и End LBA в смещение и размер раздела, конвертировать Hex в Dec и обратно для каждого раздела из таблицы поймут насколько это удобно.

Поддерживаются любые бинарные форматы файлов. Т.е. вы можете "подсунуть" программе полный backup вашего ROM, можете отдельно считанный раздел pgpt (primary global partition table). Единственное требование, чтобы в вашем файле, который вы открываете в GPT Parser Tool по смещению 0x200 находилась сигнатура "EFI PART", именно по ней программа определяет что ей действительно дали валидную GPT (в принципе, на будущее можно прикрутить и возможность автопоиска GPT в бинарном файле, но пока достаточно и этого, тем более что если сделать полный readback ROM'а в SP Flash Tool, то как раз в начале считанного дампа по нужному смещению и будет эта сигнатура, т.е. если вы берете ROM_0 считанный в SP Flash Tool в качестве входного файла, то дополнительно ничего изменять в нем не нужно).

Скачать утилиту можно здесь: gpt_parser_tool.rar (пароль на архив: decker.su)

p.s. Изначально я хотел сделать в утилите какой-нибудь NAG screen при выходе, напоминающий о поддержке проекта и т.п., но потом решил отказаться от этой идеи, чтобы лишний раз не раздражать пользователей ожиданием и т.п. Если утилита оказалась вам полезной - ссылку на поддержку проекта вы всегда можете найти на страницах этого блога, а также в самом приложении.

Также буду рад замечаниям, предложениям и любой другой конструктивной критике, которой вы можете делиться в комментариях к этому посту. Если вы считаете что в программе не хватает каких-то форматов для экспорта - их добавление также возможно, пишите что именно хотелось бы видеть, со ссылкой на пример. Наиболее значимые идеи скорее всего будут реализованы.

Обновлено 12.01.2017 21:00 (MSK)

v1.0.0.4
  • Попытка исправить проблему с отображением формы в ОС на которых выставлен нестандартный размер DPI (отличный от 96) в свойствах экрана. 
  • Попытка исправить проблему при открытии файлов с PGPT размером меньше чем 512*34 байт (т.е. меньше чем 34 сектора).

v1.0.0.5
  • В колонках таблицы теперь можно изменять размер.

v1.0.0.6
  • В таблице на основной форме отображаются Offset и Size раздела, помимо LBA.

Скриншот интерфейса последней версии:


Обновлено 16.01.2017 21:23 (MSK)

v1.0.0.7
  • Незначительные изменения интерфейса, элементы контролов теперь смотрятся более современно.
  • Исправлена проблема при открытии больших файлов, намного больше 4 Gb ... Проблема выявлена благодаря пользователю Андрей Таранов (при открытии 16 Gb'ного backup'а ROM_0 от устройства на базе MT6737T программа выдавала I/O Error 998, начиная с этого релиза эта проблема исправлена).

11 комментариев :

  1. При попытке разбора файла выдает ошибку I/O Error 998

    ОтветитьУдалить
  2. У файла уж очень тоннаж тяжелый 16 гиг.
    Вот ссылка на него, единственное,что могу сказать по смещению 0x200 находится сигнатура "EFI PART"
    http://4pda.ru/pages/go/?u=https%3A%2F%2Fyadi.sk%2Fd%2F8BrQjAWd35UgYS&e=52982305&f=http%3A%2F%2F4pda.ru%2Fforum%2Findex.php%3Fshowtopic%3D770294

    ОтветитьУдалить
  3. P.s. распакованный 16 гиг, упакованный 6 гиг

    ОтветитьУдалить
    Ответы
    1. Так вырежите из него первые 512*34 байт любым hex редактором. После чего откройте в программе.

      Удалить
    2. А так - сейчас скачаю, посмотрим ... вероятно проблема связана с размером ...

      Удалить
    3. Релиз обновлен. В версии v1.0.0.7 описанная вами проблема устранена, теперь ограничения на размер открываемых файлов нет совсем. Т.е. ваш 16 Gb'ный backup обрабатывается корректно.

      Удалить
  4. Благодарю, чуть позже, очередной донат с меня

    ОтветитьУдалить
  5. I want to parse gpt by myself how can I do i sir?
    please Reply me

    ОтветитьУдалить
    Ответы
    1. Download tool from this post and parse ;) If you want to parse it "by hand" read something about GPT structure and do it. For example you can read following article on Wiki - GUID Partition Table.

      Удалить
  6. Хорошая утилита.
    Вопрос:
    1. Как сохранить изменения, сделанные в размерах разделов, обратно в *.bin-файл для последующей прошивки в смартфон?
    2. В открытом файле разметки (ссылка на файл: https://yadi.sk/d/Lw2MS2d73LjnEJ 85 КБ) есть скрытые области, видимые только по номерам LBA (конец предыдущего - начало следующего раздела). Это неперемещаемые области, созданные при первоначальной разметке производителем? И эти области ни изменять, ни сдвигать нельзя?
    3. В этом же файле совсем непонятна ситуация с последним разделом /userdata (mmcblk0p21) и следующими за ним разделами, имеющими размер 0х200, но не имеющими ни адресов LBA, ни начального смещения offset=0x0.
    Предложения:
    1. При открытии "на весь экран" растягивается только фоновое окно, рабочее окно самой утилиты остаётся неимзменным. Можно ли что-нибудь с этим сделать?
    2. При изменении размеров разделов было бы хорошо, если бы утилита сама автоматически пересчитывала (и LBA, и HEX) размеры следующих за изменяемым разделов, не затрагивая скрытые области (из вопроса 2) и, при этом, подсвечивая сделанные изменения.

    ОтветитьУдалить