ファイルデータをダンプするコマンド
Linux コマンドでデータをダンプして確認したいときに使えるコマンドとして3種類(hexdump
, xdd
, od
)くらいがあります。バイナリァイルの中身を確認したいときなどによく使用するコマンドです。
3種類のコマンドはいずれも16進数とASCII文字のダンプに対応しているため、この用途だとどのコマンドでも大体同じように扱えます。
ここでは hexdump
について、よくある使い方をまとめます。16進数、10進数、8進数でそれぞれダンプするオプションも併せて紹介します。
バイナリデータをダンプすることで、デバッグやリバースエンジニアリングの助けになります。使いこなせるとかっこいいです。
hexdump, xdd, od の違い
hexdump
, xdd
, od
は16進数ダンプでは同じように使えるといいましたが、違いもあります。
od
はエンディアンの指定に対応しています。xdd
は 逆変換が可能です。2進数でのダンプに対応しています。
使い分けとしては hexdump
と od
はほぼ同等と思われます。2進数でダンプしたい場合や逆変換が必要な場合は xdd
を使うのがよさげです。od
は --endian
でエンディアンを指定できます。
hexdump
hexdump
コマンドは指定のファイルや標準入力の内容を、指定の形式で出力できます。
特に -C
を付けてバイナリのダンプ形式とASCIIでの表示形式を並べて確認できるのでデバッグやリバースエンジニアリングに使うことが多いです。
hexdump
にはオプションが数多く存在しており使い方もいろいろあるので、ここでは簡単によく使いそうなオプションのみまとめます。詳しい使い方は man hexdump
でマニュアルを確認してください。サンプルも載っていました。
基本的な使い方
$ hexdump [オプション] [ファイルパス]
ファイルパスの内容を指定オプションのフォーマットでダンプします。
$ echo hoge > hoge.txt
$ hexdump hoge.txt
0000000 6f68 6567 000a
0000005
こんな感じでテキスト形式ではなく、ファイル内容をバイナリデータとしてダンプします。オプションでどのような形式で表示するかを指定します。
よくやる使い方
-C
で16進数とASCIIを一緒に出力できます。さらに -v
を必要に応じて使用するとデータ全体を表示します。
# a-zの26文字+\n の27byteのファイルをダンプ
$ echo 'abcdefghijklmnopqrstuvwxyz' > input.txt
$ hexdump -C -v input.txt
00000000 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 |abcdefghijklmnop|
00000010 71 72 73 74 75 76 77 78 79 7a 0a |qrstuvwxyz.|
0000001b
その他オプションをまとめます。
-x: 16進数2byte区切りで表示
-x
オプションを使うと2byte区切りで4桁の16進数を表示します。4つのスペースが区切りとして表示されます。
# a-zの26文字+\n の27byteのファイルをダンプ
$ echo 'abcdefghijklmnopqrstuvwxyz' > input.txt
$ hexdump -x input.txt
0000000 6261 6463 6665 6867 6a69 6c6b 6e6d 706f
0000010 7271 7473 7675 7877 7a79 000a
000001b
リトルエンディアンなので4桁の数の末尾2桁が1byte目、先頭2桁が2byte目のデータに対応しています。
-C: 16進数1byte区切りとASCII文字を並べて表示
-C
オプションは16進数ダンプとASCII文字の表示を並べて表示します。デバッグやリバースエンジニアリング用途にはとても便利に使えます。1byte区切りで2桁の16進数を左側に、右側には1byteを1文字のASCII文字として表示します。
# a-zの26文字+\n の27byteのファイルをダンプ
$ echo 'abcdefghijklmnopqrstuvwxyz' > input.txt
$ hexdump -C input.txt
00000000 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 |abcdefghijklmnop|
00000010 71 72 73 74 75 76 77 78 79 7a 0a |qrstuvwxyz.|
0000001b
ファイルデータの16進数とASCII文字の表示が並んでいます。
-v: 連続する同じ行は * で1まとめにして表示する
デフォルトだと、ダンプするときに同じデータが連続している個所を1行にまとめて省略されます。-v
をつけて実行すると、省略せず全データをダンプします。
# 100byte の空ファイルを作成する
$ dd if=/dev/zero of=input.txt bs=100 count=1
# -v を付けて全行を表示する
$ hexdump input.txt -C -v
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000060 00 00 00 00 |....|
00000064
# -v なしだと連続する同じデータは1行にまとめて * で表示される
$ hexdump input.txt -C
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000064
-b: 8進数1byte区切り3桁で表示
-b
オプションを使うと1byte区切りで3桁の8進数を表示します。1行当たり16byteまで表示します。
# a-zの26文字+\n の27byteのファイルをダンプ
$ echo 'abcdefghijklmnopqrstuvwxyz' > input.txt
$ hexdump -b input.txt
0000000 141 142 143 144 145 146 147 150 151 152 153 154 155 156 157 160
0000010 161 162 163 164 165 166 167 170 171 172 012
000001b
8進数141 = 10進数97 = 16進数61 です。ASCIIコードでの 'a' に対応する数です。これが 'z' まで続くことが確認できます。最後の 012 は改行(\n
)に対応するデータです。
27byteがスペース区切りで3桁8進数表示で確認できます。
-o: 8進数2byte区切り6桁で表示
-b
の区切りと表示桁数が変わった感じの出力になります。
# a-zの26文字+\n の27byteのファイルをダンプ
$ echo 'abcdefghijklmnopqrstuvwxyz' > input.txt
$ hexdump -o input.txt
0000000 061141 062143 063145 064147 065151 066153 067155 070157
0000010 071161 072163 073165 074167 075171 000012
000001b
-d: 10進数2byte区切り5桁で表示
d
オプションは10進数で表示するオプションです。2byte区切りの5桁で表示します。
# a-zの26文字+\n の27byteのファイルをダンプ
$ echo 'abcdefghijklmnopqrstuvwxyz' > input.txt
$ hexdump -d input.txt
0000000 25185 25699 26213 26727 27241 27755 28269 28783
0000010 29297 29811 30325 30839 31353 00010
000001b
あまり見やすくはないですね。
コメントを書く