連載
» 2006年07月29日 05時00分 公開

Tech TIPS:Windowsでファイルの内容をバイナリダンプで確認する

ファイルの内容を正確に16進数表示でダンプ出力させて調査するには、Windows OS付属のdebugコマンドが利用できる。ただしMS-DOS時代のデバッガなので制約が多い。ダンプ出力には[d]コマンドを繰り返し実行する。

[打越浩幸,デジタルアドバンテージ]
「Tech TIPS」のインデックス

連載目次

対象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

debugコマンドの起動
ここでは、edb-20060724.chkというファイル(とあるシステム・ファイル)を開いてみることにする。まず「dir /x」で8.3形式のファイル名を表示させ、その結果(ここでは「EDB-20~1.CHK」)をdebugの引数として与える。

 ここでは「edb-20060724.chk」というファイルの内容を確認しようとしているが、これは長い形式のファイル名なので、「dir /x」コマンドで8.3形式のファイル名を表示させている。

 ファイル名が「EDB-20~1.CHK」であると確認できたので、これを引数としてdebugコマンドを起動する。

●16進数でダンプ出力させる

 debugが起動すると、次のようなウィンドウが表示される。コマンド・プロンプトのウィンドウ・サイズが急に小さくなって80文字×25行になってしまうが、これは、debugが16bitコードのプログラムだからである。

debugのコマンド・ウィンドウ debugのコマンド・ウィンドウ
画面サイズが急に変わり、小さくなるが、これは、debugが16bitコードのプログラムだからである。

 ファイルが正しくオープンできるとこのようなウィンドウが表示されるが、ファイル名指定が間違ったり、オープンできない場合は「ファイルが見つかりません.」と表示されるので、[q]と[Enter]キーを押してdebugを終了し、もう1度やり直していただきたい。

 16進数でダンプさせるためのコマンドは[d]である。[d]キーと[Enter]キーを押すと、128bytes分(1行16bytes×8行分)表示され、また入力待ちになる。

128bytes×2回分ダンプしてみたところ 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進数)」の範囲に表示されることになる。この範囲よりも先をダンプすることもできるが、その内容に意味はない。

■更新履歴

【2006/07/29】ファイルの長さはCXだけでなく、BX:CXの32bitで保持されているという情報を加筆・修正しました。

【2006/07/29】初版公開。


「Tech TIPS」のインデックス

Tech TIPS

Copyright© 1999-2017 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。