Перейти к содержимому
Калькуляторы

Модификация прошивки ZISA op151S

Здравствуйте. Пытаюсь модифицировать прошивку сабжа, чтобы он выглядел для OLT как HUAWEI HG8245H. SN уже изменён через telnet. Теперь нужно поменять MAC-адрес на WAN-интерфейсе, версию ПО, вендора и модель устройства.

 

Прошивка основана на OpenWRT, однако файл /etc/config/network находится на squashfs и просто так из консоли не меняется. Версия ПО и вендор указаны в заголовке файла и при простой замене в HEX-редакторе устройство такой файл не принимает - где-то есть контрольная сумма.

Вот, что выдал binwalk

    0        0x0      Copyright string: " 2000-2010 T&W. All rights reserved.rved."
    1024     0x400    uImage header, header size: 64 bytes, header CRC: 0xFFCC4335, created: Thu Oct 23 10:41:47 2014, image size: 1184490 bytes, Data Address: 0x80002000, Entry Point: 0x80002000, data CRC: 0x46E9464C, OS: Linux, CPU: MIPS, image type: OS Kernel Image, compression type: lzma, image name: "OpenWrtLinux-3.10.12-svn24709"
    1088     0x440    LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 3481980 bytes
    1311232  0x140200 Squashfs filesystem, little endian, version 4.0, compression:lzma (non-standard type definition), size: 2354781 bytes,  727 inodes, blocksize: 262144 bytes, created: Tue May  9 11:47:50 2017

unsquashfs не может распознать файл, но 7-zip делает это без проблем и распаковывает squashfs. Подскажите как запаковать изменённую прошивку обратно в образ с пересчётом контрольных сумм.

 

Прошивка во вложении.

TW2362H-CDEL-TW-R01B010Dffa43ac3-CN.squashfs.upf

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

4 часа назад, murder сказал:

Подскажите как запаковать изменённую прошивку обратно в образ с пересчётом контрольных сумм.

1. У вас будут как минимум 2 контрольные суммы: те, которые в uimage, и те, которые в заголовке производителя. Для uimage есть готовые исходники, просто соберите их. Для заголовка производителя вам придется писать что-то свое.

 

2. Почему вы решили, что этот sfp-модуль сконфигурируется ровно как 8245H? У него как минимум количество портов uni/pots отличается от 8245H. Т.е. возможно OLT банально не сможет ее сконфигурировать, на OLT нужно будет писать для нее отдельную конфигурацию.

 

Можете обратиться ко мне за платной модификацией прошивки, ценник там будет не 10$, и желательно как минимум один образец мне будет отправить, чтобы я сразу нашел рабочую конфигурацию, подцепив к OLT.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В 1/5/2018 в 11:57, murder сказал:

unsquashfs не может распознать файл, но 7-zip делает это без проблем и распаковывает squashfs. Подскажите как запаковать изменённую прошивку обратно в образ с пересчётом контрольных сумм.

Разобрал Вашу прошивку, предварительно извлек саму файловую систему, unsquashfs разархивировал без проблем.

Расчет контрольной суммы прошивки можно найти в файле /usr/local/bin/web при небольшом реверсе (дам результат позже).

/cgi/get_imgcrc - эндпоинт для расчет контрольной суммы прошивки.

/cgi/get_imgwrite - эндпоинт для заливки прошивки.

методы для работы с прошивкой находятся в /js/maintenance_updatefirm.js

 

Если обладаете умением реверса, то, не составит труда восстановить расчет контрольной суммы.

 

Из самой прошивки видно, что дистр собран на основе OpenWRT. Думаю, что тулы оттуда подойдут.

 

PS. Тема самому интересна, т.к. хочу заменить 8245H на нормальную железку, а не собирать зоопарк из пластиковых коробок в шкафу.
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@avkghost 

Не совсем так - проверка CRC происходит при "cgi/upload_image", код проверки находится в \usr\local\lib\libinfra.so (функция VOS_ImageVerify). Вкратце CRC32 для всего файла хранится по смещению 0x68, перед расчётом новой CRC её нужно обнулить. Я поменял версию и производителя в заголовке, но это ничего не дало - в web-интерфейсе и в микротике отображаются старые данные. Эти данные также хранятся в файлах version и show_version на squashfs. Теперь вот не знаю с какими параметрами и какой версией mksquashfs запаковывать обратно, binwalk вроде-бы пишет version 4.0. Ну и конечно для замены squashfs нужно пресчитать вторую CRC в заголовке uImage.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

44 минуты назад, murder сказал:

Теперь вот не знаю с какими параметрами и какой версией mksquashfs запаковывать обратно, binwalk вроде-бы пишет version 4.0

Качайте firmware-mod-kit, там есть куча разных версий mksquashfs, авось какая-то да подойдет.

 

Это все, что вам нужно знать для выбора нужной версии паковщика:

compression:lzma (non-standard type definition), blocksize: 262144

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

И ещё вопрос: при запаковке как mksquashfs выставит права и владельца для файлов? Если я буду распаковывать/паковать из под Windows через Cygwin права ведь выставятся не правильно (в Windows нет атрибута разрешения на выполнение)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

3 часа назад, [anp/hsw] сказал:

Это все, что вам нужно знать для выбора нужной версии паковщика

Меня беспокоит "non-standard type definition", в 7-zip метод сжатия отображается как XZ.

 

Поэксперементировал тут со сжатием и моя догадка о правах на исполнение подтвердилась - нужно перепаковывать из под linux. Перепаковал файл без изменений и вот, что показывает 7-zip:

1.thumb.png.e4e673b95d70c2ff3828259ed6013529.png

Как видно в оригинале используется более эффективный алгоритм сжатия, кроме того есть непонятки с полем "характеристики".

Изменено пользователем murder

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Забудьте вы про windows.

Как вы собрались сохранять информацию и правах доступа файлов в прошивке? ФС windows это не поддерживает, и вам придется городить костылей, чтобы они сохранились правильно.

То, что  размер получается разным, роли не играет. У производителя там свой отдельный паковщик с кучей оптимизаций обычно, но как правило есть куча совместимых, которые подойдут.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Цитата

Забудьте вы про windows

Поставил Antix - работаю в нём. Никак не могу подобрать комбинацию опций mksquashfs, чтобы получить 0x600 в характеристиках. Ключ -nopad даёт 0x400, -x-noattrs даёт 0x200 по логике их комбинация должна давать 0x600, но получается 0x200. Кстати вырезал sqhuashfs из файла, чтобы unsquashfs работал и теперь binwalk выводит "compression: xz".

 

Цитата

то, что  размер получается разным, роли не играет

В оригинальном файле в конце зачем-то добавлено 4515 байт со значением 0xFF. Так что наверное размер имеет значение. У меня же после перепаковки файл получается настолько большим, что даже если убрать этот мусор перепакованный файл будет больше оригинала.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

51 минуту назад, murder сказал:

Ключ -nopad даёт 0x400, -x-noattrs даёт 0x200 по логике их комбинация должна давать 0x600, но получается 0x200.

был ли использован ключ -nopad легко выясняется: если использован, то размер squashfs ровно столько, сколько нужно.

Если не использован, то результирующий размер добит до кратного 4 или 64 кб байтами 0xFF или 0x00.

Ключ xattrs вообще никак не влияет, все равно эти атрибуты в таких устройствах не используются никак.

58 минут назад, murder сказал:

В оригинальном файле в конце зачем-то добавлено 4515 байт со значением 0xFF. Так что наверное размер имеет значение.

Это значит, что ключ nopad не использовался, либо padding добавляется самостоятельно, а не спомощью mksquashfs.

 

1 час назад, murder сказал:

У меня же после перепаковки файл получается настолько большим, что даже если убрать этот мусор перепакованный файл будет больше оригинала.

+-10 килобайт погоды не сделают. Флешка какого размера в устройстве?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

1 час назад, [anp/hsw] сказал:

Если не использован, то результирующий размер добит до кратного 4 или 64 кб байтами 0xFF или 0x00.

Ну да - так и есть, размер кратен 256 Кб.

 

Так мне просто вставить перепакованную файловую систему в прошивку и пересчитать 3 контрольных суммы CRC (1 по смещению 0x68 и 2 в заголовке uImage)? Есть ещё вот такое описание формата uImage - там написано, что может быть произвольное количество хешей для каждого файла внутри uImage, посчитанных одним из 3 алгоритмов на выбор, надеюсь здесь такого нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Покопал uImage в Hex-редакторе и понял, что squashfs не имеет к нему никакого отношения - контрольная сумма там для lzma-блока, причём этот блок тоже выровнен по размеру.

 

Так всё-же как узнать точные параметры упаковки squashfs? Есть какие-нибудь утилиты помимо 7-zip, которые выводят информацию о файле? Интересует поле "характеристики" в 7-zip - что означает 0x600?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Будем разбираться - вот заголовок squashfs 4.3:

struct squashfs_super_block {
        unsigned int            s_magic;
        unsigned int            inodes;
        unsigned int            mkfs_time /* time of filesystem creation */;
        unsigned int            block_size;
        unsigned int            fragments;
        unsigned short          compression;
        unsigned short          block_log;
        unsigned short          flags;
        unsigned short          no_ids;
        unsigned short          s_major;
        unsigned short          s_minor;
        squashfs_inode_t        root_inode;
        long long               bytes_used;
        long long               id_table_start;
        long long               xattr_table_start;
        long long               inode_table_start;
        long long               directory_table_start;
        long long               fragment_table_start;
        long long               lookup_table_start;
};       

Меня интересует поле flags - в исходном файле оно равно 0x6C0. Вот определение флагов (они определены номерами битов):

/* Filesystem flags */
#define SQUASHFS_NOI                    0
#define SQUASHFS_NOD                    1
#define SQUASHFS_CHECK                  2
#define SQUASHFS_NOF                    3
#define SQUASHFS_NO_FRAG                4
#define SQUASHFS_ALWAYS_FRAG            5
#define SQUASHFS_DUPLICATE              6
#define SQUASHFS_EXPORT                 7
#define SQUASHFS_NOX                    8
#define SQUASHFS_NO_XATTR               9
#define SQUASHFS_COMP_OPT               10  

Соответственно 0x6C0 это SQUASHFS_EXPORT+SQUASHFS_DUPLICATE+SQUASHFS_NO_XATTR+SQUASHFS_COMP_OPT. Теперь бы узнать, что такое SQUASHFS_COMP_OPT.

Изменено пользователем murder
Нужно смотреть исходники версии 4.3, а не 4.0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот так уже понятнее, но всё ещё не понятно

/*
* store any compressor specific options after the superblock,
* and set the COMP_OPT flag to show that the filesystem has
* compressor specfic options
*/

Добавлено:

Насколько я понял из исходников, то если использовать ключ -Xbcj или -Xdict-size, то будет установлен флаг SQUASHFS_COMP_OPT и сразу после заголовка squashfs будут сохранены:

  1. (размер структуры) | (1<<15)
  2. Сама структура
    struct comp_opts {
            int dictionary_size;
            int flags;
    };

    Биты поля flags устанавливаются в соответствии с указанными в ключе -Xbcj фильтрами. Номера битов для фильтров такие:

    x86      = 0
    powerpc  = 1
    ia64     = 2
    arm      = 3
    armthumb = 4
    sparc    = 5
    unknown  = 6

     

В оригинальном файле:

  • Размер структуры почему-то 12 вместо 8
  • dictionary_size = 14 00 09 00 = 589844 (больше размера блока)
  • flags = 90 00 40 00 = вообще непонятно

 

А вот если посмотреть запакованный мною файл, то там всё соответствует исходникам. Делаю вывод, что использовалось что-то не стандартное.

Кроме того поле bytes_used суперблока в оригинале содержит весь размер данных, включая выравнивание (от чего 7-zip и выводит предупреждение), а у меня только размер полезных данных и выравнивается в оригинале через 0xFF, а у меня через 0x00.

 

Что характерно испанцы модифицировали прошивку и у них всё соответствует оригиналу (на email и на форуме микротик не отвечают).

Изменено пользователем murder
Не могу добавлять новые сообщения - видимо забанили

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

это значит что паковалось с доп.параметрами архиватора. которые сохранены после суперблока в теле сквоша.

 

скорее всего - степень сжатия, что-то типа -9.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот что выводит unsquashfs с ключом -stat

Found a valid SQUASHFS 4:0 superblock on ZISA.hsqs.
Creation or last append time Tue May  9 11:47:50 2017
Filesystem size 2299.59 Kbytes (2.25 Mbytes)
Compression xz
xz: error reading stored compressor options from filesystem!
Block size 262144
Filesystem is exportable via NFS
Inodes are compressed
Data is compressed
Fragments are compressed
Always-use-fragments option is not specified
Xattrs are not stored
Duplicates are removed
Number of fragments 21
Number of inodes 727
Number of ids 1              

То есть опции xz он прочитать не может однако распаковывает файл и без них.

 

Добавлено:

Думаю можно сделать так:

1) изменить в исходниках mksquashfs структуру comp_opts, чтобы она была размером в 12 байт (уже сделано)

2) запаковать этой утилитой файловую систему с указанием правильного размера словаря и фильтров.

3) в получившемся файле заменить структуру comp_opts на ту, которая была в оригинале.

 

Теперь вопрос: как узнать размер словаря и фильтры? Вот выдрал маленький xz-stream (кажется это fragment table в упакованном виде), какой у него размер словаря? Это читал, но там нормально описаны только заголовки потока и блоков, а формат LZMA2-данных, которые как раз и содержат нужную информацию, описан не полностью.

xz.xz

Изменено пользователем murder

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.