如何找出来电者信息?

这将需要一些背景。 我正在使用Detours来拦截系统调用。 对于那些不知道Detours是什么的人来说 – 这是一个把系统function调用redirect到绕行function的工具,它允许我们在实际系统调用之前和之后做任何我们想做的事情。 我想知道的是,如果有可能找出任何有关该系统调用的DLL /模块的任何信息? 是否有任何win32 APIfunction帮助我做到这一点?

让我们说traceapi.dll在kernel32.dll中对GetModuleFileNameW()进行系统调用。 Detour将拦截这个调用并将控制redirect到一个绕道函数(比如Mine_GetModuleFileNameW())。 现在在Mine_GetModuleFileNameW()里面,是否有可能发现这个调用来自traceapi?

使用第一个参数SystemProcessesAndThreadsInformation调用ZwQuerySystemInformation 。 一旦你有返回的buf,将其转换为PSYTSTEM+PROCESS_INFORMATION并使用其字段来提取您的信息。

 status = ZwQuerySystemInformation ( SystemProcessesAndThreadsInformation, buf, bufsize, NULL); PSYSTEM_PROCESS_INFORMATION proc_info = (PSYSTEM_PROCESS_INFORMATION) buf; proc_info->ProcessName, which is a UNICODE_STRING will give you the calling process name. 

请注意,我所说的结构和字段没有记录,并可能在将来的Windows版本中发生变化。 但是,我正在使用它,它在WIN XP及以上版本上正常工作。

我不知道Detours代码拥有多少个栈帧。 在调试器中很容易发现,有没有好的可能性。 这很容易,使用_ReturnAddress内在来获取调用者的地址。 VirtualQuery()获取基地址,将其转换为HMODULE并使用GetmoduleeFileName()。 那么,非绕道一:)

如果有Detours堆栈帧,那么它会变得更加困难。 如果存在FPO帧,StackWalk64()将跳过它们,危险。