はじめに

こんにちは!今回はhexdumpコマンドについて解説します。

hexdumpはファイルの内容を16進数(HEX)で表示するコマンドです。バイナリファイルを確認したり、ファイルの内部構造を調査したり、データが正しく保存されているか検証したりするときに使います。

「ファイルの中身を16進数で見る」って感じのコマンドですね。デバッグやセキュリティ調査でめっちゃ便利ですよ。


hexdumpコマンドとは

hexdumpは、ファイルの内容を16進数形式で表示する外部コマンドです。“hexadecimal dump"の略ですね。

バイナリファイルのダンプ表示、ファイルの整合性確認、プロトコル解析など、低レベルのデータ操作が必要な時に活躍します。複数の表示形式(16進数、8進数、10進数、ASCII)に対応していて、かなり柔軟に使えます。


基本構文

1
hexdump [オプション] ファイル名

ファイルの内容を16進数で表示します。標準入力からのデータも受け取れます。


主なオプション

オプション 説明
-C 標準的な16進数+ASCII表示(最もよく使う)
-x 2バイト単位の16進数表示
-b 1バイト単位の8進数表示
-d 2バイト単位の10進数表示
-v すべての行を表示(同じパターンも表示)
-n NUM 最初のNUMバイトのみダンプ
-s OFFSET OFFSETバイト目からダンプ開始
-A x アドレス部分を16進数表示
-A d アドレス部分を10進数表示
-A o アドレス部分を8進数表示

使用例

例1: 基本的なHEXダンプ表示

1
echo "Hello" | hexdump -C

実行結果:

1
2
00000000  48 65 6c 6c 6f 0a                           |Hello.|
00000006

Helloの内容を16進数で表示。各バイトが16進数で、右側にASCII表示が出ます。0aは改行コードですね。

例2: ファイル全体をダンプ

1
hexdump -C /etc/hostname

実行結果:

1
2
00000000  75 62 75 6e 74 75 0a                        |ubuntu|
00000007

ホストネームファイルの内容を表示。このシステムでは"ubuntu"が設定されているんですね。

例3: 最初の16バイトだけ表示

1
hexdump -C -n 16 /bin/ls

実行結果:

1
2
00000000  7f 45 4c 46 02 01 01 00 00 00 00 00 00 00  |.ELF............|
00000010  02 00                                       |..|

lsコマンドの最初の16バイト。7f 45 4c 46はELFバイナリのマジックナンバー(シグネチャ)です。

例4: オフセット付きダンプ

1
hexdump -C -s 0x100 -n 16 /bin/ls

実行結果:

1
2
00000100  01 00 00 00 14 00 00 00  01 00 00 00 47 4e  |............GN|
00000110  55 00                                       |U.|

0x100(256バイト目)からダンプを開始。指定した位置からのデータを確認できます。

例5: 2バイト単位の16進数表示

1
echo "ABCD" | hexdump -x

実行結果:

1
2
0000000 4241 4443 000a
0000006

2バイト単位で16進数表示。4241は"AB”、4443は"CD"ですね。

例6: 8進数表示

1
echo "ABC" | hexdump -b

実行結果:

1
2
0000000 101 102 103 012
0000004

1バイト単位で8進数表示。101は’A’(8進数)です。

例7: 10進数表示

1
echo "ABC" | hexdump -d

実行結果:

1
2
0000000 16961 16992 00010
0000006

2バイト単位で10進数表示。16進数を10進数で見ると、こんな数値になります。

例8: バイナリファイルの整合性確認

1
hexdump -C image.bin | head -20

実行結果:

1
2
00000000  89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48  |.PNG........IH|
00000010  44 52 00 00 00 64 00 00 00 64 08 06 00 00  |DR...d...d......|

画像ファイルの先頭20行を表示。89 50 4e 47はPNGファイルのシグネチャですね。

例9: 改行を含むテキストファイル

1
echo -e "Line1\nLine2" | hexdump -C

実行結果:

1
2
00000000  4c 69 6e 65 31 0a 4c 69  6e 65 32 0a        |Line1.Line2.|
0000000c

改行は0aで表示されます。複数行のテキストの構造を確認できます。

例10: 重複行も含めて表示

1
hexdump -C -v largefile.bin | head -30

実行結果:

1
(重複するパターンもすべて表示される)

通常は同じパターンが*で表示されますが、-vで全行を表示できます。大きなファイルで便利。


Tips・注意点

hexdumpがない場合の代替案

環境によってはhexdumpがインストールされていないことがあります。その場合:

1
2
3
4
5
6
7
8
# xxdコマンド(hexdumpと似ている)
xxd file.bin

# odコマンド(古いUNIX標準)
od -t x1 file.bin

# Python使用
python3 -c "import sys; print(sys.stdin.buffer.read().hex())"

-Cオプションが最も便利

1
hexdump -C filename

16進数とASCII両方が同時に見られるので、これを基本にするといいですよ。

大きなファイルはパイプでフィルタ

1
2
hexdump -C largefile.bin | head -20  # 最初の20行だけ
hexdump -C largefile.bin | grep "text"  # 特定のパターンを検索

headgrepと組み合わせると、探しているデータを素早く見つけられます。

ファイルサイズの確認

1
hexdump -C file.bin | tail -1

最後の行を見れば、ファイルサイズが分かります。


実践的な使い方

バイナリファイルのシグネチャ確認

1
hexdump -C -n 16 document.pdf

PDFファイルは25 50 44 46(%PDF)で始まります。ファイルの種類を判定できます。

ネットワークダンプの解析

1
tcpdump -x | hexdump -C

ネットワークキャプチャをダンプ表示して、パケット内容を確認。プロトコル解析に便利ですね。

暗号化ファイルの検証

1
hexdump -C encrypted.bin | head -10

暗号化されたファイルが正しく保存されているか、16進数ダンプで見て確認できます。

スクリプトでの使用例

1
2
3
4
5
6
7
#!/bin/bash
file=$1
if hexdump -C "$file" | grep -q "7f 45 4c 46"; then
  echo "$file is ELF binary"
else
  echo "$file is not ELF binary"
fi

ファイルの先頭バイトでファイル形式を判定するスクリプト。ELFバイナリ判定ですね。


まとめ

hexdumpコマンドのポイント:

  • 16進数ダンプ表示 - バイナリファイルの内容を確認
  • -C: 最も便利な形式(16進数+ASCII同時表示)
  • -n: 先頭のNバイトだけ表示
  • -s: 指定位置からダンプ開始
  • -x, -b, -d: 異なる形式(2バイト16進数、8進数、10進数)
  • -v: すべての行を表示(デフォルトは重複行を省略)
  • よく使う組み合わせ: hexdump -C, hexdump -C -n 16

ファイルの内部構造を深く理解したい時、バイナリ解析をする時に活躍するコマンド。16進数が読めるようになると、ファイル形式の仕組みが見えてきて面白いですよ!