如何像Hippomocks一样拦截免费函数调用?

4

我想知道Hippomocks如何拦截exit函数调用,例如下面的代码所示:

   MockRepository mocks;
   mocks.ExpectCallFunc(exit).With(2).Throw(std::exception());

阅读源代码。这是了解源代码功能的唯一途径。 - Puppy
@Puppy:在发布消息之前,确保我已经尝试过了。 - Guillaume Paris
2个回答

6
它将传递的函数(在此情况下为简单的函数指针)转换为char *,请求操作系统允许写入它(在Unix上使用mprotect,在Windows上使用VirtualProtect),然后将前5到14个字节修改为无条件跳转指令。它将具有相同签名的生成函数的地址放在该位置,有效地覆盖了该函数。
如果您愿意,可以直接重用HippoMocks的代码,通过使用正确的参数在堆栈上构造Replace类对象。您还可以复制代码(在GitHub上最新的hippomocks.h支持32/64位x86、ARM和thumb)。它大约在第200行左右,所以相对较高。您还需要复制horrible_cast类和Unprotect类;第一个允许将成员函数指针转换为任何其他类型(这是reinterpret_cast无法实现的),而第二个则包装了特定于操作系统的取消保护(和重新保护)调用。
在清理 C++11 代码时,我还提取了恰好这个子集,因此您现在可以使用 detail/replace.h 文件获取仅执行此操作的代码。要获取直接链接,请查看 https://github.com/dascandy/hippomocks/blob/cpp11/HippoMocks/detail/replace.h

5

负责拦截的代码位于hippomocks.h文件中。它修改内存保护标志以允许写入提供的函数指针地址,然后在函数初始字节的位置写入跳转指令。当不再需要挂钩时,将恢复原始字节。例如,Microsoft Detours库使用相同的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接