16進ダンプ

データを16進数で表示させたもの

16進ダンプ(じゅうろくしんダンプ)またはヘックスダンプ: hex dump)とは、RAMファイル上のコンピュータデータの一部または全部を、16進数で画面または紙に表示させたものである。データの16進ダンプは、デバッグリバースエンジニアリングの一部としてよく行われる。

318バイトのウィキペディアのfaviconの16進ダンプ

16進ダンプでは、各バイト(8ビット)は2桁の16進数として表される。16進ダンプは、一般に1行が8バイトまたは16バイトで表され、1バイト(2桁)ごとに空白で区切って表示されることが多い。各行の先頭に16進数によるメモリアドレス、各行の末尾にチェックサムが表示される場合もある。

その名前は16進数(hexadecimal number)での出力を意味するが、16進数ダンプソフトウェアの中には8進数や10進数の出力用のオプションを持つものがある。Unixで16進ダンプを行うソフトウェアにodがあるが、これは"octal dump"(8進ダンプ)の略である。他の16進ダンプを行うソフトウェアとして、hexdump, xxdなどがある。

編集

UNIXプログラムhexdumpによって作成された、プログラムの一部の16進ダンプの例を以下に示す。

 00105e0 e6b0 343b 9c74 0804 e7bc 0804 e7d5 0804
 00105f0 e7e4 0804 e6b0 0804 e7f0 0804 e7ff 0804
 0010600 e80b 0804 e81a 0804 e6b0 0804 e6b0 0804

この例では、バイトオーダーが不確実な場合があるため、あいまいな形式の16進ダンプとなっている。そのような16進ダンプは、使用状況上バイトオーダーが決まっている場合や、次のように、指し示す値が完全な形式で意図的に与えられている場合にのみ有効である。

 00105e0 e6 b008 04e79e08 04e7bc 08 04 e7 d50804

明示的なバイトシーケンスが必要な場合(例えば、機械語プログラムの16進ダンプやROMの内容)、バイト単位の表現が好まれ、通常は8バイトグループ間のオプションの区切り文字で16バイト行に編成される。

 00105e0 e6 b0 08 04 e7 9e 08 04-e7 bc 08 04 e7 d5 08 04
 00105f0 e7 e4 08 04 e6 b0 08 04-e7 f0 08 04 e7 ff 08 04
 0010600 e8 0b 08 04 e8 1a 08 04-e6 b0 08 04 e6 b0 08 04

値の間に空白を入れない圧縮された形式も稀に使用される。

 00105e0 e6b00804e79e0804e7bc0804e7d50804
 00105f0 e7e40804e6b00804e7f00804e7ff0804
 0010600 e80b0804e81a0804e6b00804e6b00804

Unixのデフォルト表示は、通常次のようになる。これは、最近のx86(リトルエンディアン)コンピュータでの2バイトワードと同じバイトである。

 00105e0 b0e6 0408 9ee7 0408 bce7 0408 d5e7 0408
 00105f0 e4e7 0408 b0e6 0408 f0e7 0408 ffe7 0408
 0010600 0be8 0408 1ae8 0408 b0e6 0408 b0e6 0408

多くの場合、行の末尾に対応するASCIIテキスト変換が表示される(例: hexdump -C または hd)。

0000: 57 69 6B 69 70 65 64 69 61 2C 20 74 68 65 20 66  Wikipedia, the f
0010: 72 65 65 20 65 6E 63 79 63 6C 6F 70 65 64 69 61  ree encyclopedia
0020: 20 74 68 61 74 20 61 6E 79 6F 6E 65 20 63 61 6E   that anyone can
0030: 20 65 64 69 74 00 00 00 00 00 00 00 00 00 00 00   edit...........

チェックサム 編集

ホビーパソコン時代の紙の雑誌の記事に機械語プログラムが掲載された場合のような、16進ダンプをコンピュータに手入力することを意図している場合、チェックサムバイトが各行の末尾に追加される。チェックサムには、行内の全ての値の合計を256で割った余りという単純なものや、より高度なCRCが使われる。このチェックサムは、ユーザーが行を正しく入力したかどうかを判断するのに使用される。

16進ダンプのファイルフォーマットにはS-recordIntel HEXTektronix extended HEX英語版など各種あるが、いずれも各行の末尾に同様のチェックサム値がついている。

重複行の圧縮 編集

Unixプログラムのodとhexdumpでは、同じデータを含む行が連続する場合は、連続行の最初の1行以外を省略して、アスタリスクを1つだけ含む行が表示される。例えば、全てゼロのブロックは次のように出力される。

 0000000 0000 0000 0000 0000 0000 0000 0000 0000
 *
 0000030

この圧縮機能は、大きなファイルや完全なデバイスの不規則性を検査するのに便利である。最近のLinuxシステムでは、以下のコマンドで、ハードドライブ全体をスキャンして、全て空白になっているかどうかを確認のに使える。

 # hexdump /dev/sda

-vオプションを指定すると、 hexdumpとodは全てデータを明示的に表示する。

 0000000 0000 0000 0000 0000 0000 0000 0000 0000
 0000010 0000 0000 0000 0000 0000 0000 0000 0000
 0000020 0000 0000 0000 0000 0000 0000 0000 0000

odとhexdump 編集

Unix/POSIX/GNUシステムの場合、odhexdumpが、ファイルまたはストリームから8進数・16進数・またはその他の方法で、エンコードされたバイトを出力する。システムの種類に応じて、これら2つのユーティリティのどちらかまたは両方が使用可能である。以前は、BSDシステムはodを廃止してhexdumpを採用しており、GNUシステムはその逆だった。しかし、これらのユーティリティの目的は全く同じであり、オプションがわずかに異なるだけだった[1]。2002年のPOSIX以降、FreeBSD[2]とGNU[3]の両方がその決定を覆し、odとhexdumpの両方に完全に対応している。

DUMP, DDT, DEBUG 編集

初期のパーソナルコンピュータで使用されていた8ビットオペレーティングシステムCP/Mでは、標準のDUMPプログラムは、行頭に16進数オフセット、末尾に各バイトに相当するASCII文字を表示し、1行16バイトで表示した[4]。印刷可能なASCII文字の範囲(20 - 7E)外のバイトは、視覚的な位置合わせのためピリオド"."として表示された。これと同じフォーマットは、CP/Mの標準デバッガDDTDコマンドを呼び出してメモリを表示する際にも使用されていた[5]。DOSデバッガDEBUGなどでは、DUMPのフォーマットを継承したが、全体の幅を変えずに8バイト目と9バイト目の間のスペースをダッシュに変更した。

この表記法は、DR-DOSMS-DOSOS/2MS-Windowsなどの、CP/Mから直接または間接的に派生したオペレーティングシステムで保持されている。Linuxシステムでは、hexcatコマンドがこの古典的な出力フォーマットを生成することができる。このフォーマットを採用する主な理由は、標準の80文字幅の画面やプリンターに最大量のデータを収めることができる一方で、視覚的に読みやすく流し読みしやすいことである。

1234:0000: 57 69 6B 69 70 65 64 69 61 2C 20 74 68 65 20 66  Wikipedia, the f
1234:0010: 72 65 65 20 65 6E 63 79 63 6C 6F 70 65 64 69 61  ree encyclopedia
1234:0020: 20 74 68 61 74 20 61 6E 79 6F 6E 65 20 63 61 6E   that anyone can
1234:0030: 20 65 64 69 74 00 00 00 00 00 00 00 00 00 00 00   edit...........

脚注 編集

外部リンク 編集