如何找出来电者信息?

时间:2011-01-04 12:35:50

标签: windows winapi

这需要一些背景知识。我正在使用Detours来拦截系统调用。对于那些不知道Detours是什么的人来说 - 它是一种将调用系统函数重定向到绕行函数的工具,它允许我们在实际系统调用之前和之后做我们想做的任何事情。我想知道的是,如果有可能找到任何关于使该系统调用的dll /模块的信息?是否有任何win32 api功能可以帮助我做到这一点?

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

2 个答案:

答案 0 :(得分:1)

我不知道在Detours代码拥有的堆栈上将有多少堆栈帧。很容易在调试器中找到,没有的可能性很大。这样很容易,使用_ReturnAddress内在函数来获取调用者的地址。 VirtualQuery()获取基址,将其强制转换为HMODULE并使用GetModuleFileName()。嗯,非绕道的那个:)

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

答案 1 :(得分:1)

使用第一个参数ZwQuerySystemInformation调用SystemProcessesAndThreadsInformation。 获得返回的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及更高版本上运行良好。