2010-04-14 87 views
5

我对Microsoft Detours图书馆有几个简单的问题。我已经使用过它(成功),但我只是想过这个功能:Microsoft Detours - DetourUpdateThread?

LONG DetourUpdateThread(HANDLE hThread);

我在别处读到这个函数实际上会挂起线程直到事务完成。这似乎很奇怪,因为大多数示例代码调用:

DetourUpdateThread(GetCurrentThread());无论如何,显然这个函数“登记”了线程,以便当事务提交(和绕行)时,如果它们位于目标函数或蹦床函数的重写代码内,它们的指令指针就会被修改“。

我的问题是:

当事务提交时,是当前线程的指令指针将成为DetourTransactionCommit函数内?如果是这样,我们为什么要打扰它更新?另外,如果入伍线程被挂起,当前线程如何继续执行(假定大多数示例代码调用DetourUpdateThread(GetCurrentThread());)?

最后,您可以暂停当前进程的所有线程,避免竞争条件(考虑到线程可能随时被创建和销毁)?也许这是在交易开始时完成的?这将允许我们更安全地枚举线程(因为看起来不太可能创建新线程),但CreateRemoteThread()如何?

感谢,

保罗

仅供参考,下面是摘录从简单的示例:

// DllMain function attaches and detaches the TimedSleep detour to the 
// Sleep target function. The Sleep target function is referred to 
// through the TrueSleep target pointer. 
BOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved) 
{ 
    if (dwReason == DLL_PROCESS_ATTACH) { 
     DetourTransactionBegin(); 
     DetourUpdateThread(GetCurrentThread()); 
     DetourAttach(&(PVOID&)TrueSleep, TimedSleep); 
     DetourTransactionCommit(); 
    } 
    else if (dwReason == DLL_PROCESS_DETACH) { 
     DetourTransactionBegin(); 
     DetourUpdateThread(GetCurrentThread()); 
     DetourDetach(&(PVOID&)TrueSleep, TimedSleep); 
     DetourTransactionCommit(); 
    } 
    return TRUE; 
} 

回答

4

如何embaressing:我 忘记来源是可用的!

DetourUpdateThread静静地忽略了当前线程的入侵。否则,给定线程暂停。我想知道为什么所有的代码示例无论如何都争取当前线程!这回答了前两个问题。

至于第三个问题: 我发现,试图通过执行以下操作暂停所有线程的另一个绕行库:通过快照中的所有线程

  1. 获取快照

  2. 循环,并暂停我们尚未暂停的线程。

  3. 如果线程被挂起,然后回到1(我们仍然跟踪我们已挂起的线程)。如果没有线程被挂起,那么我们就完成了。

我认为,假设是,如果我们可以通过所有线程循环,他们都已经悬浮(即从之前我们采取了快照),则可以尚未创建多个线程。虽然不是很确定CreateRemoteThread!

编辑:回复:CreateRemoteThread。

“进程中一次只能有一个线程处于DLL初始化或分离例程中。” CreateRemoteThread“导致调用进程中每个DLL的入口点”。如果你是在一个DllMain函数 http://msdn.microsoft.com/en-us/library/ms682437%28VS.85%29.aspx

一个新的线程不能开始执行(只要新的线程尚未引起调用每个DLL的过程入口点)。 因此,如果您在DllMain函数中应用您的弯路,您可能只是从正在创建的新远程线程的竞态条件中安全并且其指令指针位于重写的目标/蹦床函数中。

感谢,

保罗

+0

感谢分享! – Danra 2012-08-01 11:30:23