10

CreateWindowExA/CreateWindowExWへの呼び出しをインターセプトするためにプロキシ DLL を使用しています。一部のアプリケーション (特に一部の Visual Basic 6 アプリケーション) は、2 つの機能のいずれも使用せずにウィンドウを作成できるように見えることを除いて、これはうまく機能します。Spy++のようなツールはウィンドウを表示できますが、フックされた関数はそれらに気づきませんでした。

私の最初の疑いは、おそらくこれらの (古い) アプリケーションはCreateWindowA/CreateWindowWを使用してウィンドウを作成するということでしたが、少なくとも私のコンパイラ (MSVC6 から MSVC10 まで) では、CreateWindow単なる #define; です。ドキュメントの備考セクションはこれを確認します。

私の 2 番目のアイデアは、Windows の作成を検出するためにCBT hookusingをインストールできるかもしれないということでした。SetWindowsHookExただし、結果は同じです。このフックは、フックされた API 関数と同じウィンドウを認識しますが、Spy++ で表示されるすべてのウィンドウを認識するわけではありません。

だから私の質問は: CreateWindowA/CreateWindowWが #define ではなく、実際の関数だった時代があったのでしょうか? user32.dllおそらく互換性の理由から、この関数はまだ によってエクスポートされていますか? この関数のハンドルを取得してフックするにはどうすればよいですか?

または、関数を作成するために使用できる他の、おそらく文書化されていない関数がありNtCreateProcessますCreateProcessか?

4

2 に答える 2

7

3 つの簡単な推測:

1) VB アプリが実際に内部で「DialogBox」API (DialogBoxParam、CreateDialogIndirect など) を呼び出している可能性はありますか?

2) 64 ビット OS を実行しており、64 ビットの user32.dll をフックしています。その結果、32 ビット アプリは夢中になりません。c:\windows\syswow64 に user32.dll の 32 ビット コピーがあります。

3) アプリが使用している user32.dll をフックしていません。古いアプリの多くは、何らかの DLL リダイレクトを取得している可能性があります。コマンド プロンプトで、c:\windows\winsxs ディレクトリから "dir /s user32.dll" を実行します。ここには、user32.dll の他のコピーが少なくとも 1 つ表示されます。これがいつ発生するかは忘れてください。ただし、「winsxs」を Bing して、サイド バイ サイド ディレクトリが新しい Windows OS リリースでの互換性の問題をどのように解決するかについての議論を得ることができます。

#3があなたの問題の理由だと思います。

于 2011-05-19T06:43:08.470 に答える
1

あなたの問題は、VB アプリが GetProcAddress() を使用して CreateWindow**() 関数を呼び出していることにあると思います。GetProcAddress をフックすると、これを確認できるはずです。

于 2012-09-13T07:43:18.543 に答える