董督秀 发表于 2024-7-20 14:40

如何判断WinAPI的调用方?

如何判断WinAPI的调用方?

例如:正在运行的进程abc.exe中,def.dll是该进程的模块之一,还可能有其他若干个dll模块。

abc.exe会调用MessageBoxA;def.dll也会调用MessageBoxA;其他模块也有可能调用MessageBoxA。

如何实现判断当前MessageBoxA的调用是来自abc.exe,还是来自def.dll,或是其他dll?

思路:
我想通过Hook MessageBoxA,根据堆栈返回值进行判断调用方,并打印出当前调用方的模块。

问题:
这种思路是否可行,如果可行,具体步骤是什么?还有没有其他思路?

DEATHTOUCH 发表于 2024-7-20 15:28

完全可行,参考很多程序出错打印调用栈的操作,就可以知道了。

Hook确实是最容易想到也是最容易实现的,其他方法我也想不出来,期待更强的高手出现。

52new 发表于 2024-7-20 18:48

看堆栈找来源

xiejuelianai 发表于 2024-7-20 20:14

HOOK,获取RSP的地址,然后读取那地址就能得到来源CALL地址了

EruditePig 发表于 2024-7-22 08:10

如果你可以用调试环境的话,用Windbg给MessageBox打上断点,这样停下来的时候直接输入k看堆栈是不是最简单

yes2 发表于 2024-7-22 08:49

思路可行,我曾经这么做过

董督秀 发表于 2024-7-22 10:25

yes2 发表于 2024-7-22 08:49
思路可行,我曾经这么做过

大佬给个示例代码参考呗。{:301_998:}

yes2 发表于 2024-7-22 11:46

给不了,前东家的产品里加的东西,我自己没有留存。即使留存了也不能外泄,虽然是很简单的东西但是职业道德还是要的。
原理你自己不是知道了吗?根据堆栈返回值就可以了

hdxzd12 发表于 2024-7-22 13:30

可以使用CaptureStackBackTrace函数获取当前线程的调用堆栈信息。这个函数会返回一组指向调用堆栈上函数地址的指针。
使用SymFromAddr等符号解析函数,将函数地址转换为函数名称和模块名称。

朱朱你堕落了 发表于 2024-7-24 08:49

已发私信,注意查收。
页: [1]
查看完整版本: 如何判断WinAPI的调用方?