LINUX.ORG.RU

Распаковка и упаковка прошивки для роутера

 , , ,


1

1

Доброго времени суток. Эта область для меня тёмный лес, я тут вообще ничего не понимаю, так что если буду нести ересь - тапками, пожалуйста, не кидайте. Есть у меня в наличии GPON терминал. Хочу поковырять его прошивку. Сам файл прошивки у меня тоже есть. Это UBI образ. По мануалам найденным в интернете - http://www.slatedroid.com/topic/3394-extract-and-rebuild-a-ubi-image/ я его скопировал на устройство mtdblock0, прицепил, смонтировал. Внутри лежал файлик со squahfs. Его я тоже распаковал. В общем что хотел найти и поменять - нашёл и поменял. Упаковал назад squashfs, а вот упаковать назад этот UBI у меня не получается. Файл получается не того же размера что и изначальный, и при загрузке на терминал получаю сообщение что прошивка не правильная.

Инфо по прошивке:

# binwalk
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             JFFS2 filesystem, big endian
2228224       0x220000        UBI erase count header, version: 1, EC: 0x0, VID header offset: 0x800, data offset: 0x1000

# mtdinfo /dev/mtd0
mtd0
Name:                           NAND simulator partition 0
Type:                           nand
Eraseblock size:                131072 bytes, 128.0 KiB
Amount of eraseblocks:          2048 (268435456 bytes, 256.0 MiB)
Minimum input/output unit size: 2048 bytes
Sub-page size:                  512 bytes
OOB size:                       64 bytes
Character device major/minor:   90:0
Bad blocks are allowed:         true
Device is writable:             true

# ubinfo /dev/ubi0
ubi0
Volumes count:                           1
Logical eraseblock size:                 126976 bytes, 124.0 KiB
Total amount of logical eraseblocks:     2048 (260046848 bytes, 248.0 MiB)
Amount of available logical eraseblocks: 0 (0 bytes)
Maximum count of volumes                 128
Count of bad physical eraseblocks:       0
Count of reserved physical eraseblocks:  40
Current maximum erase counter value:     1
Minimum input/output unit size:          2048 bytes
Character device major/minor:            241:0
Present volumes:                         0

# ubinfo /dev/ubi0_0 
Volume ID:   0 (on ubi0)
Type:        dynamic
Alignment:   1
Size:        2002 LEBs (254205952 bytes, 242.4 MiB)
State:       OK
Name:        rootfs_ubifs
Character device major/minor: 241:1

Подскажите с какими параметрами это собирать? У меня на этапе распаковки есть одно отличие от того что по ссылке - я использую «ubiattach» со смещением -О 2048. И конечный файл, после сборки, отличается от изначального примерно на 2 мегабайта. Может тут собака порылась? В опциях mkfs.ubifs ничего про смещение не нашёл.

Ссылка на прошивку: кто хотел тот уже скачал, дальнейшее распространение не считаю нужным. Извините. Производитель мудак - дыры исправляет очень не торопясь. Провайдерские админы - олени, зачастую оставляют доступ извне и не меняют пароли по умолчанию. А я категорически плохо отношусь к сетям из зомби роутеров.



Последнее исправление: Toten_Kopf (всего исправлений: 2)

Ответ на: комментарий от Toten_Kopf

ну да, ubi, ubireader_utils_info создаст нужный скрипт и манифест для сборки, только в манифесте изменить или удалить vol_size, так как он изменится

hizel ★★★★★
()
Ответ на: комментарий от hizel

смешно, зачем в rw ubi засунули ro squash и chrootятся туда, неужели самый простой способ в их случае сделать ro основную fs

hizel ★★★★★
()
Ответ на: комментарий от hizel

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

Toten_Kopf
() автор топика
Ответ на: комментарий от hizel

Тупой, наверное, вопрос - вы распаковали эту прошивку с ubireader? Если да - то как? Я скольно ни пробовал, каждый раз получаю ошибку:

read Error: Block ends at 26083328 which is greater than file size 25952340
extract_blocks Fatal: PEB: 181: Bad Read Offset Request

Toten_Kopf
() автор топика
Ответ на: комментарий от Toten_Kopf

ну да, умвр, внутри dev устройства, поэтому распаковываю рутом

hizel@hz ~/src/ubi_reader $ sudo ./ubireader_extract_files -o ~/firmware/fw_l/l ~/firmware/fw_l/fw.bin
Extracting files to: /home/hizel/firmware/fw_l/l/0/rootfs_ubifs
hizel@hz ~/src/ubi_reader $ ls -l /home/hizel/firmware/fw_l/l/0/rootfs_ubifs
total 18681
drwxr-xr-x 2 root root     1272 Mar  3 11:12 bin
drwxr-xr-x 2 root root       48 Mar  3 11:12 data
lrwxrwxrwx 1 root root       16 Mar  3 11:12 debug -> sys/kernel/debug
drwxr-xr-x 4 root root     4528 Mar  3 11:12 dev
drwxr-xr-x 5 root root     1320 Mar  3 11:12 etc
drwxr-xr-x 2 root root      592 Mar  3 11:12 lib
lrwxrwxrwx 1 root root       11 Mar  3 11:12 linuxrc -> bin/busybox
drwxr-xr-x 2 root root       48 Mar  3 11:12 mnt
drwxr-xr-x 4 root root       96 Mar  3 11:12 opt
drwxr-xr-x 2 root root       48 Mar  3 11:12 proc
-rw-r--r-- 1 root root 19095552 Mar  3 11:12 realrootfs
drwxr-xr-x 2 root root      504 Mar  3 11:12 sbin
drwxr-xr-x 2 root root       48 Mar  3 11:12 sys
lrwxrwxrwx 1 root root        8 Mar  3 11:12 tmp -> /var/tmp
drwxr-xr-x 4 root root      184 Mar  3 11:12 usr
drwxr-xr-x 3 root root       72 Mar  3 11:12 var
-rw-r--r-- 1 root root      665 Mar  3 11:12 version
-rw-r--r-- 1 root root      805 Mar  3 11:12 version.list

у меня ubireader из git commit 8010e9f3d4a87771eed687e21357dca955c57c96

hizel ★★★★★
()
Ответ на: комментарий от Toten_Kopf

судя по github разраб что-то еще накомитил, опасна, есть в этом роутере фэйлбэк режим? доступ до бутлоадера, бэкап фс сделан? можно ли из бутлоадера вернуть старое состояние? сразу много вопросов про отступление на исходную

hizel ★★★★★
()
Ответ на: комментарий от hizel

Не, у меня вообще таким способом вообще не распаковывается, так что даже шанса сломать нету. Но если что, доступ к бутлоадеру есть. Там я что-то про tftp видел. А если оно у вас нормально распаковало, то может можете поделиться скриптом для сборки и манифестом? которые я как помню ubireader должен создать.

Toten_Kopf
() автор топика
Ответ на: комментарий от Toten_Kopf

create_ubi_img-0.sh

#!/bin/sh
/usr/sbin/mkfs.ubifs -m 2048 -e 126976 -c 1024 -r $1 img-0_0.ubifs
/usr/sbin/ubinize -p 131072 -m 2048 -s 2048 -O 2048 -o img-0.ubi img-0.ini

img-0.ini

[rootfs_ubifs]
mode = ubi
image = img-0_0.ubifs
vol_name = rootfs_ubifs
vol_size = 22728704
vol_flags = autoresize
vol_type = dynamic
vol_alignment = 1
vol_id = 0


здесь vol_size можно выкинуть, ubinize ругнется и соберет или может имеет смысл в man ubinize почитать

hizel ★★★★★
()
Ответ на: комментарий от hizel

А vol_size из стартового сообщения не подойдёт? Там мне утилитки как раз выдали его

Toten_Kopf
() автор топика
Ответ на: комментарий от hizel

Ну и раз такое дело - то ещё одна просьба. Может вы можете файлики, что получились при распаковке, упаковать в зип, выложить куда-либо и скинуть мне ссылочку на мыло viktor.zzz.es{sobaka}yandex.ru. А то у меня при сборке всё равно получается файл меньшего размера и всё время «image invalid». При этом я уверен, что никаких подписей шифрований и т.д. производитель не использует. Что-то я не уверен уже что я прошивку нормально распаковал методом по ссылке из топика. Буду премного благодарен

Toten_Kopf
() автор топика
Ответ на: комментарий от Toten_Kopf

если не убирать, жалуется и не создает

$ sudo ./create_ubi_img-0.sh ../../0/rootfs_ubifs
ubinize: error!: error in section «rootfs_ubifs»: size of the image file «img-0_0.ubifs» is 22982656, which is larger than volume size 22728704

комментируем размер в ini:

$ sudo ./create_ubi_img-0.sh ../../0/rootfs_ubifs
ubinize: volume size was not specified in section «rootfs_ubifs», assume minimum to fit image «img-0_0.ubifs"22982656 bytes (21.9 MiB)
создает

https://yadi.sk/d/E_AspPu13EwXrA

хотя, fw.bin это ubi, а не ubifs, поэтому этот манифест не нужен

еще меня хвост fw.bin беспокоит, похоже разработчики добавили свое в ubi, похожее на модель и контрольную сумму

hizel ★★★★★
()
Ответ на: комментарий от hizel

я тут натравил binwalk создаваемую мной прошивку и похоже понятно где проблема, но мне не понятно как её решать:

$ binwalk img-0.ubi 

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             UBI erase count header, version: 1, EC: 0x0, VID header offset: 0x800, data offset: 0x1000
а на оригинал binwalk выдаёт:
$ binwalk fw.bin 

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             JFFS2 filesystem, big endian
2228224       0x220000        UBI erase count header, version: 1, EC: 0x0, VID header offset: 0x800, data offset: 0x1000
Не хватает JFFS2 со смещением на 2 мегабайта. И куда он деётся при разборке?

Toten_Kopf
() автор топика
Ответ на: комментарий от Toten_Kopf

значит новый ubi_reader правильно ругался

если откусить этот кусочек, распаковывается корректно jffs2 с ядром:

$ dd if=fw.bin of=fw_jffs.bin bs=2228224 count=1                                                                                                                  
1+0 records in
1+0 records out
2228224 bytes (2.2 MB, 2.1 MiB) copied, 0.00300079 s, 743 MB/s
$ dd if=fw.bin of=fw_ubi.bin bs=2228224 skip=1
10+1 records in
10+1 records out
23724116 bytes (24 MB, 23 MiB) copied, 0.0257851 s, 920 MB/s
$ jefferson -d jffs fw_jffs.bin 
dumping fs #1 to /home/hizel/firmware/fw_l/jffs/fs_1
Jffs2_raw_dirent count: 3
Jffs2_raw_inode count: 446
Jffs2_raw_summary count: 0
Jffs2_raw_xattr count: 0
Jffs2_raw_xref count: 0
Endianness: Big
writing S_ISREG version
writing S_ISREG version.list
writing S_ISREG vmlinux.lz
----------

а дальше, после jffs2 куска, таки именно результат ubinize судя по заголовку

если они собрали вместе поровозиком две файловые системы то хвост fw.bin еще более подозрительный, очень похоже на контрольный блок

hizel ★★★★★
()
Последнее исправление: hizel (всего исправлений: 1)
Ответ на: комментарий от hizel

Откусил jffs от начала, непонятный кусок от конца и теперь нормально распаковалось. Похоже что в конце на самом деле что-то вроде чексумы.

Toten_Kopf
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.