Как обычно всё что делаете на ваш страх и риск. Никто ни к чему не принуждает. Есть риск кирпича и внеземного вторжения.
Инструкция только под linux системы (так же подходит wsl).
Инструкция по снятию дапа есть в мануале по прошивке так что будем считать что он уже есть.
Таблицу разделов можно подсмотреть при загрузке ядра:
[ 0.403332] 8 cmdlinepart partitions found on MTD device jz_sfc
[ 0.409482] Creating 8 MTD partitions on "jz_sfc":
[ 0.414477] 0x000000000000-0x000000040000 : "boot"
[ 0.419946] 0x000000040000-0x000000230000 : "kernel"
[ 0.425609] 0x000000230000-0x000000600000 : "rootfs"
[ 0.431198] 0x000000600000-0x0000009d0000 : "app"
[ 0.436586] 0x0000009d0000-0x000000bc0000 : "kback"
[ 0.442075] 0x000000bc0000-0x000000f90000 : "aback"
[ 0.447632] 0x000000f90000-0x000000ff0000 : "cfg"
[ 0.452947] 0x000000ff0000-0x000001000000 : "para"
[ 0.458409] SPI NOR MTD LOAD OK
Далее нужно распотрошить дамп на куски согласно разметке. Для разборки, выравнивания, сборки дампа для себя написал небольшую тулзу BinTools (описание всего софта снизу мануала). Вы можете использовать как её так и любую другую, цель именно в разбитии оригинального бинарника по адресам.
$ cat parts.json
{
"Partitions": [
{
"BeginAddress": 0x000000000000, "EndAddress": 0x000000040000,
"Name": "boot", "Extension": "bin"
},
{
"BeginAddress": 0x000000040000, "EndAddress": 0x000000230000,
"Name": "kernel", "Extension": "uimg"
},
{
"BeginAddress": 0x000000230000, "EndAddress": 0x000000600000,
"Name": "rootfs", "Extension": "squashfs"
},
{
"BeginAddress": 0x000000600000, "EndAddress": 0x0000009d0000,
"Name": "app", "Extension": "squashfs"
},
{
"BeginAddress": 0x0000009d0000, "EndAddress": 0x000000bc0000,
"Name": "kback", "Extension": "squashfs"
},
{
"BeginAddress": 0x000000bc0000, "EndAddress": 0x000000f90000,
"Name": "aback", "Extension": "squashfs"
},
{
"BeginAddress": 0x000000f90000, "EndAddress": 0x000000ff0000,
"Name": "cfg", "Extension": "jffs2"
},
{
"BeginAddress": 0x000000ff0000, "EndAddress": 0x000001000000,
"Name": "para", "Extension": "bin"
}
]
}
$ ./bintools split -p ./parts.json -i ./fulldump.4.3.2_0193.bin -o ./split
[01:36:08 DBG] Part names not specified, export all
[01:36:08 INF] Process part boot. Range 00000000 - 00040000, len 262144
[01:36:08 INF] Write 262144 bytes to split/boot.bin
[01:36:08 INF] Process part kernel. Range 00040000 - 00230000, len 2031616
[01:36:08 INF] Write 2031616 bytes to split/kernel.uimg
[01:36:08 INF] Process part rootfs. Range 00230000 - 00600000, len 3997696
[01:36:08 INF] Write 3997696 bytes to split/rootfs.squashfs
[01:36:08 INF] Process part app. Range 00600000 - 009D0000, len 3997696
[01:36:08 INF] Write 3997696 bytes to split/app.squashfs
[01:36:08 INF] Process part kback. Range 009D0000 - 00BC0000, len 2031616
[01:36:08 INF] Write 2031616 bytes to split/kback.squashfs
[01:36:08 INF] Process part aback. Range 00BC0000 - 00F90000, len 3997696
[01:36:08 INF] Write 3997696 bytes to split/aback.squashfs
[01:36:08 INF] Process part cfg. Range 00F90000 - 00FF0000, len 393216
[01:36:08 INF] Write 393216 bytes to split/cfg.jffs2
[01:36:08 INF] Process part para. Range 00FF0000 - 01000000, len 65536
[01:36:08 INF] Write 65536 bytes to split/para.bin
$ cd split; ls
aback.squashfs
app.squashfs
boot.bin
cfg.jffs2
kback.squashfs
kernel.uimg
para.bin
rootfs.squashfs
Ничего особо интересного. Пока что только binwalk
$ binwalk boot.bin
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
208236 0x32D6C CRC32 polynomial table, little endian
212616 0x33E88 LZO compressed data
216084 0x34C14 Android bootimg, kernel size: 0 bytes, kernel addr: 0x70657250, ramdisk size: 543519329 bytes, ramdisk addr: 0x6E72656B, product name: "mem boot start"
Ничего особо интересного. Через mkimage
не распознаётся
$ mkimage kernel.uimg -l
GP Header: Size 27051956 LoadAddr 58ab0988
$ binwalk kernel.uimg
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 uImage header, header size: 64 bytes, header CRC: 0x58AB0988, created: 2021-07-11 18:42:35, image size: 1590203 bytes, Data Address: 0x80010000, Entry Point: 0x80367840, data CRC: 0xB7D95A14, OS: Linux, CPU: MIPS, image type: OS Kernel Image, compression type: lzma, image name: "Linux-3.10.14__isvp_swan_1.0__"
64 0x40 LZMA compressed data, properties: 0x5D, dictionary size: 67108864 bytes, uncompressed size: -1 bytes
Это блоки squashfs которые можно распаковать, замодить, собрать обратно, главное не выйти за размер партишена.
$ unsquashfs -s ./rootfs.squashfs # информация о сжатии
Found a valid SQUASHFS 4:0 superblock on ./rootfs.squashfs.
Creation or last append time Wed Nov 3 15:37:54 2021
Filesystem size 3976360 bytes (3883.16 Kbytes / 3.79 Mbytes)
Compression xz
Block size 131072
Filesystem is exportable via NFS
Inodes are compressed
Data is compressed
Uids/Gids (Id table) are compressed
Fragments are compressed
Always-use-fragments option is not specified
Xattrs are compressed
Duplicates are removed
Number of fragments 13
Number of inodes 433
Number of ids 1
Number of xattr ids 0
$ unsquashfs ./rootfs.squashfs # распаковка
Parallel unsquashfs: Using 72 processors
389 inodes (456 blocks) to write
[==================/] 456/456 100%
created 89 files
created 44 directories
created 300 symlinks
created 0 devices
created 0 fifos
created 0 sockets
$ mksquashfs squashfs-root ./rootfs.repacked.squashfs -comp xz # упаковка
Parallel mksquashfs: Using 72 processors
Creating 4.0 filesystem on ./rootfs.repacked.squashfs, block size 131072.
[==================|] 156/156 100%
Exportable Squashfs 4.0 filesystem, xz compressed, data block size 131072
compressed data, compressed metadata, compressed fragments,
compressed xattrs, compressed ids
duplicates are removed
Filesystem size 3883.12 Kbytes (3.79 Mbytes)
36.00% of uncompressed filesystem size (10785.64 Kbytes)
Inode table size 2504 bytes (2.45 Kbytes)
15.88% of uncompressed inode table size (15773 bytes)
Directory table size 3502 bytes (3.42 Kbytes)
51.40% of uncompressed directory table size (6813 bytes)
Number of duplicate files found 0
Number of inodes 433
Number of files 89
Number of fragments 13
Number of symbolic links 300
Number of device nodes 0
Number of fifo nodes 0
Number of socket nodes 0
Number of directories 44
Number of ids (unique uids + gids) 1
Number of uids 1
mixa3607 (1000)
Number of gids 1
mixa3607 (1000)
Блок формата jffs2
. На данный момент не маунтил но изветно что хранит изменяемые конфиги.
Назначение не понятно, просто блок забитый 0xFF
Цель заключается в том что достать rootfs
, разобрать, раскоментировать строку в файле /etc/inittab
, собрать и зашить патченый партишен обратно.
Репак:
$ # разбивка дампа
$ ./bintools split -p ./parts.json -i ./fulldump.4.3.2_0193.bin -o ./split
[01:36:08 DBG] Part names not specified, export all
[01:36:08 INF] Process part boot. Range 00000000 - 00040000, len 262144
[01:36:08 INF] Write 262144 bytes to split/boot.bin
[01:36:08 INF] Process part kernel. Range 00040000 - 00230000, len 2031616
[01:36:08 INF] Write 2031616 bytes to split/kernel.uimg
[01:36:08 INF] Process part rootfs. Range 00230000 - 00600000, len 3997696
[01:36:08 INF] Write 3997696 bytes to split/rootfs.squashfs
[01:36:08 INF] Process part app. Range 00600000 - 009D0000, len 3997696
[01:36:08 INF] Write 3997696 bytes to split/app.squashfs
[01:36:08 INF] Process part kback. Range 009D0000 - 00BC0000, len 2031616
[01:36:08 INF] Write 2031616 bytes to split/kback.squashfs
[01:36:08 INF] Process part aback. Range 00BC0000 - 00F90000, len 3997696
[01:36:08 INF] Write 3997696 bytes to split/aback.squashfs
[01:36:08 INF] Process part cfg. Range 00F90000 - 00FF0000, len 393216
[01:36:08 INF] Write 393216 bytes to split/cfg.jffs2
[01:36:08 INF] Process part para. Range 00FF0000 - 01000000, len 65536
[01:36:08 INF] Write 65536 bytes to split/para.bin
$ cd split
$ unsquashfs ./rootfs.squashfs # распаковка
Parallel unsquashfs: Using 72 processors
389 inodes (456 blocks) to write
[==================/] 456/456 100%
created 89 files
created 44 directories
created 300 symlinks
created 0 devices
created 0 fifos
created 0 sockets
$ sed -i 's|^#console::|console::|1' ./squashfs-root/etc/inittab # редактирование
$ mksquashfs squashfs-root ./rootfs.patched.squashfs -comp xz # упаковка
Parallel mksquashfs: Using 72 processors
Creating 4.0 filesystem on ./rootfs.patched.squashfs, block size 131072.
[================|] 156/156 100%
Exportable Squashfs 4.0 filesystem, xz compressed, data block size 131072
compressed data, compressed metadata, compressed fragments,
compressed xattrs, compressed ids
duplicates are removed
Filesystem size 3883.12 Kbytes (3.79 Mbytes)
36.00% of uncompressed filesystem size (10785.64 Kbytes)
Inode table size 2512 bytes (2.45 Kbytes)
15.93% of uncompressed inode table size (15773 bytes)
Directory table size 3502 bytes (3.42 Kbytes)
51.40% of uncompressed directory table size (6813 bytes)
Number of duplicate files found 0
Number of inodes 433
Number of files 89
Number of fragments 13
Number of symbolic links 300
Number of device nodes 0
Number of fifo nodes 0
Number of socket nodes 0
Number of directories 44
Number of ids (unique uids + gids) 1
Number of uids 1
mixa3607 (1000)
Number of gids 1
mixa3607 (1000)
$ ../bintools adjust -i ./rootfs.patched.squashfs -o ./rootfs.patched.bin -s 0x00000000003d0000 # выравнивание под размер раздела
[14:27:04 INF] Target size 3997696 more than source. Pad 20480 with 0xFF bytes
Копируем итоговый rootfs.patched.bin
на флешку, попадаем в бутлоадер через замыкание флеша (кусок из мана по прошивке) и прошиваем:
$ # начальный адрес в памяти и размер флеша
$ setenv baseaddr 0x80600000; setenv flashsize 0x1000000
$ # очистка памяти под разммер rootfs
$ mw.b ${baseaddr} 0xff 0x00000000003d0000
$ # подготовка сд карточки и вычитывание в рам
$ mmc rescan; fatls mmc 0:1
system volume information/
3997696 rootfs.patched.bin
1 file(s), 1 dir(s)
$ fatload mmc 0:1 ${baseaddr} rootfs.patched.bin
reading rootfs.patched.bin
3997696 bytes read in 665 ms (5.7 MiB/s)
$ # затирание rootfs на флеше
$ sf probe 0; sf erase 0x000000230000 0x00000000003d0000
the manufacturer 1c
SF: Detected EN25QH128A
--->probe spend 4 ms
SF: 3997696 bytes @ 0x230000 Erased: OK
--->erase spend 10836 ms
$ # копирование из рамы в флеш
$ sf write ${baseaddr} 0x000000230000 ${filesize}
SF: 3997696 bytes @ 0x230000 Written: OK
--->write spend 6862 ms
$ # сброс
$ reset
Если после прошивки раздела что то тупит то передёрните полностью питание, если не поможет то ресет к заводским.
После загрузки должно выйти предложение залогиниться, если не видно то нажмите несколько раз ввод. Логин/хэш извлечены из /etc/passwd
и /etc/shadows
после гугления найден пароль. Итоговые кредсы root:ismart12
Ingenic-uc1_1 login: root
Password:
Apr 27 01:44:07 login[148]: root login on 'console'
[root@Ingenic-uc1_1:~]# ls
aback dev lib mnt root sys tmp
bin etc linuxrc opt run system usr
configs kback media proc sbin thirdlib var