Windowsでファイルの内容をバイナリダンプで確認する:Tech TIPS
ファイルの内容を正確に16進数表示でダンプ出力させて調査するには、Windows OS付属のdebugコマンドが利用できる。ただしMS-DOS時代のデバッガなので制約が多い。ダンプ出力には[d]コマンドを繰り返し実行する。
対象OS:Windows 2000/Windows XP/Windows Server 2003
解説
システムのトラブル・シューティングや各種設定の確認作業などにおいて、ファイルの内容を正確に確認したいことがある。例えば、アプリケーションが出力したデータ・ファイルの内容が一部化けていたり、欠落していて正しく読めない、バイナリ・データが含まれている、サイズが期待したものとはわずかに異なる、何かおかしな文字コードや制御コードが入っているようだなど、といった場合、その内容を正確に調査するには、ファイルの内容を16進数でダンプ(出力)できるとありがたい。
しかしWindows OSには、ファイルの内容を表示するツールとしてはテキスト・エディタ(メモ帳)ぐらいしか用意されていない。メモ帳でバイナリ・ファイルを開いた場合、不明なデータ(文字コード)の部分は文字化けして表示されるし、1byteごとに16進数で表示してくれるわけでもないので、内容を正確に把握するのは困難である。
- 関連記事: バイナリ・ファイルの内容をメモ帳で確認する
だが非常に機能は限られるものの、「debug」コマンドを使えば、その内容を16進数でダンプ出力させることは可能である。本TIPSでは、debugコマンドでファイルの内容を16進出力させる方法について、簡単に解説する。
操作方法
debugは、いわゆるデバッガと呼ばれるソフトウェアであり、主にマシン語レベルでのデバッグ作業に利用されるツールである。これはMS-DOSの時代から使われているコマンドであるが、Windows OS時代になってからはほとんど使われなくなっている(今でもWindows OSに同梱されているが)。だがファイルの内容を16進ダンプ出力させるといった用途なら、これでも役に立つ。ただし非常に設計の古いプログラムであり、かなり機能制約があるので注意していただきたい。主な制約は次の通りである。
- 扱えるファイルのサイズはせいぜい64Kbytesまで――本来ならば数百Kbytesのファイルも扱えるが(手元では400Kbytes程度まで可能であった)、64Kbytesを超える部分をダンプ出力するためには、x86アーキテクチャの「セグメント」を理解しなければならず、初心者には困難である。よって64Kbytes程度までのファイルにしておいた方がよい。
- 8.3形式の短いファイル名しか扱えない――Windows 9x以降、FATファイル・システム上でも長い形式のファイル名が利用できるが、debugはいわゆるDOSプログラムなので、8.3形式の短いファイル名しか扱えない。
- ファイル・サイズやオフセットの表示はすべて16進数で行われる――もともとマシン語用のデバッガなので、10進数は扱えない。見たい場所の指定やdebugからの表示などはすべて16進数で行われる。
●debugの起動とファイルの読み込み
debugで(バイナリ)ファイルの内容を確認するためには、まずコマンド・プロンプトを開き、debugコマンドの引数として対象となるファイル名を与える。ただし、すでに述べたように、debugは8.3形式の短いファイル名しか解釈できないので、まず「dir /x」コマンドで短いファイル名を表示させ、それを引数として渡す必要がある。
C:\>dir ed* /x ……「/x」オプションで8.3形式のファイル名を確認する
ドライブ C のボリューム ラベルは NTFSSYSTEM です
ボリューム シリアル番号は 1C30-CE21 です
C:\ のディレクトリ
2006/07/24 14:29 8,192 EDB-20~1.CHK edb-20060724.chk
↑8.3形式 ↑長い形式
1 個のファイル 8,192 バイト
0 個のディレクトリ 6,899,363,840 バイトの空き領域
C:\>debug EDB-20~1.CHK
ここでは、edb-20060724.chkというファイル(とあるシステム・ファイル)を開いてみることにする。まず「dir /x」で8.3形式のファイル名を表示させ、その結果(ここでは「EDB-20~1.CHK」)をdebugの引数として与える。
ここでは「edb-20060724.chk」というファイルの内容を確認しようとしているが、これは長い形式のファイル名なので、「dir /x」コマンドで8.3形式のファイル名を表示させている。
- 関連記事: 8.3形式の短いファイル名を表示させる
ファイル名が「EDB-20~1.CHK」であると確認できたので、これを引数としてdebugコマンドを起動する。
●16進数でダンプ出力させる
debugが起動すると、次のようなウィンドウが表示される。コマンド・プロンプトのウィンドウ・サイズが急に小さくなって80文字×25行になってしまうが、これは、debugが16bitコードのプログラムだからである。
ファイルが正しくオープンできるとこのようなウィンドウが表示されるが、ファイル名指定が間違ったり、オープンできない場合は「ファイルが見つかりません.」と表示されるので、[q]と[Enter]キーを押してdebugを終了し、もう1度やり直していただきたい。
16進数でダンプさせるためのコマンドは[d]である。[d]キーと[Enter]キーを押すと、128bytes分(1行16bytes×8行分)表示され、また入力待ちになる。
128bytes×2回分ダンプしてみたところ
1回[d]キー(と[Enter]キー)を押すと、128bytes分ダンプ出力される。繰り返し[d]を入力すると、もっと先まで見ることができる。
(1)[d]はユーザーが入力したコマンド(dはdumpの略)。
(2)ファイルの先頭からのオフセット(位置)が4桁の16進数で表されている。ただし先頭は「0100(これは16進数なので、10進数に直すと256)」になる。
(3)ファイルの内容が1byteずつ、16進数形式で表示されている。1行に16bytesずつ並んでいる。
(4)(3)のバイナリ・データを、文字コードと解釈して表示した内容。ただしデフォルトでは漢字は表示されない。この例では、バイナリ・データと文字列が混じっていることが分かる。
(5)1回[d]を実行すると、8行分(128bytes分)表示し、自動的に止まる。[d]の後ろには表示範囲を指定することも可能であるが、詳細はヘルプを参照のこと。
(6)さらにもう1回[d]を入力したところ。先ほどの続きから、さらに128bytes分、ダンプ出力されている。
[d]コマンドには、ダンプする範囲を指定することもできるが(「d100 1000」などとする)、引数なしで[d]だけを繰り返し入力していれば、自動的に順次ダンプ出力される。
行き過ぎてしまった場合は、[d100]などとすれば、また0100のオフセット位置からダンプ出力させることができるが、面倒なら1度debugを終了してから、もう1度やり直してもよいだろう。
ダンプ結果は上の画面の通り、16bytesずつ区切られながら表示される。右側には(ASCIIコードによる)文字も表示されているので、文字データの内容を確認することも可能である。デフォルトでは、1bytes系のASCIIコードになっているが、[kk]コマンドを実行すると、以後は漢字コード(Shift-JISコード)で表示される。
●終了方法およびそのほかのコマンドについて
内容の確認が終わったら、[q]と[Enter]キーを押せば、debugは終了する(qはquitの略)。また[?]コマンドでヘルプが表示されるし、[r]コマンドを使えば、読み込んだファイルの長さを16進数で確認することができる(この結果はdebugへの読み込み直後のみ有効。レジスタの内容を操作すると変更される)。
-r ……これは実はレジスタの内容を表示させるコマンド
AX=0000 BX=0000 CX=2000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=2D97 ES=2D97 SS=2D97 CS=2D97 IP=0100 NV UP EI PL NZ NA PO NC
2D97:0100 3F AAS
-q ……終了コマンド。よく分からなくなったら[q]と[Enter]を押せばよい
C:\>
ファイルの長さは「BX=〜〜 CX=〜〜」と表示される(BXが上位16bit、CXが下位16bit)。この例では、「BX=0000 CX=2000」となっているので、「00002000(16進数)」=「8192(10進数)」ということが分かる。ファイルの先頭はオフセット「0100(16進数)」の位置から始まるので(0でないのは、OS側の事情による)、このファイル全体は「0100〜20FF(16進数)」の範囲に表示されることになる。この範囲よりも先をダンプすることもできるが、その内容に意味はない。
■関連記事(Windows Server Insider)
- Windows 2000のレジストリ ファイルはUnicode形式(TIPS)
- メールの文字コードを理解する(TIPS)
- 文字コードを変換する(TIPS)
- Outlook 2002におけるメッセージ・エンコーディングの問題点(TIPS)
■更新履歴
【2006/07/29】ファイルの長さはCXだけでなく、BX:CXの32bitで保持されているという情報を加筆・修正しました。
【2006/07/29】初版公開。
■この記事と関連性の高い別の記事
- Windowsでバイナリファイルの内容をメモ帳(notepad)で確認する(TIPS)
- これだけは覚えておきたいWindowsのコマンドプロンプトの使い方(TIPS)
- volrestコマンドでシャドウ・コピーから以前のバージョンのファイルを取り出す(TIPS)
- テキスト・ファイルの行末コードを変更する(TIPS)
- 大量のユーザー・アカウントを一括登録する(TIPS)
Copyright© Digital Advantage Corp. All Rights Reserved.