2011-07-06 11 views
6

EDITは:ユーザ定義/ライブラリ関数とコンパイル済みファイルを区別するにはどうすればよいですか?

私が欲しいのは静的にリンクされライブラリ関数とコンパイルされたファイル(例えばPEファイル)内のユーザー自己書かれたの機能を区別することです。

これを達成する方法は? (私はデータベースの比較を考えていますが、データベースは分かりません)

ちなみに、私はこの質問をする前にすでに知っていましたが、動的にリンクされたライブラリ関数のためのものです。テーブル(PEの)。


ライブラリ関数では、ライブラリで定義されているものを意味します(これは悪い名前です)。

ユーザー定義関数とは、個々のプログラマーが作成した関数を意味します。

この目標を達成するためのプログラム的な方法はありますか?

今、私はデータベースとバイナリを比較することを考えていますが、これまでのところデータベースはありません。

回答としてデータベースまたは別の方法をお勧めします。ありがとうございました。

+0

IDAディスアセンブラには、この種の情報を判断しようとする「FLIRTシグネチャ」ファイルがあり、適度に成功しています。前にプログラムされているので、可能です。私はそれを行うには大規模な努力だと確信している、あなたは自分自身を生成するか、他人の署名を使用する必要があります。また、100%の成功率ではありません。*特に最適化されたファイル*の場合。ファイルが最適化されていれば、どの機能がライブラリのものなのかを正確に把握することは、ほとんど不可能です(IDAのような素敵なツールを使用しても)。デバッグビルドには – shelleybutterfly

+0

を使用すると、より実現可能性があります。しかし、IDAがまだそれを行うことができない限り、あなたが自分のソリューションをここにロールしようとすると、長い道のりを歩むことになります。非常に不完全で、高度に最適化されたファイルでは100%にも達しません。 http://www.hex-rays.com/idapro/(デモバージョンの機能はどれくらいあるのか分かりませんが、少なくともアイデアを与える必要があります。 ) – shelleybutterfly

+0

@shelleybutterfly実際には、この質問の私の目的は、IDAがこれをどのように達成するかを尋ねることです。 –

答えて

1

この回答は、他のインポートライブラリ(.libと静的にリンクされていない.dllファイル)と動的にリンクされた標準のWindows実行可能ファイルを分析したいと仮定しています。この場合、interperet PE(Portable Executable)ファイル構造。

ここでは、PEヘッダをダンプするサンプルコードとともに、開始するのにgood articleです。

外部ライブラリ呼び出し用のインポートテーブル(.idataセクション)と、実行可能ファイル内で定義され、エクスポート可能とマークされた呼び出し用のエクスポートテーブル(.edataセクション)(通常は.dllにのみ存在します)ファイル)。

スタティックライブラリの場合、その形式はCOFFと呼ばれ、Visual Studioに同梱されているDUMPBINユーティリティがあります。このユーティリティを使用すると、素早くライブラリファイルを参照したり、必要に応じてコードの逆アセンブリをダンプできます。

のMicrosoft Visual C++の32ビットバージョンで提供されるDUMPBINユーティリティは、LINK、LIB、および EXEHDRユーティリティの能力を兼ね備えました。これらのツールの組み合わせは、 の実行可能ファイル、ライブラリ、およびDLLファイルで提供される形式と記号に関する情報を提供する機能を備えています。

COFFファイルの構造については、articleを参照してください。

関数呼び出しがlibかどうかを調べるのは難しいかもしれませんが、私が覚えているところでは、コード内のほとんどの静的lib呼び出しは実際にはサンクコールです(単純なjmp呼び出しはlibからコピーされた実際のオブジェクトコードです)、サイズは小さく(通常は約5バイト)、「ユーザ定義」はサンクではなく、bpベースのフレーム付きコールです。

+0

私の質問は:それらを区別する方法は?あなたの基準ははっきりしていないようです。 –

+0

あなたが探しているものを明確にすることはできますか?私の答えの最初の部分では、動的にリンクされたインポートライブラリを使用している場合、 "ライブラリ関数"はすべてPEファイルのインポートテーブルに表示されます。 – GalacticJello

+0

静的リンク関数とユーザー自身書き出し関数を区別するにはどうすればよいですか? –

1

プログラムがリンクされている場合、静的関数とユーザー定義関数はファイルごとに です。あなたはPEファイルのヘッダーをダンプし、 ファイルの名前が表示されます(あなたがMINGW32、または何か他のものを実行した場合-x objdumpの使用)のシンボルで 表を見て、その後、すべての機能もしそうなら

他のファイル名とその機能の後に をインポートしてください...
また、デバッグ情報がある場合は、これが簡単になるかもしれません。

関数をファイルとリンクさせた後、ファイル名を解析して関数を並べ替えることができます。エクステンション(.c/.lib/.a)を探したり、somwhereを持っているファイルのリストをチェックインしてください。 crt0ファイルを削除するように注意してください...

しかし、これは親切な解決策ですが、これはすべてのプログラムでうまくいくかどうかはわかりません。

+0

あなたが言ったのはダイナミックリンクです。 –

+0

いいえ、ダイナミックリンクの場合、フラグを読み取るだけで関数のコードはありません。ここには関数があり、そのコードは.textセクションにあります。だから、ユーザー定義コードとの違いはありません。しかし、あなたはどのソースファイルから来ているかを読むことができます... – AxFab

+0

"ソース"のデータベースを維持する必要がありますか? –

関連する問題