一种基于虚函数表劫持绕过安全检测的方法与系统与流程

文档序号:13250482阅读:223来源:国知局
技术领域本发明属于计算机开发技术领域,更具体地,涉及一种基于虚函数表劫持绕过安全检测的方法与系统。

背景技术:
目前,直播软件都是通过hook进程中的d3d9.dll的Present函数来获取显卡的显示内容,然后把显示内容通过网络发送到服务端就可以实现直播了。目前的hook技术都是在所要hook的函数前面插桩。插桩就是把所要hook的函数头的汇编代码修改成jmp指令跳转到自己的函数,然后自己函数调用完后还原修改处的代码,然后再跳转到原先的所要hook的函数。此方法的实现需要修改d3d9.dll的代码。但是目前很多游戏尤其是第一人称射击类游戏(First-personshootinggame,FPS)类型的游戏存在“外挂”,并且“外挂”功能的实现也会去修改d3d9.dll的代码,所以这样会导致游戏开发商尤其是FPS类型的游戏会对d3d9.dll的代码完整性进行检测,如果检测到有代码被修改则会认定是外挂,游戏会被踢下线。“外挂”不仅会hookPresent函数,还会对游戏数据进行修改,是一种不合法的调用,而直播软件只会hookPresent函数从而获取直播的显示内容,而不会对游直播数据做任何修改,是一种合法的调用,不应该被视作非法调用,因此需要一种能够在直播软件hookPresent函数获取显示内容时避免被误判断为非法调用的方法。

技术实现要素:
针对现有技术的以上缺陷或改进需求,本发明提供了一种新的hook方法,能够不通过修改代码就可以实现hook的功能,从而绕过了系统的检测。此方法在于hook的d3d9.dll的函数Present是指针IDirect3DDevice9的一个虚函数,而c++的虚函数实现是通过一个虚函数表来实现,虚函数表就是一项项的虚函数在实际内存中的地址,而IDirect3DDevice9的对象是在堆上创建的,修改此对象的虚函数表的一项只是相当于修改了堆上的数据,不涉及到修改代码,所以不会被代码完整性检测到。为实现上述目的,按照本发明的一种基于虚函数表劫持绕过安全检测的方法,包括如下步骤:(1)获取进程中IDirect3DDevice9对象的虚函数表的地址;(2)从d3d9.h头文件中找到Present函数在IDirect3DDevice9对象所在的虚函数表中的序号;(3)构造一个用于替换系统Present函数的桩函数,该桩函数用于实现:调用开发者设计的函数,以及调用系统Present函数;(4)根据IDirect3DDevice9对象的虚函数表的地址以及Present函数在虚函数表中的序号,将IDirect3DDevice9对象的虚函数表中的Present函数替换为桩函数。按照本发明的另一方面,还提供了一种基于虚函数表劫持绕过安全检测的系统,包括虚函数表地址获取模块、Present函数序号查找模块、桩函数构造模块以及Present函数替换模块,其中:所述虚函数表地址获取模块,用于获取进程中IDirect3DDevice9对象的虚函数表的地址;所述Present函数序号查找模块,用于从d3d9.h头文件中找到Present函数在IDirect3DDevice9对象所在的虚函数表中的序号;所述桩函数构造模块,用于构造一个用于替换系统Present函数的桩函数,该桩函数用于实现:调用开发者设计的函数,以及调用系统Present函数;所述Present函数替换模块,用于根据IDirect3DDevice9对象的虚函数表的地址以及Present函数在虚函数表中的序号,将IDirect3DDevice9对象的虚函数表中的Present函数替换为桩函数。本发明巧妙的利用了C++虚函数表的实现原理,通过替换IDirect3DDevice9对象所在的虚函数表中Present函数的地址,从而将IDirect3DDevice9对象的虚函数表中的Present函数替换为桩函数,从而实现了从而实现了对d3d9.dll中的Present函数的劫持,最终绕过了系统的代码完整性检测。附图说明图1是本发明基于虚函数表劫持绕过安全检测的方法的流程图;图2是本发明基于虚函数表劫持绕过安全检测的系统的结构图。具体实施方式为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。如图1所示,本发明提供了一种基于虚函数表劫持绕过安全检测的方法,包括如下步骤:(1)获取进程中IDirect3DDevice9对象的虚函数表的地址;具体地,上述获取的地址可以为进程中IDirect3DDevice9对象的虚函数表的指针。(2)从d3d9.h头文件中找到Present函数在IDirect3DDevice9对象所在的虚函数表中的序号;在本发明实施例中,在d3d9.h头文件中Present函数在IDirect3DDevice9对象所在的虚函数表中的序号是17。(3)构造一个用于替换系统Present函数的桩函数,该桩函数用于实现:调用开发者设计的函数,以及调用系统Present函数;具体地,该桩函数可以为构造的一段汇编代码函数(例如取名nakedPresentTrans),用于实现替换原有的Present函数,此段代码的功能一个是调用开发者设计的函数,另一个是调用系统Present函数。例如,该桩函数的实现可以是:具体地,在编程实现上述桩函数时,可以采用汇编、C等语言。(4)根据IDirect3DDevice9对象的虚函数表的地址以及Present函数在虚函数表中的序号,将IDirect3DDevice9对象的虚函数表中的Present函数替换为桩函数。例如具体实现方式可以为:pDeviceVt[17]=(DWORD)&nakedPresentTrans;其中pDeviceVt就是IDirect3DDevice9对象的虚函数表指针,其中17则是Present函数在IDirect3DDevice9对象所在的虚函数表中的序号,DWORD为4字节数据类型。进一步地,如图2所示,本发明还提供了一种基于虚函数表劫持绕过安全检测的系统,包括虚函数表地址获取模块、Present函数序号查找模块、桩函数构造模块以及Present函数替换模块,其中:所述虚函数表地址获取模块,用于获取进程中IDirect3DDevice9对象的虚函数表的地址;在本发明实施例中,所述虚函数表地址获取模块获取的地址可以为进程中IDirect3DDevice9对象的虚函数表的指针。所述Present函数序号查找模块,用于从d3d9.h头文件中找到Present函数在IDirect3DDevice9对象所在的虚函数表中的序号;本发明实施例中,所述Present函数在IDirect3DDevice9对象所在的虚函数表中的序号为17。所述桩函数构造模块,用于构造一个用于替换系统Present函数的桩函数,该桩函数用于实现:调用开发者设计的函数,以及调用系统Present函数;所述Present函数替换模块,用于根据IDirect3DDevice9对象的虚函数表的地址以及Present函数在虚函数表中的序号,将IDirect3DDevice9对象的虚函数表中的Present函数替换为桩函数。本发明实施例中,所述Present函数替换模块替换Present函数的具体实现方式为:pDeviceVt[Present_ID]=(DWORD)&nakedPresentTrans,其中pDeviceVt为IDirect3DDevice9对象的虚函数表指针,Present_ID为Present函数在IDirect3DDevice9对象所在的虚函数表中的序号,nakedPresentTrans为桩函数,DWORD为4字节数据类型。本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1