アプリケーションがどのプログラミング言語で書かれたかを調べる最も簡単な方法は何ですか? プログラムのexeファイルからvbかc ++かdelphiか.netかなどを知りたいです。
14 に答える
起動して、Process Explorer で使用するランタイム DLL を確認します。
それでもすぐにわからない場合は、これらの DLL への参照を Web で検索してください。
ほとんどの逆アセンブラー (Olly を含むと思います) は、EXE または DLL に含まれるテキストを簡単に表示できます。Delphi の型には、TMyClass のように T という接頭辞が付けられることがよくあります。
DLL 参照もテキストもない小さな実行可能ファイルの場合は、SOL である可能性があります。その時点で、特定のコンパイラのイディオムを探す必要がありますが、それはほとんど当て推量です。
プログラムがどの言語で書かれたかを検出する技術があります。それは可能ですが、厳格なルールはありません。それには多くの経験が必要です (そして、「どうして…したいのですか?」という質問にもつながりますが、その方法についていくつかのアイデアがあります。
あなたが探しているのは「署名」です。署名は、コンパイラによって含まれる特定の文字列、使用されているプログラミング ツールで非常に一般的な API への参照、または含まれている文字列に表示される、使用されているツールに共通のプログラミング スタイルである可能性があります。アプリケーションで。
さらに、アプリケーションの展開方法にはスタイルがあります。展開ディレクトリにあるさまざまな構成ファイル、dll とアセンブリ、さらにはイメージ、ディレクトリ、またはアイコンです。
自己起動実行可能ファイルにラップされた Java アプリケーションには、Java ライブラリへの参照が含まれており、Java であることを示す特定のライブラリまたはファイルが同じディレクトリに含まれている可能性があります。
他の回答で示されているように、マネージ アセンブリにも特定の兆候が見られます。Reflector などで開くことができます。C# と VB がコンパイルされると「交換可能」であることは正しいですが、それらが同一であるとは限りません。Reflectorを使用して VB コードを逆アセンブルすると、アセンブリが Microsoft.VisualBasic.dll アセンブリを参照することがよくあります。Monoアセンブリへの参照が含まれている可能性が高いため、Monoアプリケーションの違いを見分けることができます。
多くのコンパイラは、特定の方法でコードをアセンブルおよびリンクし、痕跡を残します。たとえば、Process Explorerの「strings:」タブを使用してウィンドウ実行可能ファイルを調べると、多くの文字列が表示されます。これらを使用すると、exe 内のプログラミング スタイル、呼び出されたメソッド、エラーまたはトレース メソッドを特定できる場合があります。
たとえば、コンパイラはローカライズにさまざまなメカニズムを使用しています。Microsoft は、ローカライズされた文字列を XML ファイルまたはリソース ファイルに格納します。他のコンパイラは別の戦術を使用します。
もう 1 つの例は、C++の名前マングリングです。CodeWarriorコンパイラは、Visual Studio とは異なるアルゴリズムを使用して、呼び出しのメンバー変数と関数の名前をマングルします。
実行可能ファイルの系統を正確に判断することについては、本が 1 冊書けると思います。このテーマはおそらく「プログラミング考古学」と呼ばれるでしょう。
最も簡単な方法は、プログラムの開発者に尋ねることです。知識やユーティリティ プログラムは必要ありません。
- Delphi アプリケーションの決定
- eda_preview270.exe (ここから) またはその他のスパイ ツールを使用して、ウィンドウ クラス名を確認します。TButton や TfrmBlubb のように読める場合、それは VCL アプリです。それらに「Afx」がある場合、それはおそらく MFC です。
コンパイルされた言語 (これは、スクリプト言語や Java、.NET などがないことを意味します) は、CPU アセンブリ命令にコンパイルされます。これは、基本的に一方向の変換です。通常、プログラムがどの言語で記述されているかを判別することはできません。ただし、依存関係ウォーカーを使用すると、プログラムがロードしていたランタイム ライブラリ (存在する場合) を判別できる可能性があり、したがって、使用された言語 (MS Visual C++ 9 など) を判別できる可能性があります。 msvcr90.dll を使用します)。
ildasm.exeツールで開こうとすることで、.netアセンブリであるかどうかを確認できます
i'd try running the .exe thru a 'strings' program to get assorted hints.
それは良い質問です。見分ける一般的な方法はありませんが、ほとんどのコンパイラとライブラリは、結果の EXE ファイルに痕跡を残すに違いありません。それに多くの時間を費やしたい場合は、既知の言語で記述された一連の EXE を収集し、一般的な文字列をスキャンすることができます。私はあなたがいくつかを見つけるだろうと想像します。
他の誰かが言及したDependancy Walkerは、MSVCRT のバージョンなどの明らかな依存関係を探す良い方法です。
私の記憶が正しければ、PE Explorer 逆アセンブラーは、.net および Java バイナリーではなく、.net 用にReflectorまたはILDAsmツールを使用して作成するコンパイラーに関する情報を提供します。
一般的には、できません。
これをReflectorに読み込むことができれば、それがマネージ アセンブリであることがわかります。
PE 探偵は私に最適です。
私が見つけた (少なくともコンピュータ ゲームで) 最も簡単な方法は、ゲームのメイン フォルダ内にネストされた "redist" フォルダを調べることでした。自分でプログラミングした経験のある人には明らかかもしれませんが、このフォルダー内の MSI の特定の目的は、setup.exe ファイルがゲーム自体の前提条件を自動的にインストールできるようにすることです。例: Empire Total War には、「vcredist_x86-sp1.exe」という MSI があります。これは、ゲーム/プログラムが Microsoft の「Visual C 2005」で .NET Framework (通常) で作成されたことを示します。実際、MSI/EXE を開くと、インストーラーは、それが書かれている言語とバージョンをすぐに示すはずです。私がよく知っている理由は、. NET Framework をインストールし、ビジネス アプリの前提条件を自動インストールします。お役に立てれば!