首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何像hippomocks那样拦截一个自由函数调用?

如何像hippomocks那样拦截一个自由函数调用?
EN

Stack Overflow用户
提问于 2014-08-01 11:58:24
回答 2查看 896关注 0票数 4

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

代码语言:javascript
复制
   MockRepository mocks;
   mocks.ExpectCallFunc(exit).With(2).Throw(std::exception());
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-01 12:12:03

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

票数 5
EN

Stack Overflow用户

发布于 2014-08-28 14:11:28

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

如果需要,可以直接重用HippoMocks的代码,方法是在堆栈上构造一个带有正确参数的类替换对象。您还可以复制代码(在GitHub上最新的hippomocks.h中,支持32/64位x86、ARM和拇指)。它在200线左右,所以相对较高。您还需要复制horrible_cast类和取消保护类;第一个类允许它转换到任何其他类型的成员函数指针(这在reinterpret_cast中是不可能的),第二个类封装操作系统特有的取消保护(和重新保护)调用。

在清理C++11的代码时,我也准确地提取了这个子集,因此现在可以使用detail/replace.h文件来获取执行此任务的代码。要获得直接链接,请查看https://github.com/dascandy/hippomocks/blob/cpp11/HippoMocks/detail/replace.h

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25079768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档