10

特定の Windows 実行可能ファイルまたは DLL をビルドするために使用された C または C++ コンパイラを特定するにはどうすればよいでしょうか? 一部のコンパイラは、最終的な実行可能ファイルにバージョン文字列を残しますが、これは Linux よりも Windows ではまれなようです。

具体的には、Visual C++ とさまざまな MinGW コンパイラ (通常は関数シグネチャからかなり簡単) を区別し、次に Visual C++ バージョン (6、2002/2003、2005、2008; より難しい) を区別することに興味があります。半信頼できる方法で区別できるツールはありますか?

4

3 に答える 3

11

VC バージョンを区別するためのヒントの 1 つのソースは、リンクされている特定の C ランタイム ライブラリです。デフォルトのケースは (少なくとも最近のバージョンでは) DLL にリンクするため、これはかなり簡単に行うことができます。ユーティリティDependency Walkerは、どの DLL が実際にロードされているかを確認するために不可欠であり、どの C ランタイム DLL が使用されているかを教えてくれます。Dependency Walker は Microsoft Platform SDK に含まれていますが、独立して拡張されており、リンクしたサイトは現在の開発のホームです。

VC6 と MinGW はどちらもデフォルトで MSVCRT.DLL にリンクしているため、これらを区別することはできません。少し努力すれば、MinGW を新しい C ランタイム バージョンにもリンクさせることができるため、MinGW を個別に除外する必要があります。

Runtime       VC Version
----------    -------------
MSVCRT.DLL    VC6
MSCVR80.DLL   VC8 (VS 2005)
MSCVR90.DLL   VC9 (VS 2008)

他のランタイム DLL も良い手がかりになります。たとえば、Delphi のランタイムへの参照は、EXE が実際には Delphi から構築されたものであり、C ツールチェーンではまったくないことを示している可能性があります。

シンボルが .EXE ファイルから削除されていない場合は、内部シンボルが存在する手がかりを見つけることができます。たとえば、次のような参照は_sjlj_init、setjmp/longjmp 例外処理用に構成された MinGW GCC 3.x がある時点で関与していたことを示している可能性があります。

于 2009-04-18T22:43:37.820 に答える
2

もう 1 つのオプションは、depends.exe を使用して dll がリンクしている CRT ライブラリを確認することです。MinGW
と Cygwin には、認識しやすい独自の dll があります。 VC6
は MSVCRT.dll を使用します。通常
、新しいバージョンの VS では、DLL のファイル名の横にそのバージョンが あり ます 。



これらの名前は、特に VS2002-2003 の領域では奇妙なバリエーションを持つ傾向があるため、このリストを決定的なガイドと見なさないでください。MFC や ATL dll など、同様のバージョン管理スキームを持つ他の dll もあります。

これは、PE が実際に CRT に依存しており、静的にリンクしていない限り機能します。

Delphiにもリンク先のDLLがいくつかあると思いますが、それが何であるかはよくわかりません。

于 2009-04-18T22:46:06.737 に答える
1

IDA-Proが実行する分析の一部には、コンパイラの認識が含まれています。分析のために PE を開いた後、出力ログを確認します。通常はどこかに埋もれています。

于 2009-04-18T22:21:09.090 に答える