首页 / 专利库 / 电脑零配件 / 外围设备 / 硬盘 / 一种用于获取显卡内容的hook方法和系统

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

阅读:1032发布:2020-06-07

专利汇可以提供一种用于获取显卡内容的hook方法和系统专利检索,专利查询,专利分析的服务。并且本 发明 涉及游戏直播领域,本发明公开了一种用于获取显卡内容的hook方法,该方法包括:步骤S1:hook加载在内存中的游戏组件DirectX 9动态链接库中的Present函数,并读取出hook后的Present函数;步骤S2:在安全检测程序的读取函数中加入插桩函数,然后安全检测程序读取 硬盘 中的游戏组件的所有函数;步骤S3:逐个判断安全检测程序读取到的函数是否为hook前的Present函数,若是,则跳到步骤S4,若否,则对下一个安全检测程序读取到的函数进行判断,直至判断找出hook前的Present函数为止;步骤S4:将步骤S3中查找到的硬盘中的hook前的Present函数替换成步骤S1中读取出的hook后的Present函数。本发明还公开了一种用于获取显卡内容的系统。本发明能够有效减少游戏厂商繁琐的工作量。,下面是一种用于获取显卡内容的hook方法和系统专利的具体信息内容。

1.一种用于获取显卡内容的hook方法,其特征在于,包括以下步骤:
步骤S1:hook加载在内存中的游戏组件DirectX 9动态链接库中的Present函数,并读取出hook后的Present函数;
步骤S2:在安全检测程序的读取函数中加入插桩函数,然后安全检测程序读取硬盘中的游戏组件的所有函数;
步骤S3:逐个判断安全检测程序读取到的函数是否为hook前的Present函数,若是,则跳到步骤S4,若否,则对下一个安全检测程序读取到的函数进行判断,直至判断找出hook前的Present函数为止;
步骤S4:将步骤S3中查找到的硬盘中的hook前的Present函数替换成步骤S1中读取出的hook后的Present函数;
所述步骤S3中,判断安全检测程序读取到的函数为hook前的Present函数的依据为:读取到的函数所占内存大小与hook前的Present函数所占内存大小相同,且读取到的函数位于DirectX 9动态链接库中。
2.如权利要求1所述的一种用于获取显卡内容的hook方法,其特征在于,所述插桩函数具体为:
void*pFileBuff,DWORD nNumberOfBytesToRead
其中,void和DWORD为插桩函数的指令码,pFileBuff表示被读取的函数的内存地址,nNumberOfBytesToRead表示被读取的函数所占内存的大小。
3.如权利要求1所述的一种用于获取显卡内容的hook方法,其特征在于,所述步骤S4具体为:
将步骤S1中读取出的hook后Present函数的内存地址转换成文件地址,并获取该文件地址对应的文件偏移处的内容,然后将安全检测程序取到的硬盘中hook前的Present函数文件偏移处的内容,替换成hook后的Present函数文件偏移处的内容。
4.如权利要求1所述的一种用于获取显卡内容的hook方法,其特征在于:所述读取函数用于读取硬盘中的游戏组件中的函数。
5.一种基于权利要求1所述方法的用于获取显卡内容的系统,其特征在于,该系统包括:直播端、控制端和服务器
所述直播端用于运行游戏组件和游戏直播软件,所述游戏直播软件用于获取显卡中的游戏画面,并将获取的游戏画面发送给服务器;
所述控制端用于hook运行在内存中的游戏组件中的函数,并在安全检测程序读取的函数中找出内存中被hook函数对应的hook前的函数,然后将hook前的函数替换成内存中hook后的函数,所述安全检测程序读取的函数为硬盘中的游戏组件中的函数;
所述服务器用于接收所述直播端发送的游戏画面。
6.如权利要求5所述的一种用于获取显卡内容的系统,其特征在于:所述控制端hook的函数为游戏组件DirectX 9动态链接库中的Present函数。
7.如权利要求5所述的一种用于获取显卡内容的系统,其特征在于:所述直播端和服务器通过互联网进行通讯。
8.如权利要求5所述的一种用于获取显卡内容的系统,其特征在于:所述控制端还用于在安全检测程序的读取函数中加入插桩函数。

说明书全文

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

技术领域

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

背景技术

[0002] 在软件技术中,hook是指修改程序的汇编代码,即修改程序原函数的汇编指令为jmp指令,使程序跳转到伪造函数处,执行完伪造函数逻辑后再跳转到原函数汇编指令,继续执行原函数逻辑。
[0003] 当前,为了给观众呈现较好的游戏直播画面,游戏直播软件均会采用游戏厂商所认可的hook方式,即主播直播时,游戏直播软件对游戏客户端进程DirectX 9动态链接库模中的Present函数进行hook,游戏直播软件便能够获取显卡中的显示内容,并将显示内容通过网络发送给服务器;观众访问服务器,便能观看到高品质的主播的游戏直播画面。游戏的客户端中通常设有安全检测程序,用以检测客户端的游戏进程是否被修改过,具体的检测方法为:安全检测程序读取游戏组件的磁盘原始文件到内存中,并以此为模板对游戏加载的游戏组件代码进行对比,若不一致,则会终止游戏的运行。
[0004] 游戏厂商为了加快游戏的推广,通常会和游戏直播公司进行合作,使游戏直播公司对自己的游戏进行直播推广,同时为了游戏直播软件能够稳定运行,会对自身的安全检测程序进行相应修改,从而与游戏直播软件的hook方式进行适配,避免自身安全检测程序对游戏直播软件的hook方式产生误判,但各家游戏直播公司的游戏直播软件的hook方式均不相同,游戏厂商需要针对各个hook方式,对安全检测程序进行一一适应修改,从而一一适配,其工作量较为浩大,且极其繁琐。

发明内容

[0005] 针对现有技术中存在的缺陷,本发明的目的在于提供一种用于获取显卡内容的hook方法和一种用于获取显卡内容的系统,能够有效减少游戏厂商繁琐的工作量。
[0006] 为达到以上目的,本发明采取的技术方案是:包括以下步骤:
[0007] 步骤S1:hook加载在内存中的游戏组件DirectX 9动态链接库中的Present函数,并读取出hook后的Present函数;
[0008] 步骤S2:在安全检测程序的读取函数中加入插桩函数,然后安全检测程序读取硬盘中的游戏组件的所有函数;
[0009] 步骤S3:逐个判断安全检测程序读取到的函数是否为hook前的Present函数,若是,则跳到步骤S4,若否,则对下一个安全检测程序读取到的函数进行判断,直至判断找出hook前的Present函数为止;
[0010] 步骤S4:将步骤S3中查找到的硬盘中的hook前的Present函数替换成步骤S1中读取出的hook后的Present函数。
[0011] 在上述技术方案的基础上,所述插桩函数具体为:
[0012] void*pFileBuff,DWORD nNumberOfBytesToRead
[0013] 其中,void和DWORD为插桩函数的指令码,pFileBuff表示被读取的函数的内存地址,nNumberOfBytesToRead表示被读取的函数所占内存的大小。
[0014] 在上述技术方案的基础上,所述步骤S3中,判断安全检测程序读取到的函数为hook前的Present函数的依据为:读取到的函数所占内存大小与hook前的Present函数所占内存大小相同,且读取到的函数位于DirectX 9动态链接库中。
[0015] 在上述技术方案的基础上,所述步骤S4具体为:
[0016] 将步骤S1中读取出的hook后Present函数的内存地址转换成文件地址,并获取该文件地址对应的文件偏移处的内容,然后将安全检测程序取到的硬盘中hook前的Present函数文件偏移处的内容,替换成hook后的Present函数文件偏移处的内容。
[0017] 在上述技术方案的基础上,所述读取函数用于读取硬盘中的游戏组件中的函数。
[0018] 本发明还提供一种用于获取显卡内容的系统,该系统包括:直播端、控制端和服务器;
[0019] 所述直播端用于运行游戏组件和游戏直播软件,所述游戏直播软件用于获取显卡中的游戏画面,并将获取的游戏画面发送给服务器;
[0020] 所述控制端用于hook运行在内存中的游戏组件中的函数,并在安全检测程序读取的函数中找出内存中被hook函数对应的hook前的函数,然后将hook前的函数替换成内存中hook后的函数,所述安全检测程序读取的函数为硬盘中的游戏组件中的函数;
[0021] 所述服务器用于接收所述直播端发送的游戏画面。
[0022] 在上述技术方案的基础上,所述控制端hook的函数为游戏组件DirectX 9动态链接库中的Present函数。
[0023] 在上述技术方案的基础上,所述直播端和服务器通过互联网进行通讯。
[0024] 在上述技术方案的基础上,所述控制端还用于在安全检测程序的读取函数中加入插桩函数。
[0025] 与现有技术相比,本发明的一种用于获取显卡内容的hook方法的优点在于:本方法在对内存中的hook的游戏组件进行游戏厂商认可的hook时,同时也会对硬盘中相应的游戏组件进行修改,使得游戏的安全检测程序在将硬盘中的原始游戏组件加载到内存中与运行在内存中的游戏组件比对时,两者相同,从而通过游戏安全检测程序的检测,避免游戏中的安全检测程序对本hook方式的误判,游戏厂商也不必对已经认可的hook方式,花费额外的精来对安全检测程序进行适配修改,使对Present函数的hook通过安全检测程序的检测,即通过游戏厂商认可的,允许游戏直播软件对内存和硬盘中的Present函数进行修改的方式,采用游戏直播软件自身适配安全检测程序的办法,使得游戏厂商不必针对各个游戏直播软件来对安全检测程序进行修改,有效减少游戏厂商编程人员的工作量,进而减少整个游戏的制作成本。
[0026] 本发明的一种采用绕过安全检测hook方法的系统的优点在于:通过修改硬盘中的游戏组件,使得游戏直播软件修改内存中游戏组件,便捷的获取显卡中的画面时,同时也能够通过游戏的安全检测程序的检测,避免安全检测程序对游戏厂商本身已经的认可的hook方式进行误判,既减轻了游戏厂商对安全检测程序作适配修改的工作量,同时也保证了游戏主播的正常直播。附图说明
[0027] 图1为本发明一种用于获取显卡内容的hook方法的流程图

具体实施方式

[0028] 以下结合附图对本发明作进一步详细说明。
[0029] 参见图1所示,本发明提供一种用于获取显卡内容的hook方法,使游戏直播软件通过游戏厂商认可的hook方式来获取显卡显示的画面,游戏在运行时,会将硬盘中的游戏组件加载到内存中运行,同时硬盘中还保留有原游戏组件,每个游戏包括多个游戏组件,且每个游戏组件包括多个函数,安全检测程序在检测时,会读取硬盘的游戏组件的所有函数,该用于获取显卡内容的hook方法包括以下步骤:
[0030] 步骤S1:对内存中加载的游戏组件DirectX 9动态链接库中的Present函数进行hook,从而使得游戏直播软件能够获取显卡显示的画面,然后读取出hook后的Present函数,同时编写插桩函数,插桩函数具体的为:
[0031] void*pFileBuff,DWORD nNumberOfBytesToRead
[0032] 其中,void和DWORD为插桩函数的指令码,pFileBuff表示被读取到的函数的内存地址,nNumberOfBytesToRead表示读取到的函数的大小。
[0033] 步骤S2:在安全检测程序的读取函数中加入插桩函数,然后安全检测程序读取硬盘中的游戏组件的所有函数,即安全检测程序使用读取函数读取硬盘中的游戏组件中的所有函数。
[0034] 步骤S3:逐个判断安全检测程序读取到的函数是否为hook前的Present函数,若是,则跳到步骤S4,若否,则对下一个安全检测程序读取到的函数进行判断,直至判断找出hook前的Present函数为止,即依次对安全检测程序读取到的函数进行判断,若为hook前的Present函数,则跳转到步骤S4,若不是hook前的Present函数,则对下一个函数进行判断,直到找出hook前的Present函数为止。判断插桩函数读取到的函数为hook前的Present函数的依据为:需同时满足读取到的函数所占内存大小与hook前的Present函数所占内存大小相同,且读取到的函数位于游戏组件DirectX 9动态链接库中。每个游戏组件,其组件的文件头均是一固定格式,例如文件头可以是一个16进制的0x54AD字符,因此利用这一原理,判断读取到的函数是否位于游戏组件DirectX 9动态链接库中,具体的判断过程如下:
[0035] S3.1:对读取到的函数的内存地址进行判断,具体的为:
[0036] 将读取到的函数的内存地址转换成PIMAGE_DOS_HEADER pDosHeader=(PIMAGE_DOS_HEADER)pFileBuff,判断pDosHeader->e_magic是否是IMAGE_DOS_SIGNATURE(0x5A4D),若不是,则结束,若是,则跳转到步骤S3.2,pFileBuff表示读取到的函数的内存地址,PIMAGE_DOS_HEADER pDosHeader为DOS头指针,PIMAGE_DOS_HEADER为定义DOS头部的结构体,在PIMAGE_DOS_HEADER中,pDosHeader->e_magic为该结构体的第一个字段;
[0037] S3.2:将读取到的函数的内存地址转换成PIMAGE_NT_HEADERS pNtHeaders=(PIMAGE_NT_HEADERS)((DWORD)dwBuff+pDosHeader->e_lfanew),判断pNtHeaders->Signature是否是IMAGE_NT_SIGNATURE(0x4550),若不是,则结束,若是,则说明读取到的函数位于游戏组件DirectX 9动态链接库中,PIMAGE_NT_HEADERS为一结构体,pDosHeader->e_lfanew为该结构体的最后一个字段。
[0038] 步骤S4:将步骤S1中读取出的hook后Present函数的内存地址转换成文件地址,并获取该文件地址对应的文件偏移处的内容,然后将步骤S3中安全检测程序查找到的硬盘中hook前的Present函数文件偏移处的内容,替换成hook后的Present函数文件偏移处的内容,从而完成对硬盘中相应游戏组件的修改,当游戏的安全检测程序将硬盘中的游戏组件加载到内存中,与运行在内存中的游戏组件比对时,两者完全一致,从而通过安全检测程序的检测,避免游戏中的安全检测程序对本hook方式的误判,游戏厂商也不必对已经认可的hook方式,花费额外的精力来对安全检测程序进行适配修改,使对Present函数的hook通过安全检测程序的检测,即通过游戏厂商认可的,允许游戏直播软件对内存和硬盘中的Present函数进行修改的方式,采用游戏直播软件自身适配安全检测程序的办法,使得游戏厂商不必针对各个游戏直播软件来对安全检测程序进行修改,有效减少游戏厂商编程人员的工作量,进而减少整个游戏的制作成本。
[0039] 上述将hook后的游戏组件的内存地址转换成文件地址的具体转换公式为:
[0040] fileOffset=PointerToRawData+(hookAddr–VirtualAddress)
[0041] 式中,PointerToRawData和VirtualAddress均为PIMAGE_SECTION_HEADER中的字段,PIMAGE_SECTION_HEADER是hook后的Present函数中的一个构成结构,hookAddr是hook后的Present函数的内存地址,游戏组件的每个函数中均包括有一DLL区段,PIMAGE_SECTION_HEADER为hook后的Present函数的DLL区段中的一个构成结构,PIMAGE_SECTION_HEADER中包含有Present函数的DLL区段的文件偏移处的起始地址和DLL区段在内存中的起始地址。
[0042] 本发明还包括一种基于上述获取显卡内容的hook方法的用于获取显卡内容的系统,该系统包括直播端、控制端和服务器,直播端和控制端均位于主播直播时所用的PC(personal computer,个人计算机)中,服务器运行在机房中,直播端与服务器通过互联网进行通讯。
[0043] 直播端用于运行游戏组件和游戏直播软件,游戏直播软件用于获取显卡中的游戏画面,并将获取的游戏画面发送给服务器;控制端用于hook运行在内存中的游戏组件中的函数,并在安全检测程序读取的函数中找出内存中被hook函数对应的hook前的函数,然后将hook前的函数替换成内存中hook后的函数,安全检测程序读取的函数为硬盘中的游戏组件中的函数,同时,为便于找出内存中被hook函数对应的hook前的函数,还需在安全检测程序的读取函数中加入插桩函数,具体的为:hook加载在内存中的游戏组件DirectX 9动态链接库中的Present函数,并读取出hook后的Present函数,然后在硬盘中找出对应的hook前的Present函数,并将hook前的Present函数替换成读取出hook后的Present函数。服务器用于接收直播端发送的游戏画面,观众通过智能设备或PC访问服务器,即可观看游戏主播的直播画面。
[0044] 该系统对内存中Present函数进行hook,然后将硬盘中对应的hook前的Present函数替换成hook后的Present函数,使得游戏直播软件能够便捷的获取显卡中的画面时,同时也能够通过游戏的安全检测程序的检测,避免安全检测程序对游戏厂商本身已经的认可的hook方式进行误判,既减轻了游戏厂商对安全检测程序作适配修改的工作量,同时也保证了游戏主播的正常直播。
[0045] 本发明不局限于上述实施方式,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围之内。本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈