CN110691278B - 防止直播时外挂误判的方法、存储介质、电子设备及系统 - Google Patents
防止直播时外挂误判的方法、存储介质、电子设备及系统 Download PDFInfo
- Publication number
- CN110691278B CN110691278B CN201810732972.8A CN201810732972A CN110691278B CN 110691278 B CN110691278 B CN 110691278B CN 201810732972 A CN201810732972 A CN 201810732972A CN 110691278 B CN110691278 B CN 110691278B
- Authority
- CN
- China
- Prior art keywords
- file
- function
- check
- program
- hook
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 49
- 238000003860 storage Methods 0.000 title claims abstract description 35
- 230000006870 function Effects 0.000 claims description 190
- 230000002159 abnormal effect Effects 0.000 claims description 54
- 238000004590 computer program Methods 0.000 claims description 25
- 238000007689 inspection Methods 0.000 claims description 14
- 238000012545 processing Methods 0.000 claims description 14
- 230000005856 abnormality Effects 0.000 claims description 4
- 238000010586 diagram Methods 0.000 description 9
- 230000008569 process Effects 0.000 description 6
- 238000005516 engineering process Methods 0.000 description 4
- 238000012986 modification Methods 0.000 description 3
- 230000004048 modification Effects 0.000 description 3
- 238000011084 recovery Methods 0.000 description 3
- 230000007246 mechanism Effects 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 238000012546 transfer Methods 0.000 description 2
- 230000001413 cellular effect Effects 0.000 description 1
- 230000003247 decreasing effect Effects 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000001514 detection method Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 239000003607 modifier Substances 0.000 description 1
- 238000011022 operating instruction Methods 0.000 description 1
- 239000007787 solid Substances 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
Images
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04N—PICTORIAL COMMUNICATION, e.g. TELEVISION
- H04N21/00—Selective content distribution, e.g. interactive television or video on demand [VOD]
- H04N21/40—Client devices specifically adapted for the reception of or interaction with content, e.g. set-top-box [STB]; Operations thereof
- H04N21/43—Processing of content or additional data, e.g. demultiplexing additional data from a digital video stream; Elementary client operations, e.g. monitoring of home network or synchronising decoder's clock; Client middleware
- H04N21/443—OS processes, e.g. booting an STB, implementing a Java virtual machine in an STB or power management in an STB
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04N—PICTORIAL COMMUNICATION, e.g. TELEVISION
- H04N21/00—Selective content distribution, e.g. interactive television or video on demand [VOD]
- H04N21/20—Servers specifically adapted for the distribution of content, e.g. VOD servers; Operations thereof
- H04N21/21—Server components or server architectures
- H04N21/218—Source of audio or video content, e.g. local disk arrays
- H04N21/2187—Live feed
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04N—PICTORIAL COMMUNICATION, e.g. TELEVISION
- H04N21/00—Selective content distribution, e.g. interactive television or video on demand [VOD]
- H04N21/40—Client devices specifically adapted for the reception of or interaction with content, e.g. set-top-box [STB]; Operations thereof
- H04N21/47—End-user applications
- H04N21/478—Supplemental services, e.g. displaying phone caller identification, shopping application
- H04N21/4781—Games
Landscapes
- Engineering & Computer Science (AREA)
- Multimedia (AREA)
- Signal Processing (AREA)
- Databases & Information Systems (AREA)
- Software Systems (AREA)
- Storage Device Security (AREA)
Abstract
本发明公开了一种防止直播时外挂误判的方法、存储介质、电子设备及系统,涉及直播技术领域,该方法包括以下步骤:直播程序获得d3d9.dll文件存储位置、起始地址、结束地址以及文件大小;hook d3d9.dll文件中的present函数,获取游戏画面,同时将d3d9.dll文件中原始的present函数拷贝获得检查替代文件;将d3d9.dll文件被hook的部分设置为不可读;若安全检查程序读取d3d9.dll文件异常时,使用预设的异常处理函数调用检查替代文件,并将检查替代文件发送给安全检查程序。本发明在保证直播工作的正常进行以及不影响系统自身工作的前提下,避免安全检查程序将直播程序识别为外挂,给直播用户带来更人性化的使用体验。
Description
技术领域
本发明涉及直播技术领域,具体涉及一种防止直播时外挂误判的方法、存储介质、电子设备及系统。
背景技术
随着直播的发展,观看直播的人越来越多,使得游戏直播行业也越来越热门,越来越多的主播通过直播程序来进行游戏直播,然而基于Windows的电脑游戏,直播程序通常需要获取游戏的画面,从而对游戏画面进行视频编码,并将编码好的视频流推送到直播平台的CDN服务器上;
由于直播程序与外挂软件获取游戏画面方式的相似,导致很多主播在进行游戏直播时,直播程序被游戏开发商的安全程序错误检测为外挂,从而导致主播受到封号处罚;
因此急需一种主播在进行游戏直播时,防止直播程序被错误识别为外挂的方法,来保证游戏直播工作的顺利进行。
发明内容
针对现有技术中存在的缺陷,本发明的目的在于提供一种防止直播时外挂误判的方法、存储介质、电子设备及系统,避免安全检查程序将直播程序识别为外挂,给直播用户带来更人性化的使用体验。
为达到以上目的,本发明采取的技术方案是:
第一方面,本发明提供一种防止直播时外挂误判的方法,其包括以下步骤:
直播程序获得d3d9.dll文件存储位置、起始地址、结束地址以及文件大小;
hook d3d9.dll文件中的present函数,获取游戏画面,同时将d3d9.dll文件中原始的present函数拷贝获得检查替代文件;
将d3d9.dll文件被hook的部分设置为不可读;
若安全检查程序读取d3d9.dll文件异常时,使用预设的异常处理函数调用检查替代文件,并将检查替代文件发送给安全检查程序;
在hook d3d9.dll文件的操作中,包括以下步骤:
创建一自定义present函数,所述自定义present函数的函数原型系统自带的present函数一致,所述自定义present函数用于获取游戏的画面数据;
hook系统自带的present函数,将系统自带的present函数替代为自定义present函数;其中,
若安全检查程序读取d3d9.dll文件异常时,使用预设的异常处理函数调用检查替代文件中,包括以下步骤:
识别内存中是否存在异常;
获取异常信息,并解析得到异常地址以及异常参数;
将所述异常地址与所述d3d9.dll文件的存储地址进行比对,并将所述异常参数与当d3d9.dll文件出现异常时的参数进行比对;
若以上两个比对均吻合,则表明异常为d3d9.dll引起,则利用预设的异常处理函数调用检查替代文件并发送给所述安全检查程序,反之,则不调用检查替代文件。
在上述技术方案的基础上,在对所述系统自带的present函数与所述自定义present函数进行hook操作之前,所述方法还包括:
调用detous库的函数DetourTransactionBegin开启hook;
调用API函数DetourUpdateThread分配用于hook的线程。
在上述技术方案的基础上,所述异常处理函数中存在异常信息数据,其用于表示引起异常原因、异常地址以及异常参数。
在上述技术方案的基础上,所述当安全检查程序查询d3d9.dll文件时,还包括以下步骤:
判断所述安全检查程序是否为游戏自身检查程序;
若所述安全检查程序为游戏自身检查程序,则将CPU当前的执行方式修改成单步执行,并将d3d9.dll文件被hook的部分恢复,待游戏自身检查程序检查d3d9.dll文件完成后,再重新对d3d9.dll文件进行hook。
第二方面,本发明还提供一种存储介质,该存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现第一方面实施例中的方法。
第三方面,本发明还提供一种电子设备,包括存储器和处理器,存储器上储存有在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现第一方面实施例中的方法。
第四方面,本发明还公开一种防止直播时外挂误判的系统,其特征在于,其包括:
文件寻找单元,其用于获得d3d9.dll文件存储位置、起始地址、结束地址以及文件大小;
hook执行单元,其用于hook d3d9.dll文件中的present函数,获取游戏画面,同时将d3d9.dll文件中原始的present函数拷贝获得检查替代文件;
文件设置单元,其用于将d3d9.dll文件被hook的部分设置为不可读;
检查避让单元,其用于若安全检查程序读取d3d9.dll文件异常时,使用预设的异常处理函数调用检查替代文件,并将检查替代文件发送给安全检查程序;
所述hook执行单元还用于创建一自定义present函数,所述自定义present函数的函数原型系统自带的present函数一致,所述自定义present函数用于获取游戏的画面数据;
所述hook执行单元还用于hook系统自带的present函数,将系统自带的present函数替代为自定义present函数;其中,
所述检查避让单元还用于识别内存中是否存在异常;
所述检查避让单元还用于获取异常信息,并解析得到异常地址以及异常参数;
所述检查避让单元还用于将所述异常地址与所述d3d9.dll文件的存储地址进行比对,并将所述异常参数与当d3d9.dll文件出现异常时的参数进行比对;
所述检查避让单元还用于若以上两个比对均吻合,则表明异常为d3d9.dll引起,则利用预设的异常处理函数调用检查替代文件并发送给所述安全检查程序,反之,则不调用检查替代文件。
与现有技术相比,本发明的优点在于:
(1)本发明在保证直播工作的正常进行以及不影响系统自身工作的前提下,利用hook技术,防止安全检查程序对直播程序造成误解,避免安全检查程序将直播程序识别为外挂,给直播用户带来更人性化的使用体验,能够更方便的使用直播程序。
(2)本发明对游戏自身检查程序的安全检查进行特殊处理,保证游戏自身能够正常运行,在带给使用者良好的直播体验的同时,保证使用者有用顺畅的游戏体验。
附图说明
图1为本发明一种防止直播时外挂误判的方法的流程图;
图2为本发明一种防止直播时外挂误判的系统的结构框图;
图中:1、文件寻找单元;2、hook执行单元;3、文件设置单元;4、检查避让单元;5、检查恢复单元。
具体实施方式
以下结合附图对本发明的实施例作进一步详细说明。
参见图1所示,本发明实施例提供一种防止直播时外挂误判的方法、存储介质、电子设备及系统,避免安全检查程序将直播程序识别为外挂,给直播用户带来更人性化的使用体验。
为达到上述技术效果,本申请的总体思路如下:
一种防止直播时外挂误判的方法,其包括以下步骤:
S1、直播程序获得d3d9.dll文件存储位置、起始地址、结束地址以及文件大小;
S2、hook d3d9.dll文件中的present函数,获取游戏画面,同时将d3d9.dll文件中原始的present函数拷贝获得检查替代文件;
S3、将d3d9.dll文件被hook的部分设置为不可读;
S4、若安全检查程序读取d3d9.dll文件异常时,使用预设的异常处理函数调用检查替代文件,并将检查替代文件发送给安全检查程序。
本发明实施例在保证直播工作的正常进行以及不影响系统自身工作的前提下,利用hook技术,防止安全检查程序对直播程序造成误解,避免安全检查程序将直播程序识别为外挂,给直播用户带来更人性化的使用体验,能够更方便的使用直播程序。
实施例一
参见图1所示,本发明第一实施例提供一种防止直播时外挂误判的方法,本发明实施例中,当需要对游戏或电脑画面进行直播时,开启直播程序,准备开启直播工作;
在步骤S1中,获得d3d9.dll文件存储位置、起始地址以及结束地址,从而对d3d9.dll文件进行定位,了解其存储的位置以及文件的起始和结束位置;
具体的:获得d3d9.dll文件存储位置、起始地址以及结束地址包括以下步骤:
首先利用代码:DWORD dwStart = GetModuleHanlde(d3d9),通过调用系统函数GetModuleHanlde并传入改dll的名称得到d3d9.dll在内存的起始地址。
故而此操作针对本申请的代码为:dwStartAddress = GetModuleHanlde(d3d9.dll),从而得到了d3d9.dll在内存的起始地址;
然后通过调用系统API函数GetModuleInformation来获取d3d9.dll在内存中的大小;
其中,API函数的函数原型如下:
BOOL WINAPI GetModuleInformation(
HANDLE hProcess,
HMODULE hModule,
LPMODULEINFO lpmodinfo,
DWORD cb
);
其中参数hProcess表示当前进程的句柄,参数hModule则表示需要获取模块信息的模块的句柄,即d3d9.dll的句柄,参数lpmodinfo为指向 MODULEINFO 结构的指针,该结构将会储存关于模块即d3d9.dll的信息,参数cb为结构 MODULEINFO 的大小;
再利用代码GetModuleInformation(GetCurrentProcess(),hmodule,lpmodinfo,cb),通过调用完成此函数则最终获取的模块信息存储在lpmodinfo结构中;
其中lpmodinfo.dwSizeOfImage的属性则存储了d3d9.dll在内存中的大小;
G_netdll_Address = hModule,此代码用于记录d3d9.dll的存储地址;
G_netdll_size = lpmodinfo.dwSizeOfImage,此代码用于记录d3d9.dll的存储大小。
在步骤S2中,利用直播程序hook d3d9.dll文件中的present函数,从而使得直播程序获得游戏或电脑的画面进行直播,同时将d3d9.dll文件中原始的present函数拷贝获得检查替代文件,利用检查替代文件,作为后续应对安全检查,避免直播程序被误识别为外挂的替代文件;
作为一个可选的实施方式,hook d3d9.dll文件中的present函数的操作中,包括以下步骤:
创建一自定义present函数,所述自定义present函数的函数原型系统自带的present函数一致,所述自定义present函数用于获取游戏的画面数据;
hook系统自带的present函数,将系统自带的present函数替代为自定义present函数。
其中,hook的中文操作指令为插桩或钩子。
具体来说:自定义Present函数可以命名为MyPresent函数,并且其函数原型必须和系统的Present函数一致,自定义Present函数具体实现如下:
static HRESULT WINAPI MyPresent(LPDIRECT3DDEVICE9 device,
THIS_ CONST RECT*pSourceRect,
CONST RECT* pDestRect,
HWND hDestWindowOverride,
CONST RGNDATA* pDirtyRegion);
其函数功能则是获取游戏的画面数据。
本发明实施例中在对系统自带的present函数与自定义present函数进行hook操作之前,该方法还包括以下步骤:
调用detous的函数DetourTransactionBegin开启hook工作。
调用API函数DetourUpdateThread分配用于hook的线程。
而后,再将原有的Present函数替换为自定义present函数;
从而实现hook功能。
需要说明的是,直播程序hook d3d9.dll文件的过程,是直播程序获取游戏画面的步骤,具体是对d3d9.dll中的IDirect3DDevice9:: Present,即对Present函数进行hook,利用自定义Present函数替换系统自带的Present函数,从而可以从中获取到游戏画面数据,故而实际在d3d9.dll文件中被设置为不可读的部分,为被hook的部分,即系统自带的Present函数。
由于本申请实际上则是需要hook模块d3d9.dll中的Present函数,并且本申请读取Present函数的内存代码原始数据保存到全局变量中,具体代码可以是g_d3d9hook_address = Present;
另外,由于此后会对d3d9.dll进行hook,会对代码进行修改,故而需要先保存原始数据,故而读取g_d3d9hook_address处的内存代码5个字节并保存到全局变量G_srcCode中:G_srcCode = g_d3d9hook_address[5]。
而在编写hook模块d3d9.dll的功能代码时,具体实施方式则是使用detours库来实现,其实现步骤如下:
首先利用代码:DetourTransactionBegin(),其作用为调用detous的函数DetourTransactionBegin标示准备执行hook;
然后利用代码:DetourUpdateThread(GetCurrentThread()),其作用为调用API函数DetourUpdateThread来更新当前的线程;
然后利用代码:DetourAttach(&(PVOID&)Present, MyPresent),其作用为将系统的Present函数和自定义Present函数进行替换,从而实现hook功能;
而后再利用代码:DetourTransactionCommit(),其作用为更新修改的hook代码实现最终的Hook,从而实现了替换系统的Present函数的hook工序。
以上操作,实际实现hook是修改了d3d9.dll中的Present内存地址,即此函数在d3d9.dll的内存地址,此函数的最终实现方式则是在d3d9.dll的Prsent函数入口处修改器汇编代码为一个jmp代码,从而跳转到本文编写的伪造函数中,因此其实现原理则是通过修改d3d9.dll的代码来实现。
在步骤S3中,将d3d9.dll文件被hook的部分设置为不可读;
在步骤S4中,若安全检查程序读取d3d9.dll文件异常时,使用预设的异常处理函数调用检查替代文件,并将检查替代文件发送给安全检查程序,具体是当安全检查程序读取到d3d9.dll文件被hook的部分后,由于该部分被设置为不可读,故而会出现异常报错,此时利用预设的异常处理函数调用检查替代文件并发送给安全检查程序,而安全检查程序识别到检查替代文件后,由于检查替代文件为原先的d3d9.dll文件的present函数,故而能够通过安全检查;
作为一个可选的实施方式,出现异常状况时,利用预设的异常处理函数调用检查替代文件的操作具体包括以下步骤:
识别内存中是否存在异常;
判断该异常是否为d3d9.dll文件中的present函数引起;
若是,则利用预设的异常处理函数调用检查替代文件并发送给安全检查程序;
若不是,则不调用检查替代文件。
需要说明的事,判断该异常是否为d3d9.dll文件中的present函数引起,此处的present函数由于之前已经完成hook,故而此处实际为自定义present函数,只是hook以后,自定义present函数替代了系统自带的present函数。
作为一个可选的实施方式,判断该异常是否为d3d9.dll文件中的present函数引起的操作具体包括以下步骤:
获取异常信息,并解析得到异常地址以及异常参数;
将异常地址与d3d9.dll文件的存储地址进行比对,并将异常参数与当d3d9.dll文件出现异常时的参数进行比对;
若以上两个比对均吻合,则表明异常为d3d9.dll引起。
本发明实施例中,d3d9.dll文件出现异常时的参数用于表示对不可读模式的d3d9.dll文件中的present函数访问失败。
具体的,本实施例中给出一种异常处理函数的编写方式,具体为:
对于Windows系统来说其提供了对应的异常处理函数的规范,其函数的规范原型如下:
LONG WINAPI
VectoredHandler(
struct _EXCEPTION_POINTERS *ExceptionInfo
);
其中所有的异常处理函数都必须按照这个函数的规范来。
其中有一个参数struct _EXCEPTION_POINTERS *ExceptionInfo,其会传入异常时的一些信息,包括异常的原因,异常的地址,异常的参数信息等,即异常处理函数中存在异常信息数据,其用于表示引起异常原因、异常地址以及异常参数。
下面在判断当前产生的异常是由于程序其他错误导致还是本文的hook的d3d9.dll的代码导致的,异常处理函数创建的具体操作步骤包括:
由于本申请是将hook后的d3d9.dll的这一部分代码设置成不可读,那么则一定会产生的异常类型则是EXCEPTION_ACCESS_VIOLATION异常,原因是系统用EXCEPTION_ACCESS_VIOLATION其表示内存不可读,因此通过判断异常的类型是不是EXCEPTION_ACCESS_VIOLATION则可以知道是不是由于本申请设置的不可读导致的,同时加上产生异常时的内存地址是不是本申请hook的d3d9.dll的内存地址,则可以知道是不是本申请设置的内存异常,如果是本文则需要进行进一步的处理,如果不是本文则不进行处理;
if (ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION){
首先可以同参数中的ExceptionRecord->ExceptionCode来判断当前产生的异常的异常码,如果是EXCEPTION_ACCESS_VIOLATION则说明是本文设置的异常,否则不进行处理;
进一步的需要判断产生异常的内存地址,因为程序的其他地方也有可能会产生同样的异常码,所以需要进一步的判断产生异常的内存地址是否是本申请设置的hook的d3d9.dll的地址;
利用代码:if (ExceptionInfo->ExceptionRecord->ExceptionAddress ==Address_hook_d3d9.dll){,通过参数的ExceptionInfo->ExceptionRecord->ExceptionAddress属性则可以获取到产生异常的内存地址;
当hook了d3d9.dll中代码后,则可以知道hook的是d3d9.dll中的具体哪一部分的代码,并且也知道其内存地址是多少g_d3d9hook_address,那么在此处则可以通过地址比较产生异常时的内存地址是不是本申请的设置的不可读的内存地址。
而后进一步的再判断完成当前产生的异常就是本申请设置的d3d9.dll中的代码后,本申请还需要区分出是d3d9.dll执行到了此函数,还是游戏的检查代码开始读取此处的内存代码,那么此处区分方式包括以下步骤:
首先在读取此处时,可以获取到当前的函数调用堆栈,从而可获取到调用此代码的上层调用者,通过判断上层调用者可知道是游戏的检查代码还是由于d3d9.dll执行到了此处;
那么函数调用堆栈则可以通过从ExceptionInfo->ContextRecord->Ebp来获取,通过读取ebp的值从而可以得到函数的上一层的调用堆栈callstackAdress,那么得到上层的调用堆栈后,对于如果是d3d9.dll执行到了此处,那么其调用堆栈的地址肯定还属于d3d9.dll模块中,而对于游戏的检查函数,其调用堆栈不可能是在d3d9.dll中,因此本申请则只需要判断当前的调用堆栈是否在d3d9.dll的模块范围内,如果是则说明是游戏的d3d9.dll执行到了此处,否则则是游戏的检查函数读取此处的内存;
而由于事先获取到了d3d9.dll的模块起始地址和大小,起始地址为G_netdll_Address,大小为G_netdll_size;
直接判断当前的调用堆栈的地址是否是大于G_netdll_Address并且小于G_netdll_Address + G_netdll_size;
如果是则说明此调用是在d3d9.dll模块中,
如果是在d3d9.dll模块中,则本文则设置内存为可读可写可以执行,从而程序能够正常的执行,并且会执行hook的功能。
而本申请中,改变d3d9.dll内存属性的方式为:调用VirtualProtect来修改内存的属性,从而此处内存可以读写可以执行,具体代码为:VirtualProtect(g_d3d9hook_address,5,PAGE_EXECUTE_READWRITE,&dwOldProtect),从而将内存设置为可以读写并且可以执行,从而程序可以继续执行。
本发明实施例在保证直播工作的正常进行以及不影响系统自身工作的前提下,利用hook技术,防止安全检查程序对直播程序造成误解,避免安全检查程序将直播程序识别为外挂,给直播用户带来更人性化的使用体验,能够更方便的使用直播程序。
其中,游戏画面可以是电脑或其他移动终端显示的画面,而d3d9.dll是DirectX 9的动态链接库,用于支持Windows多媒体和游戏,而DirectX 9是一个游戏时需要运用的软件。
本实施例中,还存在一种情况,当直播间获取游戏画面时,可能是游戏自身的安全检查程序对自身进行安全检查,此时当安全检查程序查询d3d9.dll文件时,还包括以下步骤:
判断安全检查程序是否为游戏自身检查程序;
若安全检查程序为游戏自身检查程序,则将CPU当前的执行方式修改成单步执行,并将d3d9.dll文件被hook的部分即d3d9.dll文件中的present函数恢复,待游戏自身检查程序检查d3d9.dll文件完成后,再重新对d3d9.dll文件进行hook;
本发明对游戏自身检查程序的安全检查进行特殊处理,保证游戏自身能够正常运行,在带给使用者良好的直播体验的同时,保证使用者有用顺畅的游戏体验。
如果当前执行安全检查的程序是游戏自身检查程序,那么则需要对hook的代码进行恢复,从而保障游戏自身检查程序读取的代码是没有被修改过的,并且当其读取完成后,再通过detours来再次的hook,从而直播后续直播程序可以继续读取游戏的画面;
首先修改内存代码的可以读写可以执行的属性:VirtualProtect(g_d3d9hook_address,5,PAGE_EXECUTE_READWRITE,&dwOldProtect),
然后,将之前保存的hook之前的代码写入被hook后的地址,从而实现恢复原始的代码:Memcpy(g_d3d9hook_address, G_srcCode, 5);
本文在hook之前就已经保存了原始的5个字节的代码,所以在这里可以通过系统函数memcpy来将原始的数据拷贝到hook后的地方,从而恢复原始代码,并且本文需要将CPU当前的执行模式修改成单步执行,从而在执行完成读取的代码后,本文可以再次的进行hook;
具体设置为单步执行的代码为:ExceptionInfo->ContextRecord->EFlags |=0x100,通过将Eflags增加0x100的标志为则表明当前CPU修改成单步执行。
需要说明的是,由于将CPU当前的执行模式修改成单步执行,那么还需要再异常情况识别中,增加对单步执行的异常识别,也就是当前CPU每执行一行代码都会产生单步执行异常,直到读取完本文的5个字节后,则恢复成不是单步执行,并且再次使用detours来进行hook模块d3d9.dll的present函数。
hook代码则和本实施例之前编写的是一样的:
if(ExceptionInfo->ExceptionRecord->ExceptionCode== STATUS_SINGLE_STEP )
{
进而再本申请中编写的VEH异常处理函数中则需要增加异常类型为单步执行的异常,其异常代码为STATUS_SINGLE_STEP;
通过单步执行的方式来使得游戏自身检查程序读取完本申请需要hook的数据后,则再次进行hook。从而后续游戏中d3d9.dll读取时则会执行hook逻辑,从而直播程序可以读取到当面游戏画面,而在游戏安全检查时,则恢复游戏的原始代码,从而绕过游戏的检测。
进一步地,在本实施例中,由于上文提到了如何编写异常处理函数,进而再给出注册异常处理函数的方式:
对于Windows系统来说其提供了对应的API函数来注册异常处理函数,对应的API函数是AddVectoredExceptionHandler,来增加一个处理的处理,其函数原型如下:
PVOID WINAPI Add VectoredExceptionHandler(
ULONG FirstHandler,
PVECTORED_EXCEPTION_HANDLER VectoredHandler
);
其中,FirstHandler标示异常处理顺序,本申请则设置为0,标示优先处理异常,
VectoredHandler为需要传入异常处理函数,针对本申请而言,即为上文我们自行编写的异常处理函数VectoredHandler。
针对本申请,利用上述注册方法,具体实现如下:
AddVectoredExceptionHandler(0, VectoredHandler),标示向系统注册了一个异常处理函数,并且优先执行。
同样,在本实施例中,再给出一种取消异常处理函数的方式:
在本实施例中,由于上文提到了如何编写异常处理函数,进而再给出注册异常处理函数的方式:
对于Windows系统来说其提供了对应的API函数来取消异常处理函数。对应的API函数是RemoveVectoredExceptionHandler,来增加一个处理的处理。
其函数原型如下:
PVOID WINAPI RemoveVectoredExceptionHandler (
PVECTORED_EXCEPTION_HANDLER VectoredHandler
);
VectoredHandler则需要传入异常处理函数,针对本申请而言,即为上文我们自行编写的异常处理函数VectoredHandler。
针对本申请,利用上述注册方法,具体实现如下:
RemoveVectoredExceptionHandler(VectoredHandler),标示向系统取消了一个异常处理函数。
在实际使用过程当中,当程序退出或者不需要在接管异常时则可以取消对系统注册的异常处理函数。
需要说明的是,本申请将d3d9.dll文件中原始的present函数拷贝获得检查替代文件,若安全检查程序读取d3d9.dll文件异常时,将检查替代文件发送给安全检查程序,此解决将直播程序误判为外挂的方法,实际是基于VEH的处理机制;
而VEH是向量化异常处理(Vectored Exception Handling),是Windows平台下操作系统实现和使用的异常处理机制,并且提供了相应的API函数给使用者使用;
通常的VEH的作用则是提供给程序开发人员用于在执行一些具有风险或者会导致程序崩溃的代码时,通过注册VEH的处理函数,从而即使执行了会导致程序出错的代码时,其可以捕获这种错误,防止程序崩溃,从而使得程序可以继续运行。
基于同一发明构思,本申请提供了实施例一对应的一种防止直播时外挂误判的系统,详见实施例二。
实施例二
如图2所示,本发明第四实施例还提供一种防止直播时外挂误判的系统,其包括:
文件寻找单元1,其用于获得d3d9.dll文件存储位置、起始地址、结束地址以及文件大小;
hook执行单元2,其用于hook d3d9.dll文件中的present函数,获取游戏画面,同时将d3d9.dll文件中原始的present函数拷贝获得检查替代文件;
文件设置单元3,其用于将d3d9.dll文件被hook的部分设置为不可读;
检查避让单元4,其用于若安全检查程序读取d3d9.dll文件异常时,使用预设的异常处理函数调用检查替代文件,并将检查替代文件发送给安全检查程序。
本发明实施例,在保证直播工作的正常进行以及不影响系统自身工作的前提下,利用hook技术,防止安全检查程序对直播程序造成误解,避免安全检查程序将直播程序识别为外挂,给直播用户带来更人性化的使用体验,能够更方便的使用直播程序。
本实施例中,hook执行单元2至少包括:
函数定义子单元,其用于定义一自定义present函数,其函数原型与系统自带的present函数一致,用于替代系统自带的present函数;
hook执行子单元,其用于对系统自带的present函数与自定义present函数进行hook操作,从而利用自定义present函数替代系统自带的present函数,获取游戏画面。
本实施例中,hook执行单元2在对系统自带的present函数与自定义present函数进行hook操作之前还包括以下操作:
调用detous库的函数DetourTransactionBegin开启hook工作;
调用API函数DetourUpdateThread更新当前的线程。
本实施例中,检查避让单元4在出现异常状况时,利用预设的异常处理函数调用检查替代文件的操作具体包括:
识别内存中是否存在异常;
判断该异常是否为d3d9.dll文件中的present函数引起;
若是,则利用预设的异常处理函数调用检查替代文件并发送给安全检查程序;
若不是,则不调用检查替代文件。
进一步地,检查避让单元4在判断该异常是否为d3d9.dll文件引起的操作具体包括以下操作:
获取异常信息,并解析得到异常地址以及异常参数;
将异常地址与d3d9.dll文件的存储地址进行比对,并将异常参数与当d3d9.dll文件出现异常时的参数进行比对;
若以上两个比对均吻合,则表明异常为d3d9.dll引起。
本实施例中,该系统还包括检查恢复单元5,其用于当游戏自身安全检查程序查询d3d9.dll文件时,对3d9.dll文件进行恢复;
检查恢复单元5具体工作包括以下操作:
判断安全检查程序是否为游戏自身检查程序;
若安全检查程序为游戏自身检查程序,则将CPU当前的执行方式修改成单步执行,并将d3d9.dll文件被hook的部分恢复,待游戏自身检查程序检查d3d9.dll文件完成后,再重新对d3d9.dll文件进行hook;
本操作是对游戏自身检查程序的安全检查进行特殊处理,保证游戏自身能够正常运行,在带给使用者良好的直播体验的同时,保证使用者有用顺畅的游戏体验。
需要说明的是,所述异常处理函数中存在异常信息数据,其用于表示引起异常原因、异常地址以及异常参数。
基于同一发明构思,本申请提供了实施例一对应的存储介质的实施例,详见实施例三
实施例三
本发明第三实施例提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现第一实施例中的所有方法步骤或部分方法步骤。
本发明实现上述第一实施例方法中的全部或部分流程,也可以通过计算机程序来指令相关的硬件来完成,的计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述各个方法实施例的步骤。其中,计算机程序包括计算机程序代码,计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。计算机可读介质可以包括:能够携带计算机程序代码的任何实体或装置、记录介质、U盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、电载波信号、电信信号以及软件分发介质等。需要说明的是,计算机可读介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读介质不包括电载波信号和电信信号。
基于同一发明构思,本申请提供了实施例一对应的电子设备的实施例,详见实施例四
实施例四
本发明第四实施例还提供一种电子设备,包括存储器和处理器,存储器上储存有在处理器上运行的计算机程序,处理器执行计算机程序时实现第一实施例中的所有方法步骤或部分方法步骤。
所称处理器可以是中央处理单元(Central Processing Unit,CPU),还可以是其他通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现成可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等,处理器是计算机装置的控制中心,利用各种接口和线路连接整个计算机装置的各个部分。
存储器可用于存储计算机程序和/或模块,处理器通过运行或执行存储在存储器内的计算机程序和/或模块,以及调用存储在存储器内的数据,实现计算机装置的各种功能。存储器可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据手机的使用所创建的数据(比如音频数据、视频数据等)等。此外,存储器可以包括高速随机存取存储器,还可以包括非易失性存储器,例如硬盘、内存、插接式硬盘,智能存储卡(Smart Media Card,SMC),安全数字(Secure Digital,SD)卡,闪存卡(Flash Card)、至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器和光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
Claims (7)
1.一种防止直播时外挂误判的方法,其特征在于,其包括以下步骤:
直播程序获得d3d9.dll文件存储位置、起始地址、结束地址以及文件大小;
hook d3d9.dll文件中的present函数,获取游戏画面,同时将d3d9.dll文件中原始的present函数拷贝获得检查替代文件;
将d3d9.dll文件被hook的部分设置为不可读;
若安全检查程序读取d3d9.dll文件异常时,使用预设的异常处理函数调用检查替代文件,并将检查替代文件发送给安全检查程序;
在hook d3d9.dll文件的操作中,包括以下步骤:
创建一自定义present函数,所述自定义present函数的函数原型系统自带的present函数一致,所述自定义present函数用于获取游戏的画面数据;
hook系统自带的present函数,将系统自带的present函数替代为自定义present函数;其中,
若安全检查程序读取d3d9.dll文件异常时,使用预设的异常处理函数调用检查替代文件中,包括以下步骤:
识别内存中是否存在异常;
获取异常信息,并解析得到异常地址以及异常参数;
将所述异常地址与所述d3d9.dll文件的存储地址进行比对,并将所述异常参数与当d3d9.dll文件出现异常时的参数进行比对;
若以上两个比对均吻合,则表明异常为d3d9.dll引起,则利用预设的异常处理函数调用检查替代文件并发送给所述安全检查程序,反之,则不调用检查替代文件。
2.如权利要求1所述的方法,其特征在于,在对所述系统自带的present函数与所述自定义present函数进行hook操作之前,所述方法还包括:
调用detous库的函数DetourTransactionBegin开启hook;
调用API函数DetourUpdateThread分配用于hook的线程。
3.如权利要求1所述的方法,其特征在于:所述异常处理函数中存在异常信息数据,其用于表示引起异常原因、异常地址以及异常参数。
4.如权利要求1所述的方法,其特征在于,所述当安全检查程序查询d3d9.dll文件时,还包括以下步骤:
判断所述安全检查程序是否为游戏自身检查程序;
若所述安全检查程序为游戏自身检查程序,则将CPU当前的执行方式修改成单步执行,并将d3d9.dll文件被hook的部分恢复,待游戏自身检查程序检查d3d9.dll文件完成后,再重新对d3d9.dll文件进行hook。
5.一种存储介质,该存储介质上存储有计算机程序,其特征在于:所述计算机程序被处理器执行时实现权利要求1至4任一项所述的方法。
6.一种电子设备,包括存储器和处理器,存储器上储存有在处理器上运行的计算机程序,其特征在于:所述处理器执行所述计算机程序时实现权利要求1至4任一项所述的方法。
7.一种防止直播时外挂误判的系统,其特征在于,其包括:
文件寻找单元,其用于获得d3d9.dll文件存储位置、起始地址、结束地址以及文件大小;
hook执行单元,其用于hook d3d9.dll文件中的present函数,获取游戏画面,同时将d3d9.dll文件中原始的present函数拷贝获得检查替代文件;
文件设置单元,其用于将d3d9.dll文件被hook的部分设置为不可读;
检查避让单元,其用于若安全检查程序读取d3d9.dll文件异常时,使用预设的异常处理函数调用检查替代文件,并将检查替代文件发送给安全检查程序;
所述hook执行单元还用于创建一自定义present函数,所述自定义present函数的函数原型系统自带的present函数一致,所述自定义present函数用于获取游戏的画面数据;
所述hook执行单元还用于hook系统自带的present函数,将系统自带的present函数替代为自定义present函数;其中,
所述检查避让单元还用于识别内存中是否存在异常;
所述检查避让单元还用于获取异常信息,并解析得到异常地址以及异常参数;
所述检查避让单元还用于将所述异常地址与所述d3d9.dll文件的存储地址进行比对,并将所述异常参数与当d3d9.dll文件出现异常时的参数进行比对;
所述检查避让单元还用于若以上两个比对均吻合,则表明异常为d3d9.dll引起,则利用预设的异常处理函数调用检查替代文件并发送给所述安全检查程序,反之,则不调用检查替代文件。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810732972.8A CN110691278B (zh) | 2018-07-05 | 2018-07-05 | 防止直播时外挂误判的方法、存储介质、电子设备及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810732972.8A CN110691278B (zh) | 2018-07-05 | 2018-07-05 | 防止直播时外挂误判的方法、存储介质、电子设备及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110691278A CN110691278A (zh) | 2020-01-14 |
CN110691278B true CN110691278B (zh) | 2022-02-22 |
Family
ID=69106786
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810732972.8A Active CN110691278B (zh) | 2018-07-05 | 2018-07-05 | 防止直播时外挂误判的方法、存储介质、电子设备及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110691278B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114840847A (zh) * | 2021-02-02 | 2022-08-02 | 武汉斗鱼鱼乐网络科技有限公司 | 在目标进程中安全创建线程的方法、装置、介质及设备 |
CN113190401B (zh) * | 2021-04-19 | 2023-08-25 | Oppo广东移动通信有限公司 | 快游戏的异常监控方法、电子设备、移动终端以及存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105354040A (zh) * | 2015-12-10 | 2016-02-24 | 网易(杭州)网络有限公司 | 双引擎游戏内置工具栏的方法、装置及终端 |
CN106295325A (zh) * | 2016-08-12 | 2017-01-04 | 武汉斗鱼网络科技有限公司 | 一种用于获取显卡内容的hook方法和系统 |
CN106776022A (zh) * | 2016-12-09 | 2017-05-31 | 武汉斗鱼网络科技有限公司 | 一种优化游戏进程cpu使用率的系统及方法 |
CN107194287A (zh) * | 2017-05-12 | 2017-09-22 | 中国科学院信息工程研究所 | 一种arm平台上的模块安全隔离方法 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100456226C (zh) * | 2006-04-21 | 2009-01-28 | 深圳市航盛电子股份有限公司 | 实现动画显示的车载多媒体系统 |
CN105117644B (zh) * | 2015-08-26 | 2018-08-28 | 福建天晴数码有限公司 | 采集Android外挂程序方法及系统 |
CN107080944B (zh) * | 2017-05-26 | 2021-04-20 | 徐州爱吾宠互联网科技有限公司 | 一种检测网络游戏外挂的方法 |
-
2018
- 2018-07-05 CN CN201810732972.8A patent/CN110691278B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105354040A (zh) * | 2015-12-10 | 2016-02-24 | 网易(杭州)网络有限公司 | 双引擎游戏内置工具栏的方法、装置及终端 |
CN106295325A (zh) * | 2016-08-12 | 2017-01-04 | 武汉斗鱼网络科技有限公司 | 一种用于获取显卡内容的hook方法和系统 |
CN106776022A (zh) * | 2016-12-09 | 2017-05-31 | 武汉斗鱼网络科技有限公司 | 一种优化游戏进程cpu使用率的系统及方法 |
CN107194287A (zh) * | 2017-05-12 | 2017-09-22 | 中国科学院信息工程研究所 | 一种arm平台上的模块安全隔离方法 |
Also Published As
Publication number | Publication date |
---|---|
CN110691278A (zh) | 2020-01-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11010227B2 (en) | Exception stack information acquisition method and device and computer-readable storage medium | |
CN106708704B (zh) | 一种对崩溃日志进行分类的方法和装置 | |
CN107820210B (zh) | 一种签到方法、移动终端及计算机可读存储介质 | |
CN110691278B (zh) | 防止直播时外挂误判的方法、存储介质、电子设备及系统 | |
CN107545181A (zh) | 程序运行方法、终端及计算机可读存储介质 | |
CN105630659A (zh) | 应用崩溃日志的获取方法及装置 | |
CN110554957A (zh) | 测试用户界面的方法、装置、电子设备及可读存储介质 | |
CN112783516A (zh) | 硬件适配的方法、电子设备和计算机可读存储介质 | |
CN107729750A (zh) | 结合配置信息和硬件特性的安卓模拟器检测方法及装置 | |
EP3050605B1 (en) | A method for event detection in real-time graphic applications | |
CN106484779B (zh) | 文件操作方法及装置 | |
CN112560530A (zh) | 一种二维码处理方法、设备、介质及电子设备 | |
CN113535539A (zh) | 游戏编辑中调试方法、装置、设备及存储介质 | |
CN111142735B (zh) | 一种软件页面的创建方法、装置、终端设备和存储介质 | |
CN114510300A (zh) | 一种在派生类中嵌入目标对象的方法及设备 | |
CN111242116B (zh) | 屏幕定位方法及装置 | |
CN108133149B (zh) | 一种数据保护方法、装置及电子设备 | |
CN113010416A (zh) | 银行柜面交易自动化测试方法及装置 | |
CN111831284A (zh) | 渲染调试方法、装置及设备 | |
CN112188177A (zh) | 花屏预防方法、终端设备及存储介质 | |
CN112364309A (zh) | 信息处理方法、电子设备和计算机可读存储介质 | |
CN107403176B (zh) | 文本图片中文字背景反色的检测方法和装置 | |
CN112906704A (zh) | 用于跨域目标检测的方法和装置 | |
CN113496232B (zh) | 标签校验方法和设备 | |
CN112967187B (zh) | 用于目标检测的方法和装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |