0

同じプロジェクトの2つのdelphiで生成されたexeファイルがあります。1つのexeはかなり前に生成され、2番目のexeは現在のソースコードを使用して最近生成されました。現在、これら2つのexeファイルのサイズに違いがあります。サイズが異なる理由を見つけ、新しいexeに誤って新しい機能が追加された場合に方法を見つける方法はありますか?exeはバイナリであるため。読み取り可能な形式に変換できますか?または他のヒント/コメント?手伝ってくれてありがとう。

注:1番目のexeが生成されるソースコードがありません。したがって、ソースコードを比較することはできません。:(

4

2 に答える 2

2

ネイティブのIntelx86またはx64実行可能ファイルを逆アセンブルし、テキストアセンブラー命令を吐き出すツールがありますが、ネイティブコードにコンパイルするときに元のソースコードからのテキストはほとんど保持されないため、この逆アセンブラーで生成されたテキストはおそらく機械語で生成されますアルファベットスープ。機械的には正しいが、人間的にはぎこちない。

新しいexeファイルと古いexeファイルの両方をasmテキストに逆アセンブルしてから、テキスト差分ツールを使用してasmテキスト間の違いを比較してみてください。これにより、小さな変更によるdiffツールのノイズが減少し、大きなdiffログが作成されます。これは、小さな変更によって、その後にすべてのグローバルオフセットが変更されるためです。分解されたasmテキストは、グローバルオフセットの依存関係が少なくなるはずです。

難しい真実は、Intel asm命令とDelphiコンパイラコード生成パターンを理解している人がいない場合、この逆アセンブル手順でさえ、2つのexeが異なるサイズである理由を理解するのに役立つ多くの有用な情報を生成しない可能性があります。たとえば、exeサイズが500kの重要なアプリでは、スタックフレームとスタックフレームの削除などのさまざまなコンパイラオプションを使用してコンパイルしたり、デバッグモードと非デバッグモードでコンパイルしたりすると、10kの違いが生じる可能性があります。

新しいexeの参照をWriteln()に追加しても、その10kの大部分を占める可能性があります-RTLのテキストIOルーチンは、何かが使用しない限り、exeからスマートにリンクされ、Writelnに触れるとサポートルーチンのフォレスト全体に触れますRTL内。古いexeがWritelnを使用していなかったが、新しいexeが使用している場合、新しいexeはWritelnサポートルーチンを実行します。

于 2012-08-07T00:03:02.917 に答える
1

http://corelabs.coresecurity.com/index.php?module=Wiki&action=view&type=tool&name=turbodiffのturbodiffを使用して、2つの実行可能ファイルの違いを確認できます。もちろん、IDA 5.0のフリーウェアバージョンも必要になります。これは、 http://www.hex-rays.com/products/ida/support/download_freeware.shtmlからダウンロードできます。

于 2012-08-07T10:28:46.130 に答える