イメージファイルを直接編集してファイルの内容を変更


アニメ『ちおちゃんの通学路』

通学路では、いろんな出来事が起こるんですね。登場キャラが好きなので継続して見るけれど、ギャグアニメとして見るのは物足りない感じです。FPSやりこんでると、もっと面白かったかもですが。

今回はタイトルの通り、イメージファイルを編集したら、
マウントしてディレクトリ内のファイルの内容も変更されるかやってみます。

まずはイメージファイル作成。

takk@deb9:~/tmp$ truncate -s100M a.bin
takk@deb9:~/tmp$ sudo mkfs -t ext3 a.bin
mke2fs 1.43.4 (31-Jan-2017)
Discarding device blocks: done                            
Creating filesystem with 102400 1k blocks and 25688 inodes
Filesystem UUID: c08fc04b-3fe9-4fd4-87ad-d051671fba36
Superblock backups stored on blocks: 
	8193, 24577, 40961, 57345, 73729

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done 

takk@deb9:~/tmp$

作成できたので、ディレクトリへマウントします。

takk@deb9:~/tmp$ mkdir test
takk@deb9:~/tmp$ sudo mount -o loop a.bin test
takk@deb9:~/tmp$ 

適当なファイルを作成。hello.txtにHELLOと書き込んで、ディレクトリをアンマウント。

takk@deb9:~/tmp$ sudo chmod 777 test
takk@deb9:~/tmp$ cd test
takk@deb9:~/tmp/test$ echo HELLO > hello.txt
takk@deb9:~/tmp/test$ cd ..
takk@deb9:~/tmp$ sudo umount test
takk@deb9:~/tmp$ 

イメージファイル内に、さきほど書き込んだHELLOがどこに格納されているか確認。

takk@deb9:~/tmp$ hd a.bin | grep -i hello
0007f030  d4 03 09 01 68 65 6c 6c  6f 2e 74 78 74 00 00 00  |....hello.txt...|
00085c30  d4 03 09 01 68 65 6c 6c  6f 2e 74 78 74 00 00 00  |....hello.txt...|
00500400  48 45 4c 4c 4f 0a 00 00  00 00 00 00 00 00 00 00  |HELLO...........|
takk@deb9:~/tmp$ 

面倒なので、strings使います。stringsはバイナリから文字列を抽出してくれます。-tdオプションで、文字列の位置も表示できます。

takk@deb9:~/tmp$ strings a.bin -td
   1068 ;+h[]+h[
   1160 /home/takk/tmp/test
   1272 =eAX
 267400 ;+h[S+h[S+h[
 268680 S+h[S+h[S+h[
 520224 lost+found
 520244 hello.txt
 536712 ;+h[
 537652 [h+@#I7
 539784 ;+h[F+h[
 540724 [h+K#
 545160 S+h[S+h[S+h[
 545928 ;+h[S+h[S+h[
 547872 lost+found
 547892 hello.txt
 548908 ;+h[;+h[
 549000 /home/takk/tmp/test
 549112 =eAX
 550964 [h+Y(
5243904 HELLO
8389880 =eAX
25167096 =eAX
41944312 =eAX
58721528 =eAX
75498744 =eAX
takk@deb9:~/tmp$ 

HELLOは、5243904バイト(0始まり)の位置ですね。

ddでイメージファイルを書き換え。HELLOの先頭1文字をTにして、TELLOに書き換えます。

takk@deb9:~/tmp$ echo T | dd seek=5243904 bs=1 count=1 of=a.bin conv=notrunc
1+0 レコード入力
1+0 レコード出力
1 byte copied, 0.00045496 s, 2.2 kB/s
takk@deb9:~/tmp$

書き変わったか確認。

takk@deb9:~/tmp$ !st | 5243904
takk@deb9:~/tmp$ strings a.bin -td | grep 5243904
5243904 TELLO
takk@deb9:~/tmp$ 

もう一度、イメージファイルをマウントして、中身を確認します。

takk@deb9:~/tmp$ sudo mount a.bin test
takk@deb9:~/tmp$ sudo chmod 777 test
takk@deb9:~/tmp$ cd test
takk@deb9:~/tmp/test$ cat hello.txt
TELLO
takk@deb9:~/tmp/test$ 

hello.txtの中身がTELLOに変わってます。
まったく読めなくなると予想してたんですが、意外と簡単に操作できるものなんですね。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA