honeylab's blog

各種ハードウェアの改造、主にファミコンミニなどをやってます(ました)

(汎用) SPIメモリのダンプからパーティションを切り出す

吸い出したメモリダンプからパーティション切り出すために、サイズを確認します。

手がかりとなるのは、Kernelコマンドライン

Kernel command line: console=ttySGK0,115200 mem=36M rootfstype=squashfs root=/dev/mtdblock2 init=linuxrc mtdparts=gk_flash:320K(U),1664K(K),1152K(R),2560K(A),-(H)\

mtdpartsパラメータと起動時の下記の表示です。

f:id:honeylab:20190510083000p:plain

なぜこのようなパラメータが必要なのか。それはSPIメモリは、USBメモリやHDDのような共通的なパーティションテーブルの仕組みを採用していないことが多いからです。
そのため、明示的にこのようなサイズ指定を行ってパーティションを決定してやる必要があります。

16進表記 10進表記 サイズ(K表示)
Start End Start End  
0 50000 0 327680 320
50000 1f0000 327680 2031616 1664
1f0000 310000 2031616 3211264 1152
310000 590000 3211264 5832704 2560
590000 800000 5832704 8388608

2496

さて、実際に吸い出したROMを解析します。
Linuxでよく使われる binwalk というツールを使います。 

binwalk dump.img -y filesystem

 によって、以下の出力が得られます。

DECIMAL HEXADECIMAL DESCRIPTION
---------- ----------------- -----------------------------------------------------
2031616 0x1F0000 Squashfs filesystem, little endian, version 4.0, compression:xz, size: 1058498 bytes, 217 inodes, blocksize: 131072 bytes, created: 2018-08-28 05:24:06
3211264 0x310000 Squashfs filesystem, little endian, version 4.0, compression:xz, size: 2248460 bytes, 4 inodes, blocksize: 131072 bytes, created: 2019-01-14 08:29:23
5832716 0x59000C JFFS2 filesystem, little endian

このパーティションの開始位置は、先程の開始位置と一致します。

しかし、3番めからです。

1番めと2番めはそれぞれ U-boot と Kernelのバイナリイメージがそのまま書き込まれています。パーティション内にファイルシステムを持っていません。

では、それぞれのパーティションをファイル化します。

 dd if=dump.img of=mtd2_Root.img skip=1984 bs=1024 count=1152

 dd if=dump.img of=mtd3_A.img skip=3136 bs=1024 count=2560

 dd if=dump.img of=mtd4_H.img skip=5696 bs=1024 count=2496

 これらのコマンドで後半3つのパーティションが切り出せます。
mtd2とmtd3はhsquashファイルシステム、mtd4はjffs2ファイルシステムのようです。

これをLinuxマシンに持っていって、マウントを試してみます。

マウントポイントを作成します。

sudo mkdir /mnt/mtd2

sudo mkdir /mnt/mtd3

sudo mkdir /mnt/mtd4

 マウントしてみます。

sudo mount mtd3_A.img /mnt/mtd3
sudo mount mtd4_H.img /mnt/mtd4 

 エラーが出なかったようなので、マウントできているようです。

マウントポイントに移動してlsしてみます

 /mnt/mtd2$ ls
bin etc init linuxrc mnt opt proc run sys usr
dev home lib media nfsroot p2pcam root sbin tmp var

 /mnt/mtd3$  ls
ca-bundle-add-closeli.crt cloud.ini p2pcam

 マウントできたようです。

mtd2がLinuxのルートファイルシステムです。また、mtd3はルートファイルシステムの/p2pcamをマウントポイントとしてマウントされます。

p2pcamは前に書いたように、このカメラのメインアプリケーションです。

どうやら、パーティション名の’A' は Application , ’R' は Root file system, 'H' は Homeのようですね。

そして、mtd4をマウントしようとしたところ、jffs2がサポートされていないと言われてしまいました。

jffs2はフラッシュメモリ用のファイルシステムのため、一般的なデスクトップ用のLinuxではドライバが入っていないようです。この辺を後で続けて試してみようと思います。