首页 程序被加速检测方法、存储介质、设备及系统

程序被加速检测方法、存储介质、设备及系统

举报
开通vip

程序被加速检测方法、存储介质、设备及系统(19)中华人民共和国国家知识产权局(12)发明专利申请(10)申请公布号CN111124869A(43)申请公布日2020.05.08(21)申请号201811280542.3(22)申请日2018.10.30(71)申请人武汉斗鱼网络科技有限公司地址430000湖北省武汉市东湖开发区软件园东路1号软件产业4.1期B1栋11楼(72)发明人周志刚 (74)专利代理机构武汉智权专利代理事务所(特殊普通合伙)42225代理人张凯(51)Int.Cl.G06F11/36(2006.01)权利要求书2页说明书12页附图1...

程序被加速检测方法、存储介质、设备及系统
(19)中华人民共和国国家知识产权局(12)发明专利申请(10)申请公布号CN111124869A(43)申请公布日2020.05.08(21)申请号201811280542.3(22)申请日2018.10.30(71)申请人武汉斗鱼网络科技有限公司地址430000湖北省武汉市东湖开发区软件园东路1号软件产业4.1期B1栋11楼(72)发明人周志刚 (74)专利代理机构武汉智权专利代理事务所(特殊普通合伙)42225代理人张凯(51)Int.Cl.G06F11/36(2006.01)权利要求书2页说明书12页附图1页(54)发明名称程序被加速检测方法、存储介质、设备及系统(57)摘要本发明公开了一种程序被加速检测方法、存储介质、设备及系统,涉及网络安全领域,该方法包括获取程序运行时所调用的Windows系统的时间函数,所述时间函数包括timeGetTime、GetTickCount、QueryPerformanceCounter和GetSystemTime中的一种或多种;获取时间函数的头代码;将获取的时间函数的头代码上传至后台服务器;后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对,若相同,则判断程序未被加速,若不同,则判断程序被加速。本发明能够实现程序是否被加速的有效检测。CN111124869ACN111124869A权 利 要 求 书1/2页1.一种程序被加速检测方法,用于对运行于Windows系统中的程序进行检测,其特征在于,包括以下步骤:获取程序运行时所调用的Windows系统的时间函数,所述时间函数包括timeGetTime、GetTickCount、QueryPerformanceCounter和GetSystemTime中的一种或多种;获取时间函数的头代码;将获取的时间函数的头代码加密后上传至后台服务器;后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对,若相同,则判断程序未被加速,若不同,则判断程序被加速。2.如权利要求1所述的一种程序被加速检测方法,其特征在于:所述时间函数用于所述程序查询当前系统时间以及程序运行时间;当后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对时,基于程序运行时所调用的时间函数,后台服务器将自身存储的该时间函数的头代码,与接收的该时间函数的头代码进行比对。3.如权利要求1所述的一种程序被加速检测方法,其特征在于:所述将获取的时间函数的头代码加密后上传至后台服务器,具体步骤为:S301:加载组件ntdll.dll,所述组件ntdll.dll中存储有用于获取Windows系统版本号的系统API函数;S302:通过系统函数GetProcAddress获取组件ntdll.dll的接口RtlGetNtVersionNumbers,基于接口RtlGetNtVersionNumbers获取用于获取Windows系统版本号的系统API函数的内存地址,得到用于获取Windows系统版本号的系统API函数;S303:通过用于获取Windows系统版本号的系统API函数,获得Windows系统的版本号;S304:结合当前系统时间,使用Md5算法对获得的版本号计算HASH值,将计算得到的HASH值作为密钥;S305:使用加密算法TEA,同时结合计算得到的秘钥对获取的时间函数的头代码进行加密,然后加加密后的头代码上传至后台服务器。4.如权利要求1所述的一种程序被加速检测方法,其特征在于:获取所述时间函数timeGetTime的头代码的步骤包括:S211:获取时间函数timeGetTime所在winmm.dll的句柄;S212:调用系统函数GetProcAddress获取时间函数timeGetTime在winmm.dll中的内存地址;S213:基于获取的内存地址,读取时间函数timeGetTime开头10个字节的代码,得到时间函数timeGetTime的头代码。5.如权利要求1所述的一种程序被加速检测方法,其特征在于:获取时间函数GetTickCount的头代码的步骤包括:S221:获取时间函数GetTickCount所在kernel32.dll的句柄;S222:调用系统函数GetProcAddress获取时间函数GetTickCount在kernel32.dll中的内存地址;S223:基于获取的内存地址,读取时间函数GetTickCount开头10个字节的代码,得到时间函数GetTickCount的头代码。2CN111124869A权 利 要 求 书2/2页6.如权利要求1所述的一种程序被加速检测方法,其特征在于:获取时间函数QueryPerformanceCounter的头代码的步骤包括:S231:获取时间函数QueryPerformanceCounter在kernel32.dll中的句柄;S232:调用系统函数GetProcAddress获取时间函数QueryPerformanceCounter在kernel32.dll中的内存地址;S233:基于获取的内存地址,读取时间函数QueryPerformanceCounter开头10个字节的代码,得到时间函数QueryPerformanceCounter的头代码。7.如权利要求1所述的一种程序被加速检测方法,其特征在于:获取时间函数GetSystemTime的头代码的步骤包括:S241:获取时间函数GetSystemTime所在kernel32.dll的句柄;S242:调用系统函数GetProcAddress获取时间函数GetSystemTime在kernel32.dll中的内存地址;S243:基于获取的内存地址,读取时间函数GetSystemTime开头10个字节的代码,得到时间函数GetSystemTime的头代码。8.一种存储介质,该存储介质上存储有计算机程序,其特征在于:所述计算机程序被处理器执行时实现以下步骤:获取程序运行时所调用的Windows系统的时间函数,所述时间函数包括timeGetTime、GetTickCount、QueryPerformanceCounter和GetSystemTime中的一种或多种;获取时间函数的头代码;将获取的时间函数的头代码加密后上传至后台服务器;后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对,若相同,则判断程序未被加速,若不同,则判断程序被加速。9.一种电子设备,其特征在于,所述电子设备包括:第一获取单元,其用于获取程序运行时所调用的Windows系统的时间函数,所述时间函数包括timeGetTime、GetTickCount、QueryPerformanceCounter和GetSystemTime中的一种或多种;第二获取单元,其用于获取时间函数的头代码;上传单元,其用于将获取的时间函数的头代码加密后上传至后台服务器;比对单元,其用于后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对,若相同,则判断程序未被加速,若不同,则判断程序被加速。10.一种程序被加速检测系统,其特征在于,包括:第一获取模块,其用于获取程序运行时所调用的Windows系统的时间函数,所述时间函数包括timeGetTime、GetTickCount、QueryPerformanceCounter和GetSystemTime中的一种或多种;第二获取模块,其用于获取时间函数的头代码;上传模块,其用于将获取的时间函数的头代码加密后上传至后台服务器;比对模块,其用于后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对,若相同,则判断程序未被加速,若不同,则判断程序被加速。3CN111124869A说 明 书1/12页程序被加速检测方法、存储介质、设备及系统技术领域[0001]本发明涉及网络安全领域,具体涉及一种程序被加速检测方法、存储介质、设备及系统。背景技术[0002]对于运行于Windows端的客户端程序来说,一些非法人士通过非法手段来使得客户端的程序能够进行加速,从而造成了程序的不平衡,甚至对于服务器都是由危害的,其加速的原理是通过内联hook(钩子)来对系统时间函数进行hook,从而对程序中所有获取时间的函数返回一个加速过的时间。[0003]例如对于抽奖程序,客户端程序被加速,很有可能其会先发出抽奖命令,违反抽奖的随机性公平远离,而对于游戏程序,如果其被加速,那么游戏中角色的移动都会比其他角色更快速,影响他人的游戏体验。当客户端程序被加速,客户端程序的稳定运行便会受到影响,严重的甚至带来经济等财产上的损失。发明内容[0004]针对现有技术中存在的缺陷,本发明的目的在于提供一种程序被加速检测方法,能够实现程序是否被加速的有效检测。本发明还相应地提供了存储介质、设备及程序被加速检测系统。[0005]为达到以上目的,本发明采取的技术 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 是:[0006]本发明第一方面提供一种程序被加速检测方法,用于对运行于Windows系统中的程序进行检测,包括以下步骤:[0007]获取程序运行时所调用的Windows系统的时间函数,所述时间函数包括timeGetTime、GetTickCount、QueryPerformanceCounter和GetSystemTime中的一种或多种;[0008]获取时间函数的头代码;[0009]将获取的时间函数的头代码加密后上传至后台服务器;[0010]后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对,若相同,则判断程序未被加速,若不同,则判断程序被加速。[0011]结合第一方面,在第一种可能的实现方式中,[0012]所述时间函数用于所述程序查询当前系统时间以及程序运行时间;[0013]当后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对时,基于程序运行时所调用的时间函数,后台服务器将自身存储的该时间函数的头代码,与接收的该时间函数的头代码进行比对。[0014]结合第一方面,在第二种可能的实现方式中,所述将获取的时间函数的头代码加密后上传至后台服务器,具体步骤为:[0015]S301:加载组件ntdll.dll,所述组件ntdll.dll中存储有用于获取Windows系统版4CN111124869A说 明 书2/12页本号的系统API函数;[0016]S302:通过系统函数GetProcAddress获取组件ntdll.dll的接口RtlGetNtVersionNumbers,基于接口RtlGetNtVersionNumbers获取用于获取Windows系统版本号的系统API函数的内存地址,得到用于获取Windows系统版本号的系统API函数;[0017]S303:通过用于获取Windows系统版本号的系统API函数,获得Windows系统的版本号;[0018]S304:结合当前系统时间,使用Md5算法对获得的版本号计算HASH值,将计算得到的HASH值作为密钥;[0019]S305:使用加密算法TEA,同时结合计算得到的秘钥对获取的时间函数的头代码进行加密,然后加加密后的头代码上传至后台服务器。[0020]结合第一方面,在第三种可能的实现方式中,获取所述时间函数timeGetTime的头代码的步骤包括:[0021]S211:获取时间函数timeGetTime所在winmm.dll的句柄;[0022]S212:调用系统函数GetProcAddress获取时间函数timeGetTime在winmm.dll中的内存地址;[0023]S213:基于获取的内存地址,读取时间函数timeGetTime开头10个字节的代码,得到时间函数timeGetTime的头代码。[0024]结合第一方面,在第四种可能的实现方式中,获取时间函数GetTickCount的头代码的步骤包括:[0025]S221:获取时间函数GetTickCount所在kernel32.dll的句柄;[0026]S222:调用系统函数GetProcAddress获取时间函数GetTickCount在kernel32.dll中的内存地址;[0027]S223:基于获取的内存地址,读取时间函数GetTickCount开头10个字节的代码,得到时间函数GetTickCount的头代码。[0028]结合第一方面,在第五种可能的实现方式中,获取时间函数QueryPerformanceCounter的头代码的步骤包括:[0029]S231:获取时间函数QueryPerformanceCounter在kernel32.dll中的句柄;[0030]S232:调用系统函数GetProcAddress获取时间函数QueryPerformanceCounter在kernel32.dll中的内存地址;[0031]S233:基于获取的内存地址,读取时间函数QueryPerformanceCounter开头10个字节的代码,得到时间函数QueryPerformanceCounter的头代码。[0032]结合第一方面,在第六种可能的实现方式中,获取时间函数GetSystemTime的头代码的步骤包括:[0033]S241:获取时间函数GetSystemTime所在kernel32.dll的句柄;[0034]S242:调用系统函数GetProcAddress获取时间函数GetSystemTime在kernel32.dll中的内存地址;[0035]S243:基于获取的内存地址,读取时间函数GetSystemTime开头10个字节的代码,得到时间函数GetSystemTime的头代码。[0036]本发明第二方面提供一种存储介质,该存储介质上存储有计算机程序,所述计算5CN111124869A说 明 书3/12页机程序被处理器执行时实现以下步骤:[0037]获取程序运行时所调用的Windows系统的时间函数,所述时间函数包括timeGetTime、GetTickCount、QueryPerformanceCounter和GetSystemTime中的一种或多种;[0038]获取时间函数的头代码;[0039]将获取的时间函数的头代码加密后上传至后台服务器;[0040]后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对,若相同,则判断程序未被加速,若不同,则判断程序被加速。[0041]本发明第三方面提供一种电子设备,所述电子设备包括:[0042]第一获取单元,其用于获取程序运行时所调用的Windows系统的时间函数,所述时间函数包括timeGetTime、GetTickCount、QueryPerformanceCounter和GetSystemTime中的一种或多种;[0043]第二获取单元,其用于获取时间函数的头代码;[0044]上传单元,其用于将获取的时间函数的头代码加密后上传至后台服务器;[0045]比对单元,其用于后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对,若相同,则判断程序未被加速,若不同,则判断程序被加速。[0046]本发明第四方面提供一种程序被加速检测系统,包括:[0047]第一获取模块,其用于获取程序运行时所调用的Windows系统的时间函数,所述时间函数包括timeGetTime、GetTickCount、QueryPerformanceCounter和GetSystemTime中的一种或多种;[0048]第二获取模块,其用于获取时间函数的头代码;[0049]上传模块,其用于将获取的时间函数的头代码加密后上传至后台服务器;[0050]比对模块,其用于后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对,若相同,则判断程序未被加速,若不同,则判断程序被加速。[0051]与现有技术相比,本发明的优点在于:通过获取程序运行时所调用的Windows系统的时间函数,然后依次获取时间函数的头代码,将获取的时间函数的头代码上传至后台服务器,后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对,进而判断时间函数是否被hook,进一步判断程序是否被非法进行加速处理,实现对程序的精确判断,有效保证程序的稳定运行以及保障各方的合法利益。附图说明[0052]图1为本发明实施例中一种程序被加速检测方法的流程图;[0053]图2为本发明实施例中一种电子设备=的结构示意图。具体实施方式[0054]本发明实施例提供了一种程序被加速检测方法,通过对程序运行时所需的时间函数是否被hook进行判断,从而判断程序是否被进行加速非法处理。本发明实施例还相应提供了存储介质、电子设备和程序被加速检测系统。[0055]以下结合附本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完6CN111124869A说 明 书4/12页整地描述,显然所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。[0056]参见图1所示,本发明实施例提供的一种程序被加速检测方法的一实施例包括:[0057]S1:获取程序运行时所调用的Windows系统的时间函数,所述时间函数包括timeGetTime、GetTickCount、QueryPerformanceCounter和GetSystemTime中的一种或多种。[0058]本发明实施例中,时间函数用于程序查询当前系统时间以及程序运行时间。对于windoes系统,其提供了相应的API(Application Programming Interface,应用程序编程接口)函数以使程序来查询当前系统时间或者程序运行了多长时间。[0059]程序运行时,调用时间函数timeGetTime、GetTickCount、QueryPerformanceCounter或GetSystemTime中的至少一个。即程序若想要获取当前系统时间或者程序自身已运行了多长时间,则必须调用上述时间函数中的一个或多个。程序若调用了上述时间函数用于时间相关的判断和处理,那么不法人员则可以通过hook这些函数,从而返回错误的时间值,导致程序开启了加速的功能,对于一个复杂的应用程序来说,其可能调用上述所有的系统时间函数,因此对于程序被加速的判断,需要对每一个时间函数进行检测其是否被hook。[0060]S2:获取时间函数的头代码;[0061]本发明实施例中,依次获取时间函数的头代码,具体步骤为:依次获取时间函数timeGetTime的头代码、时间函数GetTickCount的头代码、时间函数QueryPerformanceCounter的头代码和时间函数GetSystemTime的头代码。[0062]S3:将获取的时间函数的头代码加密后上传至后台服务器;[0063]S4:后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对,若相同,则判断程序未被加速,若不同,则判断程序被加速。后台服务器中存储的时间函数的头代码为时间函数的原始的头代码,若时间函数被hook,其头代码会发生改变,故基于此,通过比对的方式判断时间函数是否被hook,进而对程序是否被加速进行检测。当后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对时,基于程序运行时所调用的时间函数,后台服务器将自身存储的该时间函数的头代码,与接收的该时间函数的头代码进行比对。即程序运行调用了哪个时间函数,则在比对时使用该时间函数的原本的头代码进行比对。[0064]可选地,在上述图1对应的实施例的基础上,本发明实施例提供的一种程序被加速检测方法的第一个可选实施例中,获取时间函数timeGetTime的头代码,具体步骤为:[0065]S211:调用系统函数GetModuleHandle获取时间函数timeGetTime所在系统模块winmm.dll的句柄。GetModuleHandle是Windows系统的函数,功能是用于获取一个应用程序或动态链接库的模块句柄。[0066]本发明实施例中,时间函数timeGetTime是系统提供的用于获取时间的函数,该函数的原型为DWORD timeGetTime(),时间函数无参数,其返回值是一个DWORD类型的数值,时间函数timeGetTime以毫秒为单位记录系统从启动开始所经过的时间,程序通过调用该函数并依据调用后的返回值来判断经过的时间,当程序被不法人士修改成加速状态,那么7CN111124869A说 明 书5/12页不法人士通过会使用内联hook的方式,内联hook会修改内存中时间函数timeGetTime的代码。winmm.dll,即Windows Multimedia API描述是Windows多媒体相关应用程序接口。[0067]调用系统函数GetModuleHandle获取时间函数timeGetTime所在系统模块winmm.dll的句柄,其具体实现代码为:[0068]HMODULE hModule=GetModuleHandle(“winmm.dll”)。[0069]S212:调用系统函数GetProcAddress获取时间函数timeGetTime在系统模块winmm.dll中的内存地址;GetProcAddress是一个Windows系统函数,功能是用于检索指定的动态链接库(DLL)中的输出库函数地址。[0070]系统函数GetProcAddress的原型为:[0071]FARPROC GetProcAddress([0072]HMODULE hModule,//DLL模块句柄[0073]LPCSTR lpProcName//函数名[0074]);[0075]其中的返回值便是时间函数timeGetTime在系统模块winmm.dll中的内存地址,运行以下代码:[0076]DWORD address=GetProcAddress(hModule,“timeGetTime”);[0077]最终得到时间函数timeGetTime的内存地址address。[0078]S213:基于获取的内存地址,读取时间函数timeGetTime开头10个字节的代码,得到时间函数timeGetTime的头代码。[0079]本发明实施例中,读取时间函数timeGetTime开头10个字节的代码,具体步骤为:[0080]首先定义一个代码用于存储读取的代码,定义的代码为:[0081]BYTE code[10]={0};[0082]接着编写一个for循环来读取时间函数timeGetTime的内存代码:[0083]For(int I=0;I<10;i++){[0084]Code[i]=address[i];[0085]}[0086]最后将得到的时间函数timeGetTime开头10个字节的代码存储于code中。[0087]可选地,在上述图1对应的实施例的基础上,本发明实施例提供的一种程序被加速检测方法的第二个可选实施例中,获取时间函数GetTickCount的头代码,具体步骤为:[0088]S221:调用系统函数GetModuleHandle获取时间函数GetTickCount所在系统模块kernel32.dll的句柄。kernel32.dll是Windows系统中非常重要的32位动态链接库文件,属于内核级文件。[0089]本发明实施例中,时间函数GetTickCount用于记录系统从启动开始到现在所经历的时间,单位为毫秒。时间函数GetTickCount的原型为:[0090]DWORD GetTickCount()[0091]该函数无参数,其返回值是一个DWORD类型的数值,程序通过调用该函数并依据返回值来判断程序所经过的时间。当程序被不法人士修改成加速状态,那么不法人士通过会使用内联hook的方式,内联hook会修改内存中时间函数GetTickCount的代码,因此可以通过获取该函数在内存中的起始地址,读取函数的头代码,进而判断函数是否被内联hook,进8CN111124869A说 明 书6/12页而判断函数是否被加速。[0092]系统函数GetModuleHandle的原型为:[0093]FARPROC GetProcAddress([0094]HMODULE hModule,//DLL模块句柄[0095]LPCSTR lpProcName//函数名[0096]);[0097]其中返回值便是时间函数GetTickCount在系统模块kernel32.dll中的内存地址。[0098]S222:调用系统函数GetProcAddress获取时间函数GetTickCount在系统模块kernel32.dll中的内存地址;该步骤的具体执行代码为:[0099]DWORD address=GetProcAddress(hModule,“GetTickCount”);[0100]最终得到时间函数GetTickCount的内存地址。[0101]S223:基于获取的内存地址,读取时间函数GetTickCount开头10个字节的代码,得到时间函数GetTickCount的头代码。[0102]本发明实施例中,读取时间函数GetTickCount开头10个字节的代码,具体步骤为:[0103]首先定义一个代码用于存储读取的代码,定义的代码为:[0104]BYTE code[10]={0};[0105]接着编写一个for循环来读取时间函数GetTickCount的内存代码:[0106]For(int I=0;I<10;i++){[0107]Code[i]=address[i];[0108]}[0109]最后将得到的时间函数GetTickCount开头10个字节的代码存储于code中。[0110]可选地,在上述图1对应的实施例的基础上,本发明实施例提供的一种程序被加速检测方法的第三个可选实施例中,获取时间函数QueryPerformanceCounter的头代码,具体步骤为:[0111]S231:调用系统函数GetModuleHandle获取时间函数QueryPerformanceCounter所在系统模块kernel32.dll的句柄;[0112]本发明实施例中,时间函数QueryPerformanceCounter是一个更为精确的时间函数。时间函数QueryPerformanceCounter的原型为:[0113]BOOLQueryPerformanceCounter(LARGE_INTEGER*ipPerformanceCount);[0114]其中,参数LARGE_INTEGER*ipProformanceCount为一个指针变量用于函数传值,即指向现时计数器的值。[0115]程序通过调用该函数并依据返回值来判断程序所经过的时间。当程序被不法人士修改成加速状态,那么不法人士通过会使用内联hook的方式,内联hook会修改内存中时间函数QueryPerformanceCounter的代码,因此可以通过获取该函数在内存中的起始地址,读取函数的头代码,进而判断函数是否被内联hook,进而判断函数是否被加速。[0116]获取时间函数QueryPerformanceCounter在系统模块kernel32.dll中的句柄的执行代码为:HMODULE hModule=GetModuleHandle(“kernel32.dll”)。[0117]S232:调用系统函数GetProcAddress获取时间函数QueryPerformanceCounter在系统模块kernel32.dll中的内存地址;9CN111124869A说 明 书7/12页[0118]系统函数GetModuleHandle的原型为:[0119]FARPROC GetProcAddress([0120]HMODULE hModule,//DLL模块句柄[0121]LPCSTR lpProcName//函数名[0122]);[0123]其中返回值便是时间函数QueryPerformanceCounter在系统模块kernel32.dll中的内存地址。[0124]S233:基于获取的内存地址,读取时间函数QueryPerformanceCounter开头10个字节的代码,得到时间函数QueryPerformanceCounter的头代码。[0125]本发明实施例中,读取时间函数QueryPerformanceCounter开头10个字节的代码,具体步骤为:[0126]首先定义一个代码用于存储读取的代码,定义的代码为:[0127]BYTE code[10]={0};[0128]接着编写一个for循环来读取时间函数QueryPerformanceCounter的内存代码:[0129]For(int I=0;I<10;i++){[0130]Code[i]=address[i];[0131]}[0132]最后将得到的时间函数QueryPerformanceCounter开头10个字节的代码存储于code中。[0133]可选地,在上述图1对应的实施例的基础上,本发明实施例提供的一种程序被加速检测方法的第四个可选实施例中,获取时间函数GetSystemTime的头代码,具体步骤为:[0134]S241:调用系统函数GetModuleHandle获取时间函数GetSystemTime所在系统模块kernel32.dll的句柄。[0135]本发明实施例中,时间函数GetSystemTime的返回值是一个UTC(协调世界时)的时间,时间采用的是协同世界时间格式,时间函数GetSystemTime的原型为:[0136]Void GetSystemTime(LPSYSTEMTIME lpSystemTime);[0137]其中参数LPSYSTEMTIME lpSystemTime为一个指针变量用于函数传值,即指向获取到的值。[0138]程序通过调用该函数并依据返回值来判断程序所经过的时间。当程序被不法人士修改成加速状态,那么不法人士通过会使用内联hook的方式,内联hook会修改内存中时间函数GetSystemTime的代码。[0139]获取时间函数GetSystemTime在系统模块kernel32.dll中的句柄的执行代码为:HMODULE hModule=GetModuleHandle(“kernel32.dll”)。[0140]S242:调用系统函数GetProcAddress获取时间函数GetSystemTime在系统模块kernel32.dll中的内存地址;[0141]系统函数GetModuleHandle的原型为:[0142]FARPROC GetProcAddress([0143]HMODULE hModule,//DLL模块句柄[0144]LPCSTR lpProcName//函数名10CN111124869A说 明 书8/12页[0145]);[0146]其中返回值便是时间函数GetSystemTime在系统模块kernel32.dll中的内存地址。[0147]S243:基于获取的内存地址,读取时间函数GetSystemTime开头10个字节的代码,得到时间函数GetSystemTime的头代码。[0148]本发明实施例中,读取时间函数GetSystemTime开头10个字节的代码,具体步骤为:[0149]首先定义一个代码用于存储读取的代码,定义的代码为:[0150]BYTE code[10]={0};[0151]接着编写一个for循环来读取时间函数GetSystemTime的内存代码:[0152]For(int I=0;I<10;i++){[0153]Code[i]=address[i];[0154]}[0155]最后将得到的时间函数GetSystemTime开头10个字节的代码存储于code中。[0156]可选地,在上述图1对应的实施例的基础上,本发明实施例提供的一种程序被加速检测方法的第五个可选实施例中,获取的时间函数的头代码加密后上传至后台服务器,后台服务器接收到时间函数的头代码后,先进行解密,再将解密后的时间函数的头代码与自身存储的原始时间函数的头代码进行比对,有效保证数据的传输安全。具体的,将获取的时间函数的头代码加密后上传至后台服务器,具体步骤为:[0157]S301:加载组件ntdll.dll,所述组件ntdll.dll中存储有用于获取Windows系统版本号的系统API函数。[0158]本发明实施例中,程序可能会运行于不同版本的Windows系统上,而不同Windows系统版本中对应的系统时间函数的头代码可能是不同的,需要针对所有版本的系统进行是否加速的检查。同时为保证数据传输至后台服务器的安全性,基于系统版本来对数据进行加密,从而使得不同系统版本下的加密结果是不同的,有效保证数据的安全性。[0159]组件ntdll.dll是重要的Windows NT内核级文件。描述了windows本地NTAPI的接口。当Windows启动时,ntdll.dll就驻留在内存中特定的写保护区域,使别的程序无法占用这个内存区域。加载组件ntdll.dll的具体执行代码为:[0160]HMODULE hm=LoadLibrary(L"ntdll.dll")。[0161]S302:通过系统函数GetProcAddress获取组件ntdll.dll的接口RtlGetNtVersionNumbers,基于接口RtlGetNtVersionNumbers获取用于获取Windows系统版本号的系统API函数的内存地址,得到用于获取Windows系统版本号的系统API函数。GetProcAddress是一个计算机函数,功能是检索指定的动态链接库(DLL)中的输出库函数地址。接口RtlGetNtVersionNumbers用于获取操作系统版本号。[0162]获取用于获取Windows系统版本号的系统API函数的内存地址,具体执行代码为:[0163]func=GetProcAddress(hm,"RtlGetNtVersionNumbers");[0164]其中hm则是之前的ntdll模块,RtlGetNtVersionNumbers是接口的名称,返回值func则得到对应的接口内存地址。[0165]S303:通过用于获取Windows系统版本号的系统API函数,获得Windows系统的版本11CN111124869A说 明 书9/12页号。定义系统版本号的变量并初始化为0。[0166]DWORD dwMajorVersion=0;[0167]DWORD dwMinorVersion=0;[0168]DWORD dwBuildNumber=0;[0169]func(&dwMajorVersion,&dwMinorVersion,&dwBuildNumber);[0170]调用完成此函数,将系统版本号存储在dwMajorVersion和dwMinorVersion中。[0171]S304:结合当前系统时间,使用Md5算法对获得的版本号计算HASH值,将计算得到的HASH值作为密钥。[0172]即首先定义一个变量time 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示当前系统时间,对密钥的计算加入时间从而密钥总在发生变化。定义变量time的代码为:uint64_t time=Time()。[0173]使用Md5算法对获得的版本号计算HASH值:[0174]KEY=Md5.Create(dwMajorVersion+dwMinorVersion+time);[0175]其中,Md5.Create表示Md5算法接口,dwMajorVersion和dwMinorVersion代表系统版本号,time代表当前系统时间,KEY代表密钥。[0176]S305:使用加密算法TEA,同时结合计算得到的秘钥对获取的时间函数的头代码进行加密,然后加加密后的头代码上传至后台服务器。使用加密算法TEA,同时结合计算得到的秘钥对获取的时间函数的头代码进行加密,过程为:[0177]encryptCode=Tea.Encrypt(Code,KEY)[0178]其中,Tea.Encrypt为加密算法TEA的加密接口,加密算法TEA为一种分组密码算法。Code是获取的时间函数的头代码。encryptCode是加密后的头代码。最终上传给后台服务器的数据会携带上报加密时使用的time,操作系统版本号dwMajorVersion和dwMinorVersion。[0179]服务器收到数据后,则从上报数据中取出time,以及操作系统版本号dwMajorVersion和dwMinorVersion,然后采用同样的算法来计算得到密钥KEY。后台服务器则使用TEA来对数据进行解密:[0180]Code=Tea.Decrypt(encryptCode,KEY);[0181]服务器若想验证客户端上报的代码是否正确,则需要收集每个操作系统版本对应的所有系统时间函数具体代码,然后基于上报到后台服务器的系统版本,来对比同样操作系统版本的代码,从而保证验证的准确无误。[0182]本发明实施例的程序被加速检测方法,通过获取程序运行时所调用的Windows系统的时间函数,然后依次获取时间函数的头代码,将获取的时间函数的头代码上传至后台服务器,后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对,进而判断时间函数是否被hook,进一步判断程序是否被非法进行加速处理,实现对程序的精确判断,有效保证程序的稳定运行以及保障各方的合法利益。[0183]本发明实施例提供的一种存储介质的一实施例包括:该存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:[0184]获取程序运行时所调用的Windows系统的时间函数,所述时间函数包括timeGetTime、GetTickCount、QueryPerformanceCounter和GetSystemTime中的一种或多种;12CN111124869A说 明 书10/12页[0185]获取时间函数的头代码;[0186]将获取的时间函数的头代码加密后上传至后台服务器;[0187]后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对,若相同,则判断程序未被加速,若不同,则判断程序被加速。[0188]可选地,在上述存储介质实施例的基础上,本发明实施例提供的一种存储介质的第一个可选实施例中,存储介质可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是但不限于:电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本文件中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。[0189]可选地,在上述存储介质的实施例及第一个可选实施例的基础上,本发明实施例提供的一种存储介质的第二个可选实施例中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、RF等等,或者上述的任意合适的组合。[0190]可选地,在上述存储介质的实施例及第一、第二个可选实施例的基础上,本发明实施例提供的一种存储介质的第三个可选实施例中,可以以一种或多种程序设计语言或其组合来编写用于执行本发明操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言,诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络,包括局域网(LAN)或广域网(WAN),连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。[0191]参见图2所示,本发明实施例提供的一种电子设备的一实施例包括:[0192]第一获取单元,其用于获取程序运行时所调用的Windows系统的时间函数,所述时间函数包括timeGetTime、GetTickCount、QueryPerformanceCounter和GetSystemTime中的一种或多种;[0193]第二获取单元,其用于获取时间函数的头代码;[0194]上传单元,其用于将获取的时间函数的头代码加密后上传至后台服务器;[0195]比对单元,其用于后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对,若相同,则判断程序未被加速,若不同,则判断程序被加速。13CN111124869A说 明 书11/12页[0196]本发明实施例提供的一种程序被加速检测系统的一实施例包括:[0197]第一获取模块,其用于获取程序运行时所调用的Windows系统的时间函数,所述时间函数包括timeGetTime、GetTickCount、QueryPerformanceCounter和GetSystemTime中的一种或多种;[0198]第二获取模块,其用于获取时间函数的头代码;[0199]上传模块,其用于将获取的时间函数的头代码加密后上传至后台服务器;[0200]比对模块,其用于后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对,若相同,则判断程序未被加速,若不同,则判断程序被加速。[0201]可选地,在上述一种程序被加速检测系统对应的实施例的基础上,本发明实施例提供的一种程序被加速检测系统的第一个可选实施例中,获取时间函数timeGetTime的头代码,具体步骤为:[0202]S211:调用系统函数GetModuleHandle获取时间函数timeGetTime所在系统模块winmm.dll的句柄。GetModuleHandle是Windows系统的函数,功能是用于获取一个应用程序或动态链接库的模块句柄。[0203]本发明实施例中,时间函数timeGetTime是系统提供的用于获取时间的函数,该函数的原型为DWORD timeGetTime(),时间函数无参数,其返回值是一个DWORD类型的数值,时间函数timeGetTime以毫秒为单位记录系统从启动开始所经过的时间,程序通过调用该函数并依据调用后的返回值来判断经过的时间,当程序被不法人士修改成加速状态,那么不法人士通过会使用内联hook的方式,内联hook会修改内存中时间函数timeGetTime的代码。winmm.dll,即Windows Multimedia API描述是Windows多媒体相关应用程序接口。[0204]调用系统函数GetModuleHandle获取时间函数timeGetTime所在系统模块winmm.dll的句柄,其具体实现代码为:[0205]HMODULE hModule=GetModuleHandle(“winmm.dll”)。[0206]S212:调用系统函数GetProcAddress获取时间函数timeGetTime在系统模块winmm.dll中的内存地址;GetProcAddress是一个Windows系统函数,功能是用于检索指定的动态链接库(DLL)中的输出库函数地址。[0207]系统函数GetProcAddress的原型为:[0208]FARPROC GetProcAddress([0209]HMODULE hModule,//DLL模块句柄[0210]LPCSTR lpProcName//函数名[0211]);[0212]其中的返回值便是时间函数timeGetTime在系统模块winmm.dll中的内存地址,运行以下代码:[0213]DWORD address=GetProcAddress(hModule,“timeGetTime”);[0214]最终得到时间函数timeGetTime的内存地址address。[0215]S213:基于获取的内存地址,读取时间函数timeGetTime开头10个字节的代码,得到时间函数timeGetTime的头代码。[0216]本发明实施例中,读取时间函数timeGetTime开头10个字节的代码,具体步骤为:[0217]首先定义一个代码用于存储读取的代码,定义的代码为:14CN111124869A说 明 书12/12页[0218]BYTE code[10]={0};[0219]接着编写一个for循环来读取时间函数timeGetTime的内存代码:[0220]For(int I=0;I<10;i++){[0221]Code[i]=address[i];[0222]}[0223]最后将得到的时间函数timeGetTime开头10个字节的代码存储于code中。[0224]本发明实施例的程序被加速检测系统,通过获取程序运行时所调用的Windows系统的时间函数,然后依次获取时间函数的头代码,将获取的时间函数的头代码上传至后台服务器,后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对,进而判断时间函数是否被hook,进一步判断程序是否被非法进行加速处理,实现对程序的精确判断,有效保证程序的稳定运行以及保障各方的合法利益。[0225]本发明不局限于上述实施方式,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围之内。本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。15CN111124869A说 明 书 附 图1/1页图1图216
本文档为【程序被加速检测方法、存储介质、设备及系统】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
机构认证用户
晒豆网络
晒豆网构建了专业的文档资料数据库晒豆网综合多年的运营经验,投入技术力量开发了专业的文档预览播放器,用户可以通过晒豆网文档播放器的放大功能了解到包括文档页数、表、图、文档结构、文档格式在内的一些基本信息,同时也可以快速的确认文档的真实性及内容是否为自己所需要。
格式:pdf
大小:439KB
软件:PDF阅读器
页数:16
分类:
上传时间:2022-11-04
浏览量:0