3

私は Delphi XE2 で書かれたリソース リーク検出ユニットに取り組んでいます。ハンドル (ファイル ハンドル、イベント ハンドルなど) と GDI オブジェクト (ビットマップ、ブラシなど) の作成と削除を監視したいと考えています。そのため、ハンドルまたは GDI オブジェクトが作成されるたびにリストに追加し、削除されたら削除します。このようにして、リークや重複削除を検出できます。これを実現するために、インポート テーブルを変更して、静的にリンクされた API をフックします。遅延ロードされた、または GetProcAddress によって取得された API は、別の方法でフックされますが、それは私の質問にとって重要ではありません。

背景情報はここまでにして、質問に移りましょう。

静的にリンクされた関数のフッキング アルゴリズムを作成していたとき、PE ファイル形式、特にインポート テーブルを調べる必要がありました。一部のインポートされた関数 (私の場合は「CloseHandle」など) が 2 回インポートされていることに気付きました! 一部のモジュールが複数回表示されることもわかりました。たとえば、モジュール「kernel32.dll」は、私が取り組んでいたアプリケーションの 6 回発生しました。

私の質問は、一部の関数がインポート テーブルに複数回表示されるのはなぜですか。また、一部のモジュールがインポート テーブルに複数回表示されるのはなぜですか?

私のアプリケーションでは、関数の出現箇所をすべて自分の関数 (フック) に置き換えるだけですが、これらの重複の理由は何だろうと思っていました。理由がわかったら、アプリケーションを変更する必要があるかもしれません。

4

1 に答える 1

2

外部インポートを異なる単位で複数回宣言すると、インポート テーブルに複数回表示されます。コンパイラ/リンカーはそれらを一緒にマージしません。

同じユニットで外部インポートを複数回宣言すると、コンパイラ/リンカーはそれらを 1 つにマージします。

については、ユニットCloseHandleで宣言しています。Windowsしかし、さらに、ユニットWindowsAPIs.incによって含まれていることが宣言されています。Systemこれは、初心者向けの 2 つの宣言です。明らかに、あなたのプログラムは を再宣言する他のユニットを使用していますCloseHandle

于 2013-06-25T10:01:36.307 に答える