Windows 如何查找来电者信息?

Windows 如何查找来电者信息?,windows,winapi,Windows,Winapi,这需要一些背景知识。我使用绕道来拦截系统调用。对于那些不知道迂回是什么的人来说,它是一种将对系统函数的调用重定向到迂回函数的工具,它允许我们在实际系统调用之前和之后做任何我们想做的事情。我想知道的是,是否有可能以某种方式找到进行此系统调用的dll/模块的任何信息?有任何win32 api函数可以帮助我做到这一点吗 假设traceapi.dll在kernel32.dll中对GetModuleFileNameW()进行系统调用。Detour将截获此调用并将控制重定向到Detour函数(比如Mine_

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


假设traceapi.dll在kernel32.dll中对GetModuleFileNameW()进行系统调用。Detour将截获此调用并将控制重定向到Detour函数(比如Mine_GetModuleFileName())。现在,在My_GetModuleFileName()中,是否可以发现此调用源自traceapi?

我不知道堆栈上有多少堆栈帧属于迂回代码。很容易在调试器中找到,很可能没有。这使得使用_ReturnAddress内在函数获取调用方的地址变得简单。VirtualQuery()要获取基址,请将其强制转换为HMODULE并使用GetModuleFileName()。嗯,非绕道的那个:)


如果有迂回的堆栈帧,那么它会变得更加困难。StackWalk64()跳过它们,如果存在FPO帧,则会发生危险。

使用第一个参数调用
ZwQuerySystemInformation
系统进程和线程信息。 获得返回的buf后,将其键入
PSYTSTEM+PROCESS\u 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和更高版本上运行良好。

我编写了以下代码,但我得到了垃圾值作为模块名。void func(void){char module_name[1024];MEMORY_BASIC_INFORMATION32 module_base_address;if(VirtualQuery(_ReturnAddress(),(PMEMORY_BASIC_INFORMATION)&module_base_address,sizeof(MEMORY_BASIC_INFORMATION32))<0){无法消除编译错误。将module_name声明为wchar t[]所以你没有中文。或者使用GetModuleFileNameA()。仍然没有。模块名没有打印。void func(void){TCHAR Module_name[4096];PMEMORY_基本信息模块_base_地址;printf(“返回地址:%x\n”,_ReturnAddress());Module_base_地址=(PMEMORY_基本信息)malloc(内存_基本信息));虚拟查询(_ReturnAddress(),module_base_address,sizeof(module_base_address));printf(“基址:%x\n”,module_base_address->BaseAddress”);GetModuleFileName((HMODULE)module_base_address->BaseAddress,module_name,4096);std::wcoutCheck函数返回值。调用GetLastError()当您得到FALSE时。这是我的输出:返回地址:1319e3从VirtualQuery()返回=28错误代码=0基地址:131000从GetModuleFileName()返回=0错误代码=126模块名称: