天天看点

windows 下实现函数打桩:拦截API方式windows 下实现函数打桩:拦截API方式

           近期由于工作须要,開始研究函数打桩的方法。

由于不想对project做过多的改动,于是放弃了使用Google gmock的想法。

可是也足足困扰另外我一天一宿。

经过奋战,最终有所收获。闲话少说,開始看看有什么方法。

1. 函数调用的原理:通过函数名(函数的入口地址)对函数进行訪问,如果我们可以改变函数首地址指向的内存的话,使其跳转到还有一个函数去运行的话,那么就行实现函数打桩了。

2. 方法:对函数首地址出写入一条汇编语言 jmp xxx (当中xxx是要跳转的相对地址)。

3. 令原函数为oldFun,新函数为newFun,那么打桩时函数跳转的相对地址 offset = newFun - oldFun - (我们制定的这条指令的大小),此处为绝对跳转指令的长度=5。

 jmp xxx一共6字节。

函数:

该函数用于查询某一段内存区域的内存信息。事实VirtualQueryEx也能够使用。

该函数用于改动指定内存区dwSize个字节的保护模式。

VirtualProtectEx 用于改变指定进程内存段的保护模式。默认情况下函数的内存空间不可写,这就是为什么要用改变保护属性的函数。

读取进程内存,lpProcess是首地址,而lpBuffer用于保存读出的数据,nSize是须要读出的字节数。

该函数用于写进程的内存空间。能够向进程内存注入想要注入的数据,比如函数等。

该函数返回一个伪进程句柄0xffffffff。不论什么须要进程句柄的内存都能够使用它。

打桩:

清桩:

 说来也怪,这个方法没有改变读取权限。竟然也能够,这里写入的方式是用WriteProcessMemory来实现,与直接用指针同理。

清桩同上。可是假设直接用指针来写就会出错,临时不知道原因。

至此我们实现了函数的打桩。可是有个小小的问题,若不过如此,对类函数中成员函数打桩有点小问题。指针无法转换。这是由于类成员函数的指针不不过一个普通的指针,他还包含其它信息。全部这里须要解决问题。网上找到了两个方法:

至此函数打桩的介绍告一段落。

资料:(非常有參考价值)

<a target="_blank" href="http://www.cnblogs.com/HeroZearin/articles/2772100.html">http://www.cnblogs.com/HeroZearin/articles/2772100.html</a>

本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5360668.html,如需转载请自行联系原作者