吸い出したメモリダンプからパーティション切り出すために、サイズを確認します。
手がかりとなるのは、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パラメータと起動時の下記の表示です。
なぜこのようなパラメータが必要なのか。それは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ではドライバが入っていないようです。この辺を後で続けて試してみようと思います。