メソッドフックを機能させるのにいくつか問題がありました。「I」がフックされているメソッドを呼び出すと、フックを機能させることができます。しかし、それがプロセス操作中に自然に発生する場合、それは夢中になりません。私の問題はおそらく、私がスポーンした自分のスレッドにこれらのフックを実際に設定しているという事実に起因しています。そして明らかに、LhSetInclusiveACL()メソッドはフックしたいスレッドを知る必要があります。さて、ここに私の問題があります...
どのスレッドがフックを適用するかはあまり気にしません。すべてをフックしたいのです。たとえば、プロセス「iexplorer.exe」全体にフックされた「gdi32.dll」ライブラリのCreateICW()メソッドが必要だとします。スレッドID番号48291などからだけではありません。フックすることに関心のあるルーチンを呼び出すスレッドを知るには、フックしているプロセスの内部動作についての深い知識が必要です。私はそれが一般的に実行可能ではなく、確かに私にとって実行可能ではないと推測しています。したがって、どのスレッドIDをフックする必要があるかを事前に知ることは不可能です。
次のコードは、「UnmanageHook」の例から抜粋したものです。
extern "C" int main(int argc, wchar_t* argv[])
{
//...
//...
//...
/*
The following shows how to install and remove local hooks...
*/
FORCE(LhInstallHook(
GetProcAddress(hUser32, "MessageBeep"),
MessageBeepHook,
(PVOID)0x12345678,
hHook));
// won't invoke the hook handler because hooks are inactive after installation
MessageBeep(123);
// activate the hook for the current thread
// This is where I believe my problem is. ACLEntries is
// supposed to have a list of thread IDs that should pay
// attention to the MessageBeep() hook. Entries that are
// "0" get translated to be the "current" threadID. I want
// ALL threads and I don't want to have to try to figure out
// which threads will be spawned in the future for the given
// process. The second parameter is InThreadCount. I'm
// kind of shocked that you can't just pass in 0 or -1 or
// something for this parameter and just have it hook all
// threads in that given process.
FORCE(LhSetInclusiveACL(ACLEntries, 1, hHook));
// will be redirected into the handler...
MessageBeep(123);
//...
//...
//...
}
状況を説明するコメントをLhSetInclusiveACL()メソッド呼び出しに追加しました。また、LhSetExclusiveACL()およびこれらのメソッドの「グローバル」バージョンも役に立たないようです。
参考までに、LhSetExclusiveACLのドキュメントを次に示します。
/***********************************************************************
Sets an exclusive hook local ACL based on the given thread ID list.
Global and local ACLs are always intersected. For example if the
global ACL allows a set “G” of threads to be intercepted, and the
local ACL allows a set “L” of threads to be intercepted, then the
set “G L” will be intercepted. The “exclusive” and “inclusive”
ACL types don’t have any impact on the computation of the final
set. Those are just helpers for you to construct a set of threads.
EASYHOOK_NT_EXPORT LhSetExclusiveACL(
ULONG* InThreadIdList,
ULONG InThreadCount,
TRACED_HOOK_HANDLE InHandle);
Parameters:
InThreadIdList
An array of thread IDs. If you specific zero for an
entry in this array, it will be automatically replaced
with the calling thread ID.
InThreadCount
The count of entries listed in the thread ID list. This
value must not exceed MAX_ACE_COUNT!
InHandle
The hook handle whose local ACL is going to be set.
Return values:
STATUS_INVALID_PARAMETER_2
The limit of MAX_ACE_COUNT ACL is violated by the given buffer.
***********************************************************************/
私はこれを間違って使用していますか?これが実装の大部分がこのライブラリを使用する方法であると想像しますが、なぜこれが私にとって機能しないのですか?