1

私はほとんど監視アプリケーションを実装していないので、CreateWindowExA / Wを処理中にフックして、Windowsの作成を制御できるようにします。フックに使用する方法は、呼び出しからの最初の5バイトをフック関数へのアセンブラーJMP命令に置き換えることです。(はい、私はアセンブラーを知っています、私は以前に同じ方法を何度も使用しました)。フックコードの先頭でEnterCriticalSectionを使用し、InterlockedExchangeを使用して、CreateWindowExA / Wの先頭で書き込んだJMPを実際の5バイトに置き換えて、盗まれたバイトを復元し、関数を正しく呼び出すことができるようにします。私の経験によれば、すべてが正常である必要がありますが、JMPを実際のバイトに置き換えた瞬間に、他のスレッドが関数を呼び出し、バイトも置き換えられたように見えます... 。

IAT / EATテーブルのフックを使用できることはわかっていますが、現在のメソッドの何が問題になっているのか知りたいです... InterlockedExchangeが機能していないという問題は、CreateWindowExA / Wがdllの(comctl32.dll、shell32.dllから呼び出されていることです。 ...)ただし、メインの実行可能モジュールではありません。

誰かが私を助けてくれることを願っています。私の説明がよくわからない場合は、質問してください。再説明します。

4

3 に答える 3

2

Windows関数をフックしている場合、IATフックははるかに優れていて安全です。ただし、迂回路の使用を主張する場合は、通常、ウィンドウ側に組み込まれているホットパッチを使用することをお勧めします(これにより、迂回路の書き込みが原子的に可能になり、同期は不要になります)。

あなたの問題はあなたが言う通りです、あなたのロックはあなたの実行のスレッドを一時停止するだけで、あなたによって制御されているものは一時停止しません。これを修正するには、(PSAPI / toolhlp32を介して)これらすべてのスレッドを一時停止する必要があります。または、より効率的に、迂回した関数にチェックを追加して、宛先アドレスが迂回したいモジュールのアドレス空間にあるかどうかをチェックします。 GetModuleHandle、WinNTの一部のPE関数、および_ReturnAddress組み込み 関数を使用して実行できます。

于 2012-05-18T12:12:01.003 に答える
1

バイトを元に戻すとすぐにフックが失われ、クリティカルセクションはjmpの後であるため役に立ちません。

DXHooksのhttp://dxhook.googlecode.com/svn/trunk/dxhook.cppを見てください。必要なことを実行できると思います。

于 2012-05-18T13:00:33.387 に答える
0

CreateWindowExへのすべての呼び出しを制御できる場合は、それらをクリティカルセクションでラップできます。ただし、それができれば、関数をフックする必要はありません。

残っているのは、他のスレッドが開始する前に関数をフックすることです。おそらく静的初期化を使用して、アプリケーションの最初にこれを実行します。

この特定の機能についてもう1つ考えました。多くのアプリでは、すべてのウィンドウがメインスレッドで作成されます。その場合は、同期する必要はありません。

于 2012-05-18T12:11:32.710 に答える