一种用于获取显卡内容的内联hook方法和系统与流程

文档序号:12365189阅读:415来源:国知局

本发明涉及游戏直播领域,具体涉及一种用于获取显卡内容的内联hook方法和系统。



背景技术:

在软件技术中,hook指修改程序的汇编代码,即:修改程序原函数的汇编指令为jmp指令,使程序跳转到伪造函数处,执行完伪造函数逻辑后,再跳转到原函数汇编指令继续执行原函数逻辑。

当前,为了给观众呈现较好的游戏直播画面,游戏直播软件均会采用游戏厂商所认可的hook方式,即主播直播时,游戏直播软件对游戏客户端进程DirectX 9动态链接库模块中的Present函数进行hook,游戏直播软件便能够获取显卡中的显示内容,并将显示内容通过网络发送给服务端;观众访问服务端,便能观看到高品质的主播的游戏直播画面。但游戏厂商会在游戏的客户端中加入安全检测程序,用以对检测客户端的游戏进程中的函数进行检测,判断函数是否被hook,如果被hook,则判断被hook的函数跳转的地址,若是跳转到函数所属模块外的其它模块中,则hook被判定为非法,并终止游戏的运行。

然而,游戏厂商为了加快游戏的推广,通常会和游戏直播公司进行合作,使游戏直播公司对自己的游戏进行直播推广。同时,为了游戏直播软件能够稳定运行,会对自身的安全检测程序进行相应修改,从而与游戏直播软件的hook方式进行适配,避免自身安全检测程序对游戏直播软件的hook方式产生误判。但各家游戏直播公司的游戏直播软件的hook方式均不相同,游戏厂商需要针对各个hook方式,对安全检测程序进行一一适应修改,从而一一适配,其工作量较为浩大,且极其繁琐。



技术实现要素:

针对现有技术中存在的缺陷,本发明的目的在于提供一种用于获取显卡内容的内联hook方法和系统,避免安全检测程序对已认可的hook方式进行误判,有效减少游戏厂商繁琐的工作量。

为达到以上目的,本发明采取的技术方案是:包括以下步骤:

步骤S1,在目标函数所属模块的函数间查找一个空隙的地址;

步骤S2,将hook功能逻辑函数写入另一个模块中,所述hook功能逻辑函数包括用以被目标函数执行的伪造函数;

步骤S3,构造一条hook指令,且hook指令使目标函数跳转到步骤S1查找到的空隙地址中;

步骤S4,目标函数再跳转到含有hook功能逻辑函数的模块中,同时目标函数执行hook功能逻辑函数中的伪造函数。

在上述技术方案的基础上,所述目标函数为游戏组件的DirectX 9动态链接库模块中的Present函数。

在上述技术方案的基础上,所述步骤S1中空隙的地址的内存大于或等于5字节。

在上述技术方案的基础上,所述步骤S3中,构造所述hook指令之前,将目标函数的内存属性修改为可写。

在上述技术方案的基础上,所述hook指令为JMP Address汇编指令,其中Address为步骤S1中查找到的空隙的地址,JMP表示跳转。

在上述技术方案的基础上,所述步骤S4中,目标函数执行完所述伪造函数后,回到原先所属的模块中,然后将目标函数的内存属性修改为只读和执行。

本发明还提供一种用于获取显卡内容的系统,该系统包括:直播端、控制端和服务端;

所述直播端用于运行游戏组件、游戏直播软件和安全检测程序,所述游戏组件包括多个模块,且每个模块包括多个函数;

所述控制端用于在含有目标函数的模块中查找一个空隙的地址,并在另一个模块中写入hook功能逻辑函数,使目标函数先跳转到空隙地址中,再跳转到含有hook功能逻辑函数的模块中,并执行hook功能逻辑函数;执行完毕后,所述控制端还用于使游戏直播软件获取显卡中显示的游戏画面,并将获取的游戏画面发送给服务端;

所述服务端用于接收游戏直播软件发送的游戏画面。

在上述技术方案的基础上,所述目标函数为游戏组件的DirectX 9动态链接库模块中的Present函数。

在上述技术方案的基础上,所述直播端和控制端均位于游戏主播的PC中,且游戏主播的PC和服务端通过互联网进行通讯。

与现有技术相比,本发明的一种用于获取显卡内容的内联hook方法的优点在于:目标函数先跳转到自身模块中,通过游戏的安全检测程序的检测后,再跳转到其它模块中hook,执行伪造函数,使游戏直播软件获取到显卡中的游戏画面。采用二级跳转的方式,通过游戏安全检测程序的检测,避免游戏中的安全检测程序对本hook方式的误判,游戏厂商也不必对已经认可的hook方式,花费额外的精力来对安全检测程序进行适配修改,使对Present函数的hook通过安全检测程序的检测,即通过游戏厂商认可的、允许游戏直播软件修改非核心游戏组件,采用游戏直播软件自身适配安全检测程序的办法,使得游戏厂商不必针对各个游戏直播软件来对安全检测程序进行修改,有效减少游戏厂商编程人员的工作量,进而减少整个游戏的制作成本。

本发明的一种用于获取显卡内容的系统的优点在于:控制端使直播端内存中的目标函数进行二次跳转,通过游戏的安全检测程序的检测,使得游戏直播软件正常获取主播显卡中的游戏画面,即避免安全检测程序对游戏厂商本身已经的认可的hook方式进行误判,也减轻了游戏厂商对安全检测程序作适配修改的工作量,同时也保证了游戏主播的正常直播。

附图说明

图1为本发明一种用于获取显卡内容的内联hook方法的流程图。

具体实施方式

以下结合附图对本发明作进一步详细说明。

参见图1所示,本发明提供一种用于获取显卡内容的内联hook方法,使游戏直播软件通过游戏厂商认可的hook方式来获取显卡显示的画面,该方法具体包括以下步骤:

步骤S1:在目标函数所属的模块中查找一空隙的地址,且空隙的地址的内存大于或等于5字节,本实施例中,该目标函数为游戏组件DirectX 9动态链接库模块中的Present函数,对该目标函数进行hook,然后游戏直播软件便能够获取到显卡中的游戏画面。被hook的目标函数所属的模块通常为一DLL(Dynamic Link Library,动态链接库)文件,且模块中的各个函数间是有空隙的,通常该空隙内填充的为16进制的0xCC数据,即填充的为未初始化的变量,因而可以很便捷的查找到一个内存大于或等于5字节的空隙的地址。

步骤S2:将hook功能逻辑函数写入到另一模块中,即将hook功能逻辑函数写入到目标函数所属模块外的其它模块中。hook功能逻辑函数包括有用以被目标函数执行的伪造函数,伪造函数具体的功能可以为:打印目标函数调用的参数、修改以及调用目标函数的参数以及改变目标函数的执行流程等。目标函数执行完伪造函数后,游戏直播软件便能够获取到显卡中的游戏画面。

步骤S3:调用Windows API函数中的VirtualProtect指令将目标函数的内存属性修改为可写,因为目标函数的代码段是只读而不可写的,所以在hook前需要将目标函数的内存属性修改为可写,然后构造一hook指令,hook指令使目标函数跳转到步骤S1查找到的空隙的地址中,hook指令为JMP Address汇编指令,此处Address为步骤S1中查找到的空隙的地址,JMP表示跳转。

步骤S4:目标函数跳转到含有hook功能逻辑函数的模块中,同时目标函数执行hook功能逻辑函数中的伪造函数,目标函数执行完伪造函数后回到原先所属的模块中,然后再将目标函数的内存属性修改为只读和执行。对于hook功能逻辑函数在模块中所处位置的内存地址,还需调用Windows API(Windows应用程序接口)函数中的VirtualProtect指令,将该内存地址的内存属性修改为可写,然后加入另一JMP Address指令,此处JMP Address指令中的JMP表示跳转,此处JMP Address指令中的Address的功能为:保存当前运行的寄存器的值,调用伪造函数,恢复寄存器的值,执行目标函数的原始指令。然后再将内存地址的内存属性修改回只读和执行。这样,当目标函数跳转到含有hook功能逻辑函数的模块中时,便能够调出伪造函数,便于被目标函数执行,当目标函数执行完伪造函数后,使目标函数跳回到原先所属的模块中。

通过以上步骤,即采用二级跳转的方式,使目标函数先跳转到自身模块中,然后再跳转到其它模块中hook,执行伪造函数,从而通过安全检测程序的检测,避免游戏中的安全检测程序对本hook方式的误判,游戏厂商也不必对已经认可的hook方式,花费额外的精力来对安全检测程序进行适配修改,使对Present函数的hook通过安全检测程序的检测,即通过游戏厂商认可的,采用游戏直播软件自身适配安全检测程序的办法,使得游戏厂商不必针对各个游戏直播软件来对安全检测程序进行修改,有效减少游戏厂商编程人员的工作量,进而减少整个游戏的制作成本。游戏直播软件便能够获取到显卡中的游戏画面了。

本发明还提供一种基于上述内联hook方法的用于获取显卡内容的系统,该系统包括直播端、控制端和服务端。直播端和控制端均位于游戏主播的PC(personal computer,个人计算机)中,服务端位于直播公司的机房内,游戏主播的PC和服务端通过互联网进行通讯。

直播端运行有游戏的多个模块、游戏直播软件和安全检测程序;控制端用于在含有目标函数的模块中查找一个空隙的地址,并在另一模块中写入hook功能逻辑函数,然后使目标函数先跳转到空隙的地址中,目标函数为游戏组件的DirectX 9动态链接库模块中的Present函数,目标函数再跳转到含有hook功能逻辑函数的模块中,并执行hook功能逻辑函数,当执行完hook功能逻辑函数后,控制端使游戏直播软件获取显卡中显示的游戏画面,并将获取的显卡中显示的游戏画面发送给服务端;服务端用于接收游戏直播软件发送的游戏画面,观众通过智能设备或PC访问服务端,即可观看游戏主播的直播画面。

该系统通过采用二级跳转的方式,对游戏客户端的游戏组件的DirectX 9动态链接库模块中的Present函数进行hook,通过游戏的安全检测程序的检测,使得游戏直播软件能够获取显卡中显示的游戏画面,避免安全检测程序对游戏厂商本身已经认可的非核心组件的修改进行误判,既减轻了游戏厂商对安全检测程序作适配修改的工作量,同时也保证了游戏主播的正常直播。

本发明不局限于上述实施方式,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围之内。本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1