如何拦截像hippomocks这样的免费函数调用呢?

问题描述 投票:4回答:2

我想知道hippomocks拦截exit调用函数的功能,例如如下代码所示:

   MockRepository mocks;
   mocks.ExpectCallFunc(exit).With(2).Throw(std::exception());
c++ hippomocks
2个回答
5
投票

拦截的代码在hippomocks.h。它修改了内存保护标志以允许写入所提供的函数指针的地址,然后写入跳转指令来代替函数的初始字节。当不再需要钩子时,恢复原始字节。这与Microsoft Detours库使用的方法相同。


5
投票

它将传入的函数(在本例中是一个简单的函数指针)转换为char *,要求操作系统很好地写入它(在Windows上使用Unices和VirtualProtect上的mprotect),然后修改前5到14个字节成为无条件的跳转指令。它将生成的(使用模板)函数的地址与相同的签名放在一起,有效地覆盖了该函数。

如果你想要,你可以直接重用HippoMocks的代码,方法是在堆栈上用正确的参数构造一个类的对象。您也可以复制出代码(在GitHub上的最新hippomocks.h中,32/64位x86,支持ARM和拇指)。它在200线附近,所以相对较高。你还需要复制出horrible_cast类和Unprotect类;第一个允许它将成员函数指针强制转换为任何其他类型(使用reinterpret_cast是不可能的),第二个包含特定于操作系统的unprotect(和reprotect)调用。

在清理C ++ 11的代码时,我还提取了这个子集,因此您现在可以使用detail / replace.h文件来获取执行此操作的代码。如需直接链接,请查看https://github.com/dascandy/hippomocks/blob/cpp11/HippoMocks/detail/replace.h

© www.soinside.com 2019 - 2024. All rights reserved.