murder Опубликовано 5 января, 2018 · Жалоба Здравствуйте. Пытаюсь модифицировать прошивку сабжа, чтобы он выглядел для 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 Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
[anp/hsw] Опубликовано 5 января, 2018 · Жалоба 4 часа назад, murder сказал: Подскажите как запаковать изменённую прошивку обратно в образ с пересчётом контрольных сумм. 1. У вас будут как минимум 2 контрольные суммы: те, которые в uimage, и те, которые в заголовке производителя. Для uimage есть готовые исходники, просто соберите их. Для заголовка производителя вам придется писать что-то свое. 2. Почему вы решили, что этот sfp-модуль сконфигурируется ровно как 8245H? У него как минимум количество портов uni/pots отличается от 8245H. Т.е. возможно OLT банально не сможет ее сконфигурировать, на OLT нужно будет писать для нее отдельную конфигурацию. Можете обратиться ко мне за платной модификацией прошивки, ценник там будет не 10$, и желательно как минимум один образец мне будет отправить, чтобы я сразу нашел рабочую конфигурацию, подцепив к OLT. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
avkghost Опубликовано 8 января, 2018 · Жалоба В 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 на нормальную железку, а не собирать зоопарк из пластиковых коробок в шкафу. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
murder Опубликовано 20 января, 2018 · Жалоба @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. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
[anp/hsw] Опубликовано 20 января, 2018 · Жалоба 44 минуты назад, murder сказал: Теперь вот не знаю с какими параметрами и какой версией mksquashfs запаковывать обратно, binwalk вроде-бы пишет version 4.0 Качайте firmware-mod-kit, там есть куча разных версий mksquashfs, авось какая-то да подойдет. Это все, что вам нужно знать для выбора нужной версии паковщика: compression:lzma (non-standard type definition), blocksize: 262144 Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
murder Опубликовано 20 января, 2018 · Жалоба И ещё вопрос: при запаковке как mksquashfs выставит права и владельца для файлов? Если я буду распаковывать/паковать из под Windows через Cygwin права ведь выставятся не правильно (в Windows нет атрибута разрешения на выполнение)? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
murder Опубликовано 20 января, 2018 (изменено) · Жалоба 3 часа назад, [anp/hsw] сказал: Это все, что вам нужно знать для выбора нужной версии паковщика Меня беспокоит "non-standard type definition", в 7-zip метод сжатия отображается как XZ. Поэксперементировал тут со сжатием и моя догадка о правах на исполнение подтвердилась - нужно перепаковывать из под linux. Перепаковал файл без изменений и вот, что показывает 7-zip: Как видно в оригинале используется более эффективный алгоритм сжатия, кроме того есть непонятки с полем "характеристики". Изменено 20 января, 2018 пользователем murder Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
[anp/hsw] Опубликовано 21 января, 2018 · Жалоба Забудьте вы про windows. Как вы собрались сохранять информацию и правах доступа файлов в прошивке? ФС windows это не поддерживает, и вам придется городить костылей, чтобы они сохранились правильно. То, что размер получается разным, роли не играет. У производителя там свой отдельный паковщик с кучей оптимизаций обычно, но как правило есть куча совместимых, которые подойдут. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
murder Опубликовано 21 января, 2018 · Жалоба Цитата Забудьте вы про windows Поставил Antix - работаю в нём. Никак не могу подобрать комбинацию опций mksquashfs, чтобы получить 0x600 в характеристиках. Ключ -nopad даёт 0x400, -x-noattrs даёт 0x200 по логике их комбинация должна давать 0x600, но получается 0x200. Кстати вырезал sqhuashfs из файла, чтобы unsquashfs работал и теперь binwalk выводит "compression: xz". Цитата то, что размер получается разным, роли не играет В оригинальном файле в конце зачем-то добавлено 4515 байт со значением 0xFF. Так что наверное размер имеет значение. У меня же после перепаковки файл получается настолько большим, что даже если убрать этот мусор перепакованный файл будет больше оригинала. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
[anp/hsw] Опубликовано 21 января, 2018 · Жалоба 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 килобайт погоды не сделают. Флешка какого размера в устройстве? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
murder Опубликовано 21 января, 2018 · Жалоба 1 час назад, [anp/hsw] сказал: Если не использован, то результирующий размер добит до кратного 4 или 64 кб байтами 0xFF или 0x00. Ну да - так и есть, размер кратен 256 Кб. Так мне просто вставить перепакованную файловую систему в прошивку и пересчитать 3 контрольных суммы CRC (1 по смещению 0x68 и 2 в заголовке uImage)? Есть ещё вот такое описание формата uImage - там написано, что может быть произвольное количество хешей для каждого файла внутри uImage, посчитанных одним из 3 алгоритмов на выбор, надеюсь здесь такого нет. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
murder Опубликовано 21 января, 2018 · Жалоба Покопал uImage в Hex-редакторе и понял, что squashfs не имеет к нему никакого отношения - контрольная сумма там для lzma-блока, причём этот блок тоже выровнен по размеру. Так всё-же как узнать точные параметры упаковки squashfs? Есть какие-нибудь утилиты помимо 7-zip, которые выводят информацию о файле? Интересует поле "характеристики" в 7-zip - что означает 0x600? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
murder Опубликовано 21 января, 2018 (изменено) · Жалоба Будем разбираться - вот заголовок 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. Изменено 21 января, 2018 пользователем murder Нужно смотреть исходники версии 4.3, а не 4.0 Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
murder Опубликовано 21 января, 2018 (изменено) · Жалоба Вот так уже понятнее, но всё ещё не понятно /* * 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<<15) Сама структура 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 и на форуме микротик не отвечают). Изменено 22 января, 2018 пользователем murder Не могу добавлять новые сообщения - видимо забанили Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
NiTr0 Опубликовано 21 января, 2018 · Жалоба это значит что паковалось с доп.параметрами архиватора. которые сохранены после суперблока в теле сквоша. скорее всего - степень сжатия, что-то типа -9. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Maxivinyl Опубликовано 21 января, 2018 · Жалоба Спасибо, помогло Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
murder Опубликовано 25 января, 2018 (изменено) · Жалоба Вот что выводит 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 Изменено 25 января, 2018 пользователем murder Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...