首页 > 解决方案 > 如何捕捉函数调用

问题描述

注意:这个主题不是关于调试和尝试、抛出、捕捉,我不能直接在我的函数中放置任何东西,只有像 WINapi 这样的外部影响。

如果调用任何函数,我需要某种方式在我的 APP 中获取信息。它应该在运行时“捕获”函数调用,我无法为我的 APP 中存在的每个函数实现任何额外的代码。我想一些 WINAPI 应该可以工作,但我找不到合适的方法来处理来自进程的每个调用。因为信息会很高兴有 3 件事:

  1. 刚刚被调用的函数的入口点(地址)。
  2. 定义这个函数有什么返回类型会很好。
  3. 例如,它是 (int, char) 之类的参数。

PS很高兴知道我的(或其他)进程中当前正在执行多少功能。

标签: c++windowswinapivisual-c++c++14

解决方案


要在调用应用程序中的函数时执行某些操作,您必须使用/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
    }
}

为明显的放缓做好准备。

当您从_penteror调用您的函数时,您可能会遇到非常讨厌的重入问题和堆栈溢出_pleave。使用一些保护变量或只调用裸函数。

下一步是从PDB文件中提取数据,但如果你能描述你想用这些信息做什么,这会有所帮助。您是否计划重新实施分析或功能覆盖测试?

我们不能使用__func__宏,因为我们在错误的函数中这样做。也许生成详细的地图文件就足够了。我们可以得到返回地址并在地图文件中查找它。

附加链接:


推荐阅读