2010-12-07 10 views
8

ここでは、デバッグ情報によってソフトウェアをリバースエンジニアリングするのが簡単になるとの回答があります。 Visual C++を使用し、デバッグ情報を含む実行可能ファイルを他のファイル(.pdb)なしで配布すると、興味深いものが含まれますか?デバッグビルドはどのようにリバースエンジニアリングを容易にしますか?

16進エディタで実行可能ファイルを見て、シンボル名のようなものが見つからなかったので、.exeファイルは.pdbファイルの情報へのリンクにすぎません。

は、あなたはそれが

  • 変数名が含まれているかどうかを知っていますか?
  • 機能/メンバー名?
  • 行番号?
  • 何か興味深い?

答えて

9

デバッグビルドは、高水準言語構造と簡単に関連付けることができる出力を生成する傾向があります。マシンコードを見るだけで、変数、テスト、ループなどを識別できます。変数の名前は取得できませんが、通常はリバースエンジニアリングの際にはそれほど重要ではありません。

最適化されたコードOTOHは命令の並べ替え、ループの展開、複数の変数のスロットの再利用、関数間のコードブロックの挿入、小さな関数のインライン化などを行い、元の意図を識別することはかなり困難です。また、コードを所有していても、デバッグするのが難しくなります。現在の行マーカーはしばしば誤解を招くことが多く、変数が消えたりランダムに変化する傾向があります。

リバースエンジニアリングは不可能です。それは意味をいじめるだけの仕事です。

2

実行ファイルに変数名や行番号を含めないでください。エクスポートされたそのような名前(exeよりもlib/dllの可能性が高い)に対して、関数/メンバ名を含むことがあります。

「より密接に」元のソースコードに似ていますコードの構造 - 情報のISNをデバッグすると、文は再注文していたが、それはコードがインライン化されているとは考えにくいのですが、ループをアンロールしていた、など

5

のビルド't "デバッグビルド"。

「デバッグビルド」は、_DEBUGシンボルが定義されている場合にそのようなビルドです。もしそうなら、リバースエンジニア(アサートなど)に役立つたくさんの文字列があります。

リリースビルドを.pbdでデバッグ情報を使って行うことができ、プログラムをデコンパイルするのはデバッグ情報なしで難しくなります。

1

昔、デバッグ情報が実行可能ファイル(いわゆるCodeView形式)に添付されていました。最近では、ほとんどがPDBファイルで別々に提供されています。 exe自体には実際にはPDBへのリンクしか含まれていません。

PDBには通常、プライベートとパブリックの2つの味があります。公共(例えばマイクロソフトによって提供されるもの)は、通常、関数およびグローバル変数の名前のみを有する。非公開のもの(例えば、デバッグ情報でアプリケーションをビルドするときに生成されるもの)は、型情報(構造体、列挙型、クラス、変数の型)、関数プロトタイプ、ローカル変数名と型、行番号情報を追加できます。

PDBを調べる場合は、Visual Studioインストールの「DIA SDK」フォルダでDIA2Dumpをチェックしてください。

+0

+1 PDBファイルに関する情報が役立ちました – Martin

1

最適化を行うと、コードを理解しにくくなります(また、シンボルとソースを使用して独自のコードをデバッグする際に、ソースとアセンブリの間の関連付けが難しくなります)。

デバッグビルドには、行番号、関数名、行番号は含まれていません。これらはPDBに属します。ただし、assert()を使用するたびに、ファイル名と行番号を含む文字列がコードに含まれます。

関連する問題