c++ - 如何捕捉函数调用
问题描述
注意:这个主题不是关于调试和尝试、抛出、捕捉,我不能直接在我的函数中放置任何东西,只有像 WINapi 这样的外部影响。
如果调用任何函数,我需要某种方式在我的 APP 中获取信息。它应该在运行时“捕获”函数调用,我无法为我的 APP 中存在的每个函数实现任何额外的代码。我想一些 WINAPI 应该可以工作,但我找不到合适的方法来处理来自进程的每个调用。因为信息会很高兴有 3 件事:
- 刚刚被调用的函数的入口点(地址)。
- 定义这个函数有什么返回类型会很好。
- 例如,它是 (int, char) 之类的参数。
PS很高兴知道我的(或其他)进程中当前正在执行多少功能。
解决方案
要在调用应用程序中的函数时执行某些操作,您必须使用/Gh
命令行开关Enable _penter Hook Function进行编译,也许还需要/GH
Enable _pexit Hook Function。然后您可以定义在进入(离开)您的应用程序功能时将被调用的_penter
函数(也许还有)。_pexit
这些开关必须在项目属性 -> C/C++ -> 命令行中手动输入。
功能必须是naked
:
extern "C" void __declspec(naked) _cdecl _penter( void ) {
// Save registers.
_asm {
push eax
push ebx
push ecx
push edx
push ebp
push edi
push esi
}
// Your code here.
// Restore registers.
_asm {
pop esi
pop edi
pop ebp
pop edx
pop ecx
pop ebx
pop eax
ret
}
}
为明显的放缓做好准备。
当您从_penter
or调用您的函数时,您可能会遇到非常讨厌的重入问题和堆栈溢出_pleave
。使用一些保护变量或只调用裸函数。
下一步是从PDB
文件中提取数据,但如果你能描述你想用这些信息做什么,这会有所帮助。您是否计划重新实施分析或功能覆盖测试?
我们不能使用__func__
宏,因为我们在错误的函数中这样做。也许生成详细的地图文件就足够了。我们可以得到返回地址并在地图文件中查找它。
附加链接:
推荐阅读
- python - 将 git repo 文件加载到 Tensor flow.load_model() 时出现问题
- jmeter - Jmeter在不同VLAN中分布式测试
- node.js - 无法读取 Namespace.emit 处未定义的属性“事件”
- psql - 通过 psql 进行用户身份验证的问题
- python-3.x - 从 dict 构造数据框并重新标记列?
- python - 卸载并重新安装 Anaconda-Navigator 后,Conda 损坏
- php - “给定的闭包没有参数。” 在 laravel 中
- javascript - JS 没有控制 HTML 输入表单的最小 step 属性值
- javascript - 在自己的主页上获取 Chrome App Grid
- java - 将字符串添加到 JsonArray