[发明专利]一种构造合法堆栈返回值绕过函数调用检测的方法与系统有效
申请号: | 201610128818.0 | 申请日: | 2016-03-08 |
公开(公告)号: | CN105808256B | 公开(公告)日: | 2017-06-23 |
发明(设计)人: | 周志刚 | 申请(专利权)人: | 武汉斗鱼网络科技有限公司 |
主分类号: | G06F9/44 | 分类号: | G06F9/44 |
代理公司: | 武汉东喻专利代理事务所(普通合伙)42224 | 代理人: | 向彬 |
地址: | 430074 湖北省武汉市武汉东湖*** | 国省代码: | 湖北;42 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 构造 合法 堆栈 返回 绕过 函数 调用 检测 方法 系统 | ||
技术领域
本发明属于计算机开发技术领域,更具体地,涉及一种构造合法堆栈返回值绕过函数调用检测的方法与系统。
背景技术
目前,直播软件在直播时都可以预览到直播的内容,获取直播的显示内容都是通过注入一个动态链接库到游戏进程中,注入的动态链接库会hook进程中的d3d9.dll的Present函数来获取显卡的显示内容,为了获取到Present函数的地址,则需要先获取到IDirect3DDevice9Ex的指针,从该指针中获取函数地址,而该指针则可以通过调用CreateDeviceEx函数来获取。但是由于目前很多“外挂”会调用该函数来实现某些“外挂”功能,所以导致游戏开发商会对调用该函数的调用者进行检查,如果不是游戏自身的调用则会判断是“外挂”在调用,从而进行处罚。对于如何检测是谁调用了某函数,则可以利用intel x86的函数调用机制,在函数调用时会使用扩展基址指针寄存器(extended base pointer,EBP)和堆栈栈顶寄存器(Extended Stack Pointer,ESP)来保存当前堆栈的栈底地址和栈顶地址。而栈底地址存放着调用此函数的返回地址。由此,通过不断的回朔EBP寄存器来获取函数调用的返回地址,就可以获取到调用这个函数的整个调用链,从而可以区分出是否是合法的调用地址。
发明内容
针对现有技术的以上缺陷或改进需求,本发明提供了一种绕过堆栈检测的方法,此发明通过一段精心构造的汇编代码,通过不断的往堆栈中压入合法的地址来掩盖真实的调用。
为实现上述目的,按照本发明的一个方面,提供了一种构造合法堆栈返回值绕过函数调用检测的方法,包括:构造递归调用往堆栈中多次压入进程的d3d9.dll模块的代码段中的任一连续两条汇编指令序列pop ebp,retn的地址,其中压入地址的次数大于或等于堆栈检测调用的层数;在往堆栈中多次压入上述地址后,构造系统函数CreateDeviceEx需要的参数并压入堆栈,并往堆栈中再次压入上述地址后,跳转到系统函数CreateDeviceEx。
在本发明的一个实施例中,往堆栈中压入的地址的获取方式为:在进程的d3d9.dll模块的代码段中查找连续的值为0x5D,0xC3的指令的地址,其中0x5D,0xC3是汇编指令序列pop ebp,retn所对应的16进制。
在本发明的一个实施例中,所述构造合法堆栈返回值绕过函数调用检测的方法,具体为:
初始化i=n;
Void func(void)
{
将进程的d3d9.dll模块的代码段中的任一连续两条汇编指令序列pop ebp,retn的地址压入堆栈;
将i的值减一;
如果:i>=0
跳转到func();
否则
构造系统函数CreateDeviceEx需要的参数压入堆栈,并往堆栈中再次压入上述地址后,跳转到系统函数CreateDeviceEx;
}
其中,n为堆栈检测调用的层数。
在本发明的一个实施例中,所述构造合法堆栈返回值绕过函数调用检测的方法具体为:
初始化i=0;
Void func(void)
{
将进程的d3d9.dll模块的代码段中的任一连续两条汇编指令序列pop ebp,retn的地址压入堆栈;
将i的值减一;
如果:i<=n
跳转到func();
否则
构造系统函数CreateDeviceEx需要的参数压入堆栈,并往堆栈中再次压入上述地址后,跳转到系统函数CreateDeviceEx;
}
其中,n为堆栈检测调用的层数。
在本发明的一个实施例中,所述递归调用往堆栈中压入地址的次数大于等于5。
按照本发明的另一方面,还提供了一种构造合法堆栈返回值绕过函数调用检测的系统,包括递归模块、递归跳出模块,其中:
所述递归模块,用于构造递归调用往堆栈中多次压入进程的d3d9.dll模块的代码段中的任一连续两条汇编指令序列pop ebp,retn的地址,其中压入地址的次数大于或等于堆栈检测调用的层数;
所述递归跳出模块,用于在所述递归模块往堆栈中多次压入上述地址后,构造系统函数CreateDeviceEx需要的参数并压入堆栈,并往堆栈中再次压入上述地址后,跳转到系统函数CreateDeviceEx。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于武汉斗鱼网络科技有限公司,未经武汉斗鱼网络科技有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201610128818.0/2.html,转载请声明来源钻瓜专利网。