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

本文介绍了在Windows环境下,如何利用C++进行函数打桩,包括拦截API的技术,涉及到VirtualQuery、VirtualProtect等关键函数的使用,并探讨了对库中API打桩的三种方案,涵盖类成员函数的地址转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

            最近因为工作需要,开始研究函数打桩的方法。由于不想对工程做过多的修改,于是放弃了使用Google gmock的想法。但是也足足困扰另外我一天一宿。经过奋战,终于有所收获。闲话少说,开始看看有什么方法。

一、基础准备

1. 函数调用的原理:通过函数名(函数的入口地址)对函数进行访问,假设我们能够改变函数首地址指向的内存的话,使其跳转到另一个函数去执行的话,那么就可以实现函数打桩了。
2. 方法:对函数首地址出写入一条汇编语言 jmp xxx (其中xxx是要跳转的相对地址)。
3. 令原函数为oldFun,新函数为newFun,那么打桩时函数跳转的相对地址 offset = newFun - oldFun - (我们制定的这条指令的大小),此处为绝对跳转指令的长度=5。  jmp xxx一共6字节。

函数:

1. VirtualQuery

WINBASEAPI
SIZE_T
WINAPI
VirtualQuery(
    __in_opt LPCVOID lpAddress,   //所查内存地址
    __out_bcount_part(dwLength, return) PMEMORY_BASIC_INFORMATION lpBuffer,   //保存内存区域的buffer
    __in     SIZE_T dwLength                                                  //信息长度                                                
    );
该函数用于查询 某一段内存区域的内存信息,事实VirtualQueryEx也可以使用。

2. VirtualProtect

WINBASEAPI
BOOL
WINAPI
VirtualProtect(
    __in  LPVOID lpAddress,
    __in  SIZE_T dwSize,
    __in  DWORD flNewProtect,
    __out PDWORD lpflOldProtect
    );
该函数用于修改指定内存区dwSize个字节的保护模式。

3. VirtualProtectEx

WINBASEAPI
BOOL
WINAPI
VirtualProtectEx(
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值