CN111124869A - 程序被加速检测方法、存储介质、设备及系统 - Google Patents
程序被加速检测方法、存储介质、设备及系统 Download PDFInfo
- Publication number
- CN111124869A CN111124869A CN201811280542.3A CN201811280542A CN111124869A CN 111124869 A CN111124869 A CN 111124869A CN 201811280542 A CN201811280542 A CN 201811280542A CN 111124869 A CN111124869 A CN 111124869A
- Authority
- CN
- China
- Prior art keywords
- time function
- head code
- program
- code
- function
- 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.)
- Pending
Links
- 238000001514 detection method Methods 0.000 title claims abstract description 17
- 238000000034 method Methods 0.000 claims abstract description 18
- 230000006870 function Effects 0.000 claims description 383
- 238000004422 calculation algorithm Methods 0.000 claims description 12
- 238000004590 computer program Methods 0.000 claims description 5
- 230000001133 acceleration Effects 0.000 description 16
- 230000008901 benefit Effects 0.000 description 4
- 230000005540 biological transmission Effects 0.000 description 3
- 230000003287 optical effect Effects 0.000 description 3
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000012545 processing Methods 0.000 description 2
- 238000004364 calculation method Methods 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 239000000835 fiber Substances 0.000 description 1
- 239000013307 optical fiber Substances 0.000 description 1
- 230000008569 process Effects 0.000 description 1
- 230000000644 propagated effect Effects 0.000 description 1
- 230000001902 propagating effect Effects 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
- 238000012795 verification Methods 0.000 description 1
- 239000011800 void material Substances 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test management for test execution, e.g. scheduling of test suites
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3692—Test management for test results analysis
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种程序被加速检测方法、存储介质、设备及系统,涉及网络安全领域,该方法包括获取程序运行时所调用的Windows系统的时间函数,所述时间函数包括timeGetTime、GetTickCount、QueryPerformanceCounter和GetSystemTime中的一种或多种;获取时间函数的头代码;将获取的时间函数的头代码上传至后台服务器;后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对,若相同,则判断程序未被加速,若不同,则判断程序被加速。本发明能够实现程序是否被加速的有效检测。
Description
技术领域
本发明涉及网络安全领域,具体涉及一种程序被加速检测方法、存储介质、设备及系统。
背景技术
对于运行于Windows端的客户端程序来说,一些非法人士通过非法手段来使得客户端的程序能够进行加速,从而造成了程序的不平衡,甚至对于服务器都是由危害的,其加速的原理是通过内联hook(钩子)来对系统时间函数进行hook,从而对程序中所有获取时间的函数返回一个加速过的时间。
例如对于抽奖程序,客户端程序被加速,很有可能其会先发出抽奖命令,违反抽奖的随机性公平远离,而对于游戏程序,如果其被加速,那么游戏中角色的移动都会比其他角色更快速,影响他人的游戏体验。当客户端程序被加速,客户端程序的稳定运行便会受到影响,严重的甚至带来经济等财产上的损失。
发明内容
针对现有技术中存在的缺陷,本发明的目的在于提供一种程序被加速检测方法,能够实现程序是否被加速的有效检测。本发明还相应地提供了存储介质、设备及程序被加速检测系统。
为达到以上目的,本发明采取的技术方案是:
本发明第一方面提供一种程序被加速检测方法,用于对运行于Windows系统中的程序进行检测,包括以下步骤:
获取程序运行时所调用的Windows系统的时间函数,所述时间函数包括timeGetTime、GetTickCount、QueryPerformanceCounter和GetSystemTime中的一种或多种;
获取时间函数的头代码;
将获取的时间函数的头代码加密后上传至后台服务器;
后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对,若相同,则判断程序未被加速,若不同,则判断程序被加速。
结合第一方面,在第一种可能的实现方式中,
所述时间函数用于所述程序查询当前系统时间以及程序运行时间;
当后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对时,基于程序运行时所调用的时间函数,后台服务器将自身存储的该时间函数的头代码,与接收的该时间函数的头代码进行比对。
结合第一方面,在第二种可能的实现方式中,所述将获取的时间函数的头代码加密后上传至后台服务器,具体步骤为:
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,同时结合计算得到的秘钥对获取的时间函数的头代码进行加密,然后加加密后的头代码上传至后台服务器。
结合第一方面,在第三种可能的实现方式中,获取所述时间函数timeGetTime的头代码的步骤包括:
S211:获取时间函数timeGetTime所在winmm.dll的句柄;
S212:调用系统函数GetProcAddress获取时间函数timeGetTime在winmm.dll中的内存地址;
S213:基于获取的内存地址,读取时间函数timeGetTime开头10个字节的代码,得到时间函数timeGetTime的头代码。
结合第一方面,在第四种可能的实现方式中,获取时间函数GetTickCount的头代码的步骤包括:
S221:获取时间函数GetTickCount所在kernel32.dll的句柄;
S222:调用系统函数GetProcAddress获取时间函数GetTickCount在kernel32.dll中的内存地址;
S223:基于获取的内存地址,读取时间函数GetTickCount开头10个字节的代码,得到时间函数GetTickCount的头代码。
结合第一方面,在第五种可能的实现方式中,获取时间函数QueryPerformanceCounter的头代码的步骤包括:
S231:获取时间函数QueryPerformanceCounter在kernel32.dll中的句柄;
S232:调用系统函数GetProcAddress获取时间函数QueryPerformanceCounter在kernel32.dll中的内存地址;
S233:基于获取的内存地址,读取时间函数QueryPerformanceCounter开头10个字节的代码,得到时间函数QueryPerformanceCounter的头代码。
结合第一方面,在第六种可能的实现方式中,获取时间函数GetSystemTime的头代码的步骤包括:
S241:获取时间函数GetSystemTime所在kernel32.dll的句柄;
S242:调用系统函数GetProcAddress获取时间函数GetSystemTime在kernel32.dll中的内存地址;
S243:基于获取的内存地址,读取时间函数GetSystemTime开头10个字节的代码,得到时间函数GetSystemTime的头代码。
本发明第二方面提供一种存储介质,该存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:
获取程序运行时所调用的Windows系统的时间函数,所述时间函数包括timeGetTime、GetTickCount、QueryPerformanceCounter和GetSystemTime中的一种或多种;
获取时间函数的头代码;
将获取的时间函数的头代码加密后上传至后台服务器;
后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对,若相同,则判断程序未被加速,若不同,则判断程序被加速。
本发明第三方面提供一种电子设备,所述电子设备包括:
第一获取单元,其用于获取程序运行时所调用的Windows系统的时间函数,所述时间函数包括timeGetTime、GetTickCount、QueryPerformanceCounter和GetSystemTime中的一种或多种;
第二获取单元,其用于获取时间函数的头代码;
上传单元,其用于将获取的时间函数的头代码加密后上传至后台服务器;
比对单元,其用于后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对,若相同,则判断程序未被加速,若不同,则判断程序被加速。
本发明第四方面提供一种程序被加速检测系统,包括:
第一获取模块,其用于获取程序运行时所调用的Windows系统的时间函数,所述时间函数包括timeGetTime、GetTickCount、QueryPerformanceCounter和GetSystemTime中的一种或多种;
第二获取模块,其用于获取时间函数的头代码;
上传模块,其用于将获取的时间函数的头代码加密后上传至后台服务器;
比对模块,其用于后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对,若相同,则判断程序未被加速,若不同,则判断程序被加速。
与现有技术相比,本发明的优点在于:通过获取程序运行时所调用的Windows系统的时间函数,然后依次获取时间函数的头代码,将获取的时间函数的头代码上传至后台服务器,后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对,进而判断时间函数是否被hook,进一步判断程序是否被非法进行加速处理,实现对程序的精确判断,有效保证程序的稳定运行以及保障各方的合法利益。
附图说明
图1为本发明实施例中一种程序被加速检测方法的流程图;
图2为本发明实施例中一种电子设备=的结构示意图。
具体实施方式
本发明实施例提供了一种程序被加速检测方法,通过对程序运行时所需的时间函数是否被hook进行判断,从而判断程序是否被进行加速非法处理。本发明实施例还相应提供了存储介质、电子设备和程序被加速检测系统。
以下结合附本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
参见图1所示,本发明实施例提供的一种程序被加速检测方法的一实施例包括:
S1:获取程序运行时所调用的Windows系统的时间函数,所述时间函数包括timeGetTime、GetTickCount、QueryPerformanceCounter和GetSystemTime中的一种或多种。
本发明实施例中,时间函数用于程序查询当前系统时间以及程序运行时间。对于windoes系统,其提供了相应的API(Application Programming Interface,应用程序编程接口)函数以使程序来查询当前系统时间或者程序运行了多长时间。
程序运行时,调用时间函数timeGetTime、GetTickCount、QueryPerformanceCounter或GetSystemTime中的至少一个。即程序若想要获取当前系统时间或者程序自身已运行了多长时间,则必须调用上述时间函数中的一个或多个。程序若调用了上述时间函数用于时间相关的判断和处理,那么不法人员则可以通过hook这些函数,从而返回错误的时间值,导致程序开启了加速的功能,对于一个复杂的应用程序来说,其可能调用上述所有的系统时间函数,因此对于程序被加速的判断,需要对每一个时间函数进行检测其是否被hook。
S2:获取时间函数的头代码;
本发明实施例中,依次获取时间函数的头代码,具体步骤为:依次获取时间函数timeGetTime的头代码、时间函数GetTickCount的头代码、时间函数QueryPerformanceCounter的头代码和时间函数GetSystemTime的头代码。
S3:将获取的时间函数的头代码加密后上传至后台服务器;
S4:后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对,若相同,则判断程序未被加速,若不同,则判断程序被加速。后台服务器中存储的时间函数的头代码为时间函数的原始的头代码,若时间函数被hook,其头代码会发生改变,故基于此,通过比对的方式判断时间函数是否被hook,进而对程序是否被加速进行检测。当后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对时,基于程序运行时所调用的时间函数,后台服务器将自身存储的该时间函数的头代码,与接收的该时间函数的头代码进行比对。即程序运行调用了哪个时间函数,则在比对时使用该时间函数的原本的头代码进行比对。
可选地,在上述图1对应的实施例的基础上,本发明实施例提供的一种程序被加速检测方法的第一个可选实施例中,获取时间函数timeGetTime的头代码,具体步骤为:
S211:调用系统函数GetModuleHandle获取时间函数timeGetTime所在系统模块winmm.dll的句柄。GetModuleHandle是Windows系统的函数,功能是用于获取一个应用程序或动态链接库的模块句柄。
本发明实施例中,时间函数timeGetTime是系统提供的用于获取时间的函数,该函数的原型为DWORD timeGetTime(),时间函数无参数,其返回值是一个DWORD类型的数值,时间函数timeGetTime以毫秒为单位记录系统从启动开始所经过的时间,程序通过调用该函数并依据调用后的返回值来判断经过的时间,当程序被不法人士修改成加速状态,那么不法人士通过会使用内联hook的方式,内联hook会修改内存中时间函数timeGetTime的代码。winmm.dll,即Windows Multimedia API描述是Windows多媒体相关应用程序接口。
调用系统函数GetModuleHandle获取时间函数timeGetTime所在系统模块winmm.dll的句柄,其具体实现代码为:
HMODULE hModule=GetModuleHandle(“winmm.dll”)。
S212:调用系统函数GetProcAddress获取时间函数timeGetTime在系统模块winmm.dll中的内存地址;GetProcAddress是一个Windows系统函数,功能是用于检索指定的动态链接库(DLL)中的输出库函数地址。
系统函数GetProcAddress的原型为:
FARPROC GetProcAddress(
HMODULE hModule,//DLL模块句柄
LPCSTR lpProcName//函数名
);
其中的返回值便是时间函数timeGetTime在系统模块winmm.dll中的内存地址,运行以下代码:
DWORD address=GetProcAddress(hModule,“timeGetTime”);
最终得到时间函数timeGetTime的内存地址address。
S213:基于获取的内存地址,读取时间函数timeGetTime开头10个字节的代码,得到时间函数timeGetTime的头代码。
本发明实施例中,读取时间函数timeGetTime开头10个字节的代码,具体步骤为:
首先定义一个代码用于存储读取的代码,定义的代码为:
BYTE code[10]={0};
接着编写一个for循环来读取时间函数timeGetTime的内存代码:
For(int I=0;I<10;i++){
Code[i]=address[i];
}
最后将得到的时间函数timeGetTime开头10个字节的代码存储于code中。
可选地,在上述图1对应的实施例的基础上,本发明实施例提供的一种程序被加速检测方法的第二个可选实施例中,获取时间函数GetTickCount的头代码,具体步骤为:
S221:调用系统函数GetModuleHandle获取时间函数GetTickCount所在系统模块kernel32.dll的句柄。kernel32.dll是Windows系统中非常重要的32位动态链接库文件,属于内核级文件。
本发明实施例中,时间函数GetTickCount用于记录系统从启动开始到现在所经历的时间,单位为毫秒。时间函数GetTickCount的原型为:
DWORD GetTickCount()
该函数无参数,其返回值是一个DWORD类型的数值,程序通过调用该函数并依据返回值来判断程序所经过的时间。当程序被不法人士修改成加速状态,那么不法人士通过会使用内联hook的方式,内联hook会修改内存中时间函数GetTickCount的代码,因此可以通过获取该函数在内存中的起始地址,读取函数的头代码,进而判断函数是否被内联hook,进而判断函数是否被加速。
系统函数GetModuleHandle的原型为:
FARPROC GetProcAddress(
HMODULE hModule,//DLL模块句柄
LPCSTR lpProcName//函数名
);
其中返回值便是时间函数GetTickCount在系统模块kernel32.dll中的内存地址。
S222:调用系统函数GetProcAddress获取时间函数GetTickCount在系统模块kernel32.dll中的内存地址;该步骤的具体执行代码为:
DWORD address=GetProcAddress(hModule,“GetTickCount”);
最终得到时间函数GetTickCount的内存地址。
S223:基于获取的内存地址,读取时间函数GetTickCount开头10个字节的代码,得到时间函数GetTickCount的头代码。
本发明实施例中,读取时间函数GetTickCount开头10个字节的代码,具体步骤为:
首先定义一个代码用于存储读取的代码,定义的代码为:
BYTE code[10]={0};
接着编写一个for循环来读取时间函数GetTickCount的内存代码:
For(int I=0;I<10;i++){
Code[i]=address[i];
}
最后将得到的时间函数GetTickCount开头10个字节的代码存储于code中。
可选地,在上述图1对应的实施例的基础上,本发明实施例提供的一种程序被加速检测方法的第三个可选实施例中,获取时间函数QueryPerformanceCounter的头代码,具体步骤为:
S231:调用系统函数GetModuleHandle获取时间函数QueryPerformanceCounter所在系统模块kernel32.dll的句柄;
本发明实施例中,时间函数QueryPerformanceCounter是一个更为精确的时间函数。时间函数QueryPerformanceCounter的原型为:
BOOLQueryPerformanceCounter(LARGE_INTEGER*ipPerformanceCount);
其中,参数LARGE_INTEGER*ipProformanceCount为一个指针变量用于函数传值,即指向现时计数器的值。
程序通过调用该函数并依据返回值来判断程序所经过的时间。当程序被不法人士修改成加速状态,那么不法人士通过会使用内联hook的方式,内联hook会修改内存中时间函数QueryPerformanceCounter的代码,因此可以通过获取该函数在内存中的起始地址,读取函数的头代码,进而判断函数是否被内联hook,进而判断函数是否被加速。
获取时间函数QueryPerformanceCounter在系统模块kernel32.dll中的句柄的执行代码为:HMODULE hModule=GetModuleHandle(“kernel32.dll”)。
S232:调用系统函数GetProcAddress获取时间函数QueryPerformanceCounter在系统模块kernel32.dll中的内存地址;
系统函数GetModuleHandle的原型为:
FARPROC GetProcAddress(
HMODULE hModule,//DLL模块句柄
LPCSTR lpProcName//函数名
);
其中返回值便是时间函数QueryPerformanceCounter在系统模块kernel32.dll中的内存地址。
S233:基于获取的内存地址,读取时间函数QueryPerformanceCounter开头10个字节的代码,得到时间函数QueryPerformanceCounter的头代码。
本发明实施例中,读取时间函数QueryPerformanceCounter开头10个字节的代码,具体步骤为:
首先定义一个代码用于存储读取的代码,定义的代码为:
BYTE code[10]={0};
接着编写一个for循环来读取时间函数QueryPerformanceCounter的内存代码:
For(int I=0;I<10;i++){
Code[i]=address[i];
}
最后将得到的时间函数QueryPerformanceCounter开头10个字节的代码存储于code中。
可选地,在上述图1对应的实施例的基础上,本发明实施例提供的一种程序被加速检测方法的第四个可选实施例中,获取时间函数GetSystemTime的头代码,具体步骤为:
S241:调用系统函数GetModuleHandle获取时间函数GetSystemTime所在系统模块kernel32.dll的句柄。
本发明实施例中,时间函数GetSystemTime的返回值是一个UTC(协调世界时)的时间,时间采用的是协同世界时间格式,时间函数GetSystemTime的原型为:
Void GetSystemTime(LPSYSTEMTIME lpSystemTime);
其中参数LPSYSTEMTIME lpSystemTime为一个指针变量用于函数传值,即指向获取到的值。
程序通过调用该函数并依据返回值来判断程序所经过的时间。当程序被不法人士修改成加速状态,那么不法人士通过会使用内联hook的方式,内联hook会修改内存中时间函数GetSystemTime的代码。
获取时间函数GetSystemTime在系统模块kernel32.dll中的句柄的执行代码为:HMODULE hModule=GetModuleHandle(“kernel32.dll”)。
S242:调用系统函数GetProcAddress获取时间函数GetSystemTime在系统模块kernel32.dll中的内存地址;
系统函数GetModuleHandle的原型为:
FARPROC GetProcAddress(
HMODULE hModule,//DLL模块句柄
LPCSTR lpProcName//函数名
);
其中返回值便是时间函数GetSystemTime在系统模块kernel32.dll中的内存地址。
S243:基于获取的内存地址,读取时间函数GetSystemTime开头10个字节的代码,得到时间函数GetSystemTime的头代码。
本发明实施例中,读取时间函数GetSystemTime开头10个字节的代码,具体步骤为:
首先定义一个代码用于存储读取的代码,定义的代码为:
BYTE code[10]={0};
接着编写一个for循环来读取时间函数GetSystemTime的内存代码:
For(int I=0;I<10;i++){
Code[i]=address[i];
}
最后将得到的时间函数GetSystemTime开头10个字节的代码存储于code中。
可选地,在上述图1对应的实施例的基础上,本发明实施例提供的一种程序被加速检测方法的第五个可选实施例中,获取的时间函数的头代码加密后上传至后台服务器,后台服务器接收到时间函数的头代码后,先进行解密,再将解密后的时间函数的头代码与自身存储的原始时间函数的头代码进行比对,有效保证数据的传输安全。具体的,将获取的时间函数的头代码加密后上传至后台服务器,具体步骤为:
S301:加载组件ntdll.dll,所述组件ntdll.dll中存储有用于获取Windows系统版本号的系统API函数。
本发明实施例中,程序可能会运行于不同版本的Windows系统上,而不同Windows系统版本中对应的系统时间函数的头代码可能是不同的,需要针对所有版本的系统进行是否加速的检查。同时为保证数据传输至后台服务器的安全性,基于系统版本来对数据进行加密,从而使得不同系统版本下的加密结果是不同的,有效保证数据的安全性。
组件ntdll.dll是重要的Windows NT内核级文件。描述了windows本地NTAPI的接口。当Windows启动时,ntdll.dll就驻留在内存中特定的写保护区域,使别的程序无法占用这个内存区域。加载组件ntdll.dll的具体执行代码为:
HMODULE hm=LoadLibrary(L"ntdll.dll")。
S302:通过系统函数GetProcAddress获取组件ntdll.dll的接口RtlGetNtVersionNumbers,基于接口RtlGetNtVersionNumbers获取用于获取Windows系统版本号的系统API函数的内存地址,得到用于获取Windows系统版本号的系统API函数。GetProcAddress是一个计算机函数,功能是检索指定的动态链接库(DLL)中的输出库函数地址。接口RtlGetNtVersionNumbers用于获取操作系统版本号。
获取用于获取Windows系统版本号的系统API函数的内存地址,具体执行代码为:
func=GetProcAddress(hm,"RtlGetNtVersionNumbers");
其中hm则是之前的ntdll模块,RtlGetNtVersionNumbers是接口的名称,返回值func则得到对应的接口内存地址。
S303:通过用于获取Windows系统版本号的系统API函数,获得Windows系统的版本号。定义系统版本号的变量并初始化为0。
DWORD dwMajorVersion=0;
DWORD dwMinorVersion=0;
DWORD dwBuildNumber=0;
func(&dwMajorVersion,&dwMinorVersion,&dwBuildNumber);
调用完成此函数,将系统版本号存储在dwMajorVersion和dwMinorVersion中。
S304:结合当前系统时间,使用Md5算法对获得的版本号计算HASH值,将计算得到的HASH值作为密钥。
即首先定义一个变量time表示当前系统时间,对密钥的计算加入时间从而密钥总在发生变化。定义变量time的代码为:uint64_t time=Time()。
使用Md5算法对获得的版本号计算HASH值:
KEY=Md5.Create(dwMajorVersion+dwMinorVersion+time);
其中,Md5.Create表示Md5算法接口,dwMajorVersion和dwMinorVersion代表系统版本号,time代表当前系统时间,KEY代表密钥。
S305:使用加密算法TEA,同时结合计算得到的秘钥对获取的时间函数的头代码进行加密,然后加加密后的头代码上传至后台服务器。使用加密算法TEA,同时结合计算得到的秘钥对获取的时间函数的头代码进行加密,过程为:
encryptCode=Tea.Encrypt(Code,KEY)
其中,Tea.Encrypt为加密算法TEA的加密接口,加密算法TEA为一种分组密码算法。Code是获取的时间函数的头代码。encryptCode是加密后的头代码。最终上传给后台服务器的数据会携带上报加密时使用的time,操作系统版本号dwMajorVersion和dwMinorVersion。
服务器收到数据后,则从上报数据中取出time,以及操作系统版本号dwMajorVersion和dwMinorVersion,然后采用同样的算法来计算得到密钥KEY。后台服务器则使用TEA来对数据进行解密:
Code=Tea.Decrypt(encryptCode,KEY);
服务器若想验证客户端上报的代码是否正确,则需要收集每个操作系统版本对应的所有系统时间函数具体代码,然后基于上报到后台服务器的系统版本,来对比同样操作系统版本的代码,从而保证验证的准确无误。
本发明实施例的程序被加速检测方法,通过获取程序运行时所调用的Windows系统的时间函数,然后依次获取时间函数的头代码,将获取的时间函数的头代码上传至后台服务器,后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对,进而判断时间函数是否被hook,进一步判断程序是否被非法进行加速处理,实现对程序的精确判断,有效保证程序的稳定运行以及保障各方的合法利益。
本发明实施例提供的一种存储介质的一实施例包括:该存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:
获取程序运行时所调用的Windows系统的时间函数,所述时间函数包括timeGetTime、GetTickCount、QueryPerformanceCounter和GetSystemTime中的一种或多种;
获取时间函数的头代码;
将获取的时间函数的头代码加密后上传至后台服务器;
后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对,若相同,则判断程序未被加速,若不同,则判断程序被加速。
可选地,在上述存储介质实施例的基础上,本发明实施例提供的一种存储介质的第一个可选实施例中,存储介质可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是但不限于:电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本文件中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
可选地,在上述存储介质的实施例及第一个可选实施例的基础上,本发明实施例提供的一种存储介质的第二个可选实施例中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、RF等等,或者上述的任意合适的组合。
可选地,在上述存储介质的实施例及第一、第二个可选实施例的基础上,本发明实施例提供的一种存储介质的第三个可选实施例中,可以以一种或多种程序设计语言或其组合来编写用于执行本发明操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言,诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络,包括局域网(LAN)或广域网(WAN),连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
参见图2所示,本发明实施例提供的一种电子设备的一实施例包括:
第一获取单元,其用于获取程序运行时所调用的Windows系统的时间函数,所述时间函数包括timeGetTime、GetTickCount、QueryPerformanceCounter和GetSystemTime中的一种或多种;
第二获取单元,其用于获取时间函数的头代码;
上传单元,其用于将获取的时间函数的头代码加密后上传至后台服务器;
比对单元,其用于后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对,若相同,则判断程序未被加速,若不同,则判断程序被加速。
本发明实施例提供的一种程序被加速检测系统的一实施例包括:
第一获取模块,其用于获取程序运行时所调用的Windows系统的时间函数,所述时间函数包括timeGetTime、GetTickCount、QueryPerformanceCounter和GetSystemTime中的一种或多种;
第二获取模块,其用于获取时间函数的头代码;
上传模块,其用于将获取的时间函数的头代码加密后上传至后台服务器;
比对模块,其用于后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对,若相同,则判断程序未被加速,若不同,则判断程序被加速。
可选地,在上述一种程序被加速检测系统对应的实施例的基础上,本发明实施例提供的一种程序被加速检测系统的第一个可选实施例中,获取时间函数timeGetTime的头代码,具体步骤为:
S211:调用系统函数GetModuleHandle获取时间函数timeGetTime所在系统模块winmm.dll的句柄。GetModuleHandle是Windows系统的函数,功能是用于获取一个应用程序或动态链接库的模块句柄。
本发明实施例中,时间函数timeGetTime是系统提供的用于获取时间的函数,该函数的原型为DWORD timeGetTime(),时间函数无参数,其返回值是一个DWORD类型的数值,时间函数timeGetTime以毫秒为单位记录系统从启动开始所经过的时间,程序通过调用该函数并依据调用后的返回值来判断经过的时间,当程序被不法人士修改成加速状态,那么不法人士通过会使用内联hook的方式,内联hook会修改内存中时间函数timeGetTime的代码。winmm.dll,即Windows Multimedia API描述是Windows多媒体相关应用程序接口。
调用系统函数GetModuleHandle获取时间函数timeGetTime所在系统模块winmm.dll的句柄,其具体实现代码为:
HMODULE hModule=GetModuleHandle(“winmm.dll”)。
S212:调用系统函数GetProcAddress获取时间函数timeGetTime在系统模块winmm.dll中的内存地址;GetProcAddress是一个Windows系统函数,功能是用于检索指定的动态链接库(DLL)中的输出库函数地址。
系统函数GetProcAddress的原型为:
FARPROC GetProcAddress(
HMODULE hModule,//DLL模块句柄
LPCSTR lpProcName//函数名
);
其中的返回值便是时间函数timeGetTime在系统模块winmm.dll中的内存地址,运行以下代码:
DWORD address=GetProcAddress(hModule,“timeGetTime”);
最终得到时间函数timeGetTime的内存地址address。
S213:基于获取的内存地址,读取时间函数timeGetTime开头10个字节的代码,得到时间函数timeGetTime的头代码。
本发明实施例中,读取时间函数timeGetTime开头10个字节的代码,具体步骤为:
首先定义一个代码用于存储读取的代码,定义的代码为:
BYTE code[10]={0};
接着编写一个for循环来读取时间函数timeGetTime的内存代码:
For(int I=0;I<10;i++){
Code[i]=address[i];
}
最后将得到的时间函数timeGetTime开头10个字节的代码存储于code中。
本发明实施例的程序被加速检测系统,通过获取程序运行时所调用的Windows系统的时间函数,然后依次获取时间函数的头代码,将获取的时间函数的头代码上传至后台服务器,后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对,进而判断时间函数是否被hook,进一步判断程序是否被非法进行加速处理,实现对程序的精确判断,有效保证程序的稳定运行以及保障各方的合法利益。
本发明不局限于上述实施方式,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围之内。本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。
Claims (10)
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的头代码。
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中的一种或多种;
第二获取模块,其用于获取时间函数的头代码;
上传模块,其用于将获取的时间函数的头代码加密后上传至后台服务器;
比对模块,其用于后台服务器将接收时间函数的头代码与自身存储的原始时间函数的头代码进行比对,若相同,则判断程序未被加速,若不同,则判断程序被加速。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811280542.3A CN111124869A (zh) | 2018-10-30 | 2018-10-30 | 程序被加速检测方法、存储介质、设备及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811280542.3A CN111124869A (zh) | 2018-10-30 | 2018-10-30 | 程序被加速检测方法、存储介质、设备及系统 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN111124869A true CN111124869A (zh) | 2020-05-08 |
Family
ID=70484754
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811280542.3A Pending CN111124869A (zh) | 2018-10-30 | 2018-10-30 | 程序被加速检测方法、存储介质、设备及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111124869A (zh) |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR101421633B1 (ko) * | 2013-04-02 | 2014-07-23 | 주식회사 잉카인터넷 | 스피드 핵 검출 시스템 및 방법 |
CN106230644A (zh) * | 2016-08-31 | 2016-12-14 | 北京像素软件科技股份有限公司 | 一种客户端加速的检测方法 |
CN107247611A (zh) * | 2017-07-06 | 2017-10-13 | 广州威道网络科技有限公司 | 一种网页游戏的加速方法和系统 |
CN108259171A (zh) * | 2018-01-12 | 2018-07-06 | 武汉斗鱼网络科技有限公司 | Shader文件的保护方法及装置 |
-
2018
- 2018-10-30 CN CN201811280542.3A patent/CN111124869A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR101421633B1 (ko) * | 2013-04-02 | 2014-07-23 | 주식회사 잉카인터넷 | 스피드 핵 검출 시스템 및 방법 |
CN106230644A (zh) * | 2016-08-31 | 2016-12-14 | 北京像素软件科技股份有限公司 | 一种客户端加速的检测方法 |
CN107247611A (zh) * | 2017-07-06 | 2017-10-13 | 广州威道网络科技有限公司 | 一种网页游戏的加速方法和系统 |
CN108259171A (zh) * | 2018-01-12 | 2018-07-06 | 武汉斗鱼网络科技有限公司 | Shader文件的保护方法及装置 |
Non-Patent Citations (2)
Title |
---|
H-KING: "VC6.0蕉HOOK_timeGetTime 达到变速效果", 《HTTPS://BLOG.CSDN.NET/LIUJIAYU2/ARTICLE/DETAILS/51780651》 * |
王晓松等: "《Windows内核实现的34个关键问题》", 华中科技大学出版社 * |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7237123B2 (en) | Systems and methods for preventing unauthorized use of digital content | |
CN109992987B (zh) | 基于Nginx的脚本文件保护方法、装置及终端设备 | |
CN111163095B (zh) | 网络攻击分析方法、网络攻击分析装置、计算设备和介质 | |
CN108848058A (zh) | 智能合约处理方法及区块链系统 | |
EP3270318B1 (en) | Dynamic security module terminal device and method for operating same | |
CN108431819B (zh) | 保护客户端访问视频播放器的drm代理的服务的方法和系统 | |
CN112231702B (zh) | 应用保护方法、装置、设备及介质 | |
CN111460516B (zh) | 基于非侵入式的数据保护方法、装置、终端及存储介质 | |
CN111176685A (zh) | 一种升级方法及装置 | |
CN112580114B (zh) | 一种信息处理方法、装置、设备及存储介质 | |
WO2024027301A1 (zh) | 一种汽车诊断软件的加密方法 | |
CN113127844A (zh) | 一种变量访问方法、装置、系统、设备和介质 | |
CN115828228B (zh) | 一种验证内存马检测能力的方法、装置及电子设备 | |
CN111143879A (zh) | 一种Android平台SD卡文件保护方法、终端设备及存储介质 | |
CN111124869A (zh) | 程序被加速检测方法、存储介质、设备及系统 | |
CN113987471A (zh) | 可执行文件执行方法、装置、电子设备和计算机可读介质 | |
CN111292082B (zh) | 一种块链式账本中的公钥管理方法、装置及设备 | |
CN114428953A (zh) | 一种windows软件的防注入方法及系统 | |
JP4607023B2 (ja) | ログ収集システム及びログ収集方法 | |
CN108304729B (zh) | 一种客户端上报日志的方法以及电子设备 | |
CN109388918B (zh) | 一种资源包加密方法、装置、计算机设备及存储介质 | |
CN108769037B (zh) | 一种数据处理的方法、装置、计算机存储介质及终端 | |
CN108111501B (zh) | 作弊流量的控制方法、装置和计算机设备 | |
CN112016336A (zh) | 检测复制卡的方法、装置、设备及存储介质 | |
CN115859337B (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 | ||
RJ01 | Rejection of invention patent application after publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20200508 |