hexdump でダンプする(2進数8進数16進数ASCII)

hexdump でダンプする(2進数8進数16進数ASCII)

ファイルデータをダンプするコマンド

Linux コマンドでデータをダンプして確認したいときに使えるコマンドとして3種類(hexdump, xdd, od)くらいがあります。バイナリァイルの中身を確認したいときなどによく使用するコマンドです。

3種類のコマンドはいずれも16進数とASCII文字のダンプに対応しているため、この用途だとどのコマンドでも大体同じように扱えます。

ここでは hexdump について、よくある使い方をまとめます。16進数、10進数、8進数でそれぞれダンプするオプションも併せて紹介します。

バイナリデータをダンプすることで、デバッグやリバースエンジニアリングの助けになります。使いこなせるとかっこいいです。

hexdump, xdd, od の違い

hexdump, xdd, odは16進数ダンプでは同じように使えるといいましたが、違いもあります。

  • od はエンディアンの指定に対応しています。
  • xdd は 逆変換が可能です。2進数でのダンプに対応しています。

使い分けとしては hexdumpod はほぼ同等と思われます。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

あまり見やすくはないですね。

参考URL

Linuxカテゴリの最新記事