CN112445683A - 一种多开检测绕过方法、存储介质、设备及系统 - Google Patents

一种多开检测绕过方法、存储介质、设备及系统 Download PDF

Info

Publication number
CN112445683A
CN112445683A CN201910797324.5A CN201910797324A CN112445683A CN 112445683 A CN112445683 A CN 112445683A CN 201910797324 A CN201910797324 A CN 201910797324A CN 112445683 A CN112445683 A CN 112445683A
Authority
CN
China
Prior art keywords
function
getlasterror
error
fake
getlasterror 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
Application number
CN201910797324.5A
Other languages
English (en)
Inventor
周志刚
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Wuhan Ouyuan Network Video Co ltd
Original Assignee
Wuhan Ouyuan Network Video Co ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Wuhan Ouyuan Network Video Co ltd filed Critical Wuhan Ouyuan Network Video Co ltd
Priority to CN201910797324.5A priority Critical patent/CN112445683A/zh
Publication of CN112445683A publication Critical patent/CN112445683A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/32Monitoring with visual or acoustical indication of the functioning of the machine
    • G06F11/323Visualisation of programs or trace data

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Data Mining & Analysis (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明公开了一种多开检测绕过方法、存储介质、设备及系统,涉及Windows平台应用程序领域,该方法包括编写fake_GetLastError函数,用以生成返回值ERROR_ALREADY_EXISTS,同时自定义hook模块,以便将系统GetLastError函数替换为fake_GetLastError函数;将编写的fake_GetLastError函数以及自定义的hook模块,编写成组件模块,并将所述组件模块注入至应用程序中;当应用程序启动并进行多开检测时,调用fake_GetLastError函数,同时基于系统GetLastError函数的内存地址,获取系统GetLastError函数;对系统GetLastError函数的返回值进行判断,若返回值为ERROR_SUCCESS,则不做处理,若返回值为ERROR_ALREADY_EXISTS进行替换。本发明能够有效实现应用程序多开。

Description

一种多开检测绕过方法、存储介质、设备及系统
技术领域
本发明涉及Windows平台应用程序领域,具体涉及一种多开检测绕过方法、存储介质、设备及系统。
背景技术
应用程序多开是指在同一终端设备中,同时运行多个相同的应用程序,但是对于运行于Windows平台上的应用程序而言,其一般内置有多开检测机制,当应用程序启动时便会进行多开检测,若检测到当前设备上已经成功运行了与自身相同的应用程序,则终结自身的运行。
但是,对于应用程序开发人员而言,出于非商业目的,有时需要对其它公司的应用程序进行研究测试,以便于使自己开发的应用程序更好的与其它应用程序进行兼容适配,基于测试的需要,通常会同时运行多个相同的应用程序,但是由于应用程序上多开检测机制的存在,无法在一个终端设备上同时运行多个相同的应用程序,只能采购多个终端设备,在每个终端设备上进行单个应用程序的运行,极大地增加了开发成本。
发明内容
针对现有技术中存在的缺陷,本发明的目的在于提供一种多开检测绕过方法、存储介质、设备及系统,能够有效实现应用程序多开。
为达到以上目的,本发明一种多开检测绕过方法,包括以下步骤:
编写fake_GetLastError函数,用以生成返回值ERROR_ALREADY_EXISTS,同时自定义hook模块,以便将系统GetLastError函数替换为fake_GetLastError函数;
将编写的fake_GetLastError函数以及自定义的hook模块,编写成组件模块,并将所述组件模块注入至应用程序中;
当应用程序启动并进行多开检测时,调用fake_GetLastError函数,同时基于系统GetLastError函数的内存地址,获取系统GetLastError函数;
对系统GetLastError函数的返回值进行判断,若返回值为ERROR_SUCCESS,则不做处理,若返回值为ERROR_ALREADY_EXISTS,则基于编写的hook模块,将系统GetLastError函数替换为fake_GetLastError函数,将返回值修改成fake_GetLastError函数的返回值ERROR_ALREADY_EXISTS,所述ERROR_ALREADY_EXISTS表示重名类型的错误码,所述ERROR_SUCCESS表示无任何错误码。
在上述技术方案的基础上,所述基于系统GetLastError函数的内存地址,获取系统GetLastError函数,具体过程为:
获取系统GetLastError函数所在模块的起始地址;
基于所获取的起始地址,通过GetProcAddress函数获取系统GetLastError函数的内存地址,得到系统GetLastError函数。
在上述技术方案的基础上,所述基于编写的hook模块,将系统GetLastError函数替换为fake_GetLastError函数,具体过程为:基于编写的hook模块,调用API函数DetourUpdateThread更改系统GetLastError函数的线程,从而调用fake_GetLastError函数,将系统GetLastError函数替换为fake_GetLastError函数。
在上述技术方案的基础上,将编写的fake_GetLastError函数以及自定义的hook模块,编写成组件模块,并将所述组件模块注入至应用程序中之前,还包括:使用系统函数CreateProcess创建目标进程,使用创建的目标进程打开应用程序,所述目标进程用于暂停应用程序的启动。
在上述技术方案的基础上,所述系统函数CreateProcess创建目标进程,其中,系统函数CreateProcess具体为:
CreateProcess(NULL,tzFilePathName,NULL,NULL,TRUE,CREATE_SUSPENDED|CREATE_DEFAULT_ERROR_MODE,NULL,tzFileFolder,&si,&pi)
其中,参数CreateProcess为系统函数,参数tzFilePathName表示待创建的目标进程的名称,参数NULL表示空,参数TRUE表示真,参数CREATE_SUSPENDED|CREATE_DEFAULT_ERROR_MODE表示进程创建后不运行,参数tzFileFolder表示文件夹,参数&si和&pi为系统函数CreateProcess中的特定参数。
在上述技术方案的基础上,所述当应用程序启动并进行多开检测时,调用fake_GetLastError函数,具体步骤为:
定义一个线程环境变量,并对所述线程环境变量的获取数据类型进行定义,以使线程环境变量获取系统函数CreateProcess创建的目标进程;
待线程环境变量获取系统函数CreateProcess创建的目标进程后,在目标进程中创建一个可执行的内存空间;
加载所述组件模块至创建的内存空间中,并将目标进程当前执行的地址更改为组件模块的地址;
应用程序启动运行,fake_GetLastError函数被调用。
本发明提供一种存储介质,该存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:
编写fake_GetLastError函数,用以生成返回值ERROR_ALREADY_EXISTS,同时自定义hook模块,以便将系统GetLastError函数替换为fake_GetLastError函数;
将编写的fake_GetLastError函数以及自定义的hook模块,编写成组件模块,并将所述组件模块注入至应用程序中;
当应用程序启动并进行多开检测时,调用fake_GetLastError函数,同时基于系统GetLastError函数的内存地址,获取系统GetLastError函数;
对系统GetLastError函数的返回值进行判断,若返回值为ERROR_SUCCESS,则不做处理,若返回值为ERROR_ALREADY_EXISTS,则基于编写的hook模块,将系统GetLastError函数替换为fake_GetLastError函数,将返回值修改成fake_GetLastError函数的返回值ERROR_ALREADY_EXISTS,所述ERROR_ALREADY_EXISTS表示重名类型的错误码,所述ERROR_SUCCESS表示无任何错误码。
本发明提供一种电子设备,所述电子设备包括:
编写单元,其用于编写fake_GetLastError函数,用以生成返回值ERROR_ALREADY_EXISTS,同时自定义hook模块,以便将系统GetLastError函数替换为fake_GetLastError函数;
注入单元,其用于将编写的fake_GetLastError函数以及自定义的hook模块,编写成组件模块,并将所述组件模块注入至应用程序中;
调用单元,其用于当应用程序启动并进行多开检测时,调用fake_GetLastError函数,同时基于系统GetLastError函数的内存地址,获取系统GetLastError函数;
判断单元,其用于对系统GetLastError函数的返回值进行判断,若返回值为ERROR_SUCCESS,则不做处理,若返回值为ERROR_ALREADY_EXISTS,则基于编写的hook模块,将系统GetLastError函数替换为fake_GetLastError函数,将返回值修改成fake_GetLastError函数的返回值ERROR_ALREADY_EXISTS,所述ERROR_ALREADY_EXISTS表示重名类型的错误码,所述ERROR_SUCCESS表示无任何错误码。
本发明提供一种多开检测绕过系统,包括:
编写模块,其用于编写fake_GetLastError函数,用以生成返回值ERROR_ALREADY_EXISTS,同时自定义hook模块,以便将系统GetLastError函数替换为fake_GetLastError函数;
注入模块,其用于将编写的fake_GetLastError函数以及自定义的hook模块,编写成组件模块,并将所述组件模块注入至应用程序中;
调用模块,其用于当应用程序启动并进行多开检测时,调用fake_GetLastError函数,同时基于系统GetLastError函数的内存地址,获取系统GetLastError函数;
判断模块,其用于对系统GetLastError函数的返回值进行判断,若返回值为ERROR_SUCCESS,则不做处理,若返回值为ERROR_ALREADY_EXISTS,则基于编写的hook模块,将系统GetLastError函数替换为fake_GetLastError函数,将返回值修改成fake_GetLastError函数的返回值ERROR_ALREADY_EXISTS,所述ERROR_ALREADY_EXISTS表示重名类型的错误码,所述ERROR_SUCCESS表示无任何错误码。
在上述技术方案的基础上,所述基于系统GetLastError函数的内存地址,获取系统GetLastError函数,具体过程为:
获取系统GetLastError函数所在模块的起始地址;
基于所获取的起始地址,通过GetProcAddress函数获取系统GetLastError函数的内存地址,得到系统GetLastError函数。
与现有技术相比,本发明的优点在于:通过fake_GetLastError函数,同时编写hook模块,当应用程序启动,对系统GetLastError函数的返回值进行判断,若返回值为ERROR_ALREADY_EXISTS,则基于编写的hook模块,将系统GetLastError函数替换为fake_GetLastError函数,将返回值修改成fake_GetLastError函数的返回值ERROR_ALREADY_EXISTS,即返回值为无任何错误码,从而无论当前是否已有相同的应用程序运行,正在启动的应用程序均能继续运行,实现应用程序的多开,使得在同一终端设备上能够同时运行多个相同的应用程序,方便开发人员出于测试需求的应用程序多开,有效降低应用程序的开发成本。
附图说明
图1为本发明实施例中一种多开检测绕过方法的流程图;
图2为本发明实施例中一种电子设备的结构示意图。
具体实施方式
本发明实施例提供一种多开检测绕过方法,在应用程序启动进行多开检测时,自动绕过多开检测,实现在一终端设备上同时运行多个相同应用程序。本发明实施例还相应的提供了存储介质、电子设备和多开检测绕过系统。
参见图1所示,本发明实施例提供的一种多开检测绕过方法,包括以下步骤:
S1:编写fake_GetLastError函数和hook模块。
本发明实施例中,系统指Windows操作系统,GetLastError函数是Windows操作系统中用于返回调用线程最近的错误代码值的函数,错误代码以单线程为基础来维护的,多线程不重写各自的错误代码值。
GetLastError函数为应用程序中的检测函数,当应用程序启动时,基于当前应用程序是否存在多开情况,GetLastError函数会返回对应的返回值,根据GetLastError函数的返回值即可判断得知当前是否已有想用的应用程序启动运行,若返回值为ERROR_ALREADY_EXISTS,则表明当前已有相同的应用程序运行,若返回值为ERROR_SUCCESS时,则表明当前没有相同的应用程序运行。fake_GetLastError函数相当于GetLastError函数的伪造函数,无论当前是否有相同的应用程序已启动,fake_GetLastError函数的返回值始终为ERROR_SUCCESS,即无任何错误码,fake_GetLastError函数所起到的作用是,当系统GetLastError函数的返回值为ERROR_ALREADY_EXISTS时,对系统GetLastError函数进行调用替换,进行fake_GetLastError函数的调用,因为fake_GetLastError函数被调用时,返回值始终为无任何错误码,即表明当前没有相同应用程序已经运行,以此来实现应用程序的多开。
对于fake_GetLastError函数,其编写过程为:采用无符号整数DWORD进行代码编写,其实现代码为DWORD fake_GetLastError(),进而实现fake_GetLastError函数的编写。
本发明实施例中,对于自定义的hook模块,通过编写相应代码来实现所定义的hook模块的功能,相应代码为:
DetourAttach(dwAddress,fake_GetLastError);
DetourTransactionCommit();
其中,参数DetourAttach表示捕获系统API,参数dwAddress为系统GetLastError函数的内存地址,参数fake_GetLastError表示伪造的GetLastError函数,DetourTransactionCommit用于Windows系统下实现函数钩子,进行系统API函数的抓取和替换,hook模块的功能便是将系统GetLastError函数替换为fake_GetLastError函数,通过上述代码即可实现该过程。
对于Windows操作系统平台上的应用程序而言,其在进行多开检测时,常用的做法是,通过命名的内核句柄,然后判断当前句柄是否存在,如果存在则说明当前已经有相同的应用程序创建,否则说明当前没有相同的应用程序创建。Windows操作系统中,内核对象的名称是唯一的,若在有一个内核对象的情况下,再次创建一个同名的内核对象,则会出错,因此,现有技术的多开检测通常是利用这个原理来达到一次只运行一个进程的目的。即创建一个互斥体,并检查它是否已经有拥有者,如果有,则表明互斥体已经建立(应用程序已经启动),否则表明应用程序未启动。具体的实现过程为:
(1)使用CreateMutex函数创建一个互斥体,所创建的互斥体中,第一个参数可以设置为NULL(空),第二个参数必须设置为false(错误,常用于逻辑判断),第三个参数表示互斥体的名称,互斥体的名称优选的使用特殊标识,以防止与其它应用程序冲突,例如采用应用程序+时间的命名方式;
(2)使用GetLastError()函数判断错误信息是否为ERROR_ALREADY_EXISTS,如果是,则表示程序已经启动,ERROR_ALREADY_EXISTS为GetLastError函数调用后的返回值,表示无任何错误码,当返回值为ERROR_SUCCESS时,则表明当前没有相同的应用程序已经运行。本步骤判断过程的执行代码为:
HANDLE hMutex=CreateMutex(NULL,FALSE,_T);
if(GetLastError()==ERROR_ALREADY_EXISTS){
其中,参数HANDLE hMutex为代码句柄,参数CreateMutex为CreateMutex函数,NULL为创建的互斥体的第一个参数,FALSE为创建的互斥体的第二个参数,参数_T为互斥体的名称,参数GetLastError()表示返回值,参数ERROR_ALREADY_EXISTS为具体的返回值内容。
如果查询到当前系统的错误码是ERROR_ALREADY_EXISTS则表明当前存在内核对象,说明当前已有相同的应用程序运行。
或者,使用CreateEvent函数创建一个互斥事件,创建过程与上述类似,在创建的过程中同样也会传入一个事件的名称,最后同样的对错误信息进行判断,如果查询到当前系统的错误码是ERROR_ALREADY_EXISTS则表明当前存在内核对象,即说明当前已有相同的应用程序运行。
本发明实施例中,针对现有技术中应用程序的多开检测机制,不管是使用哪种类型的内核对象检测,其都会创建一个命名的内核对象,然后当再次创建时,会判断当前创建的内核对象是否已经存在,如果存在则说明已经有一个同样的应用程序打开,那么则检测到了应用程序多开。那么不管是创建何种的内核对象,即不管是使用CreateMutex函数创建,还是使用CreateEvent函数创建,都存在最终通过获取系统错误类型的返回值来判断当前是否已经存在相同的应用程序,基于以上特性,通过伪造一GetLastError函数,即fake_GetLastError函数,当系统GetLastError函数的返回值为ERROR_ALREADY_EXISTS,对系统GetLastError函数进行调用替换,因为fake_GetLastError函数被调用时,返回值始终为无任何错误码,即表明当前没有相同应用程序已经运行,以此来实现多开的目的。
本发明步骤中,通过虚拟GetLastError函数,来对系统GetLastError函数进行替换,保证返回值值始终为无任何错误码,因为现有技术中,应用程序关于多开的检测,是基于系统GetLastError函数调用后的返回值进行判断,若错误码为重名类型的错误码,则表明当前已相同应用程序已经运行,若返回值始终为无任何错误码,则表明当前没有相同应用程序已经运行,故通过伪造一GetLastError函数,对系统GetLastError函数进行调用替换,fake_GetLastError函数被调用时,返回值始终为无任何错误码,以此来通过应用程序多开的检测,达到应用程序多开的目的。
正常情况下,应用程序在启动时会自动调用系统GetLastError函数系统GetLastError函数根据当前是否已经有同一应用程序运行,来相应的返回返回值,若已经有同一应用程序运行,则会终止当前启动的应用程序,便无法实现多开,基于此种情况考虑,编写hook模块用于对系统GetLastError函数进行hook,系统GetLastError函数的返回值为ERROR_ALREADY_EXISTS时,则基于编写的hook模块,将系统GetLastError函数替换为fake_GetLastError函数,因为fake_GetLastError函数始终返回的返回值是无任何错误码,即运行当前应用程序的继续运行。
本发明步骤中,在已有同一应用程序已经运行的情况下,为保证当前启动的应用程序能够继续运行,编写hook模块用于对系统GetLastError函数进行hook,当系统GetLastError函数的返回值为ERROR_ALREADY_EXISTS时,则基于编写的hook模块,将系统GetLastError函数替换为fake_GetLastError函数,因为fake_GetLastError函数始终返回的返回值是无任何错误码,即不管当前是否已经有相同的应用程序运行,正在启动的应用程序不会被终止,进而实现应用程序的多开,通过hook的方式,相当于对检测函数进行修改,保证返回值始终为无任何错误码,避免因返回值错误而终止当前应用程序的运行。
S2:将编写的GetLastError函数和hook模块,编写成组件模块,并将所述组件模块注入至应用程序中。
本发明步骤中,因为应用程序在一开始启动,便会进行多开检测,若编写的hook模块执行未及时执行,则系统GetLastError函数会被直接调用,从而返回真实的返回值,若当前已有相同的应用程序运行,则无法实现应用程序多开,故编写的hook模块需要及时执行,从而当系统GetLastError函数的返回值为ERROR_ALREADY_EXISTS时,则基于编写的hook模块,将系统GetLastError函数替换为fake_GetLastError函数,保证返回值始终为无任何错误码。故将fake_GetLastError函数和编写的hook模块,编写成组件模块,组件模块的命名可以为hack.dll,直接将组件模块注入到应用程序中,保证应用程序启动时,编写的hook模块能够及时运行,有效保证应用程序多开实现的稳定性,同时,将本发明为实现应用程序多开所采用的技术方案编写成组件模块形式,对于所要实现多开的应用程序,直接注入组件模块即可,使本发明实施例的多开检测绕过方法实用性更为广泛。
S3:当应用程序启动并进行多开检测时,调用fake_GetLastError函数,同时基于系统GetLastError函数的内存地址,获取系统GetLastError函数;
基于系统GetLastError函数的内存地址,获取系统GetLastError函数,具体过程为:
S201:获取系统GetLastError函数所在模块的起始地址,执行代码为:
HANDLE handle=GetModuleHandle(“Kernel32.dll”)
其中,HANDLE handle为代码句柄,参数GetModuleHandle是计算机函数中,用于获取用程序或动态链接库的模块句柄,参数Kernel32.dll为系统GetLastError函数所在的动态链接库。
本发明步骤中,由于是需要对系统GetLastError函数进行hook,进而执行所伪造的GetLastError函数,所以首先需要得到系统GetLastError函数,才能进行替换,故以函数方式快速获得系统GetLastError函数所在模块的起始地址,方便后续对系统GetLastError函数的获取。
S202:基于所获取的起始地址,通过GetProcAddress函数获取系统GetLastError函数的内存地址,得到系统GetLastError函数;GetProcAddress函数的原型为:
FARPROC GetProcAddress(//函数定义
HMODULE hModule,//DLL模块句柄
LPCSTR lpProcName//函数名
);
DWORD dwAddress=GetProcAddress(handle,“GetLastError”)//表示获取系统GetLastError函数的内存地址;
本发明步骤中,在进行系统GetLastError函数的获取过程中,通过执行GetProcAddress函数,快速获取系统GetLastError函数的内存地址,然后通过系统GetLastError函数的内存地址,即可得到系统GetLastError函数,方便而快捷。
S4:对系统GetLastError函数的返回值进行判断,若返回值为ERROR_SUCCESS,则不做处理,若返回值为ERROR_ALREADY_EXISTS,则基于编写的hook模块,将系统GetLastError函数替换为fake_GetLastError函数,将返回值修改成fake_GetLastError函数的返回值ERROR_ALREADY_EXISTS,所述ERROR_ALREADY_EXISTS表示重名类型的错误码,所述ERROR_SUCCESS表示无任何错误码。
本发明实施例中,由于组件模块已注入应用程序中,应用程序启动并进行多开检测时,此时fake_GetLastError函数、系统GetLastError函数、和编写的hook模块运行,首先系统GetLastError函数被调用返回返回值,若返回值为ERROR_ALREADY_EXISTS,则基于编写的hook模块,将系统GetLastError函数替换为fake_GetLastError函数,将返回值修改成fake_GetLastError函数的返回值ERROR_ALREADY_EXISTS,进而正在启动的应用程序能够继续运行,实现应用程序的多开。
本发明实施例的多开检测绕过方法,通过fake_GetLastError函数,同时编写hook模块,当应用程序启动,对系统GetLastError函数的返回值进行判断,若返回值为ERROR_ALREADY_EXISTS,则基于编写的hook模块,将系统GetLastError函数替换为fake_GetLastError函数,将返回值修改成fake_GetLastError函数的返回值ERROR_ALREADY_EXISTS,即返回值为无任何错误码,从而无论当前是否已有相同的应用程序运行,正在启动的应用程序均能继续运行,实现应用程序的多开,使得在同一终端设备上能够同时运行多个相同的应用程序,方便开发人员出于测试需求的应用程序多开,有效降低应用程序的开发成本。
可选地,在上述图1对应实施例的基础上,本发明实施例提供的一种多开检测绕过方法的第一个可选实施例中,基于编写的hook模块,将系统GetLastError函数替换为fake_GetLastError函数,具体过程为:基于编写的hook模块,调用API函数DetourUpdateThread更改系统GetLastError函数的线程,从而调用fake_GetLastError函数,将系统GetLastError函数替换为fake_GetLastError函数。
更改系统GetLastError函数的线程,具体执行代码为:
DetourUpdateThread(GetCurrentThread())
其中,参数DetourUpdateThread为API函数,参数GetCurrentThread()表示获取当前线程的伪句柄。
进而可直接对系统GetLastError函数进行hook,转而调用fake_GetLastError函数,执行代码为:
DetourAttach(dwAddress,fake_GetLastError)
其中,参数DetourAttach表示捕获系统API,参数dwAddress为系统GetLastError函数的内存地址,参数fake_GetLastError表示伪造的GetLastError函数。
本发明步骤中,当应用程序开始启动后,便会进行多开检测,若编写的hook模块执行未及时执行,则系统GetLastError函数会被直接调用,从而返回真实的返回值,若当前已有相同的应用程序运行,则无法实现应用程序多开,故首先获取系统GetLastError函数,对系统GetLastError函数的返回值进行判断,若返回值为ERROR_ALREADY_EXISTS,则基于编写的hook模块,将系统GetLastError函数替换为fake_GetLastError函数,将返回值修改成fake_GetLastError函数的返回值ERROR_ALREADY_EXISTS,保证返回值始终为无任何错误码。
可选地,在上述一种多开检测绕过方法第一个可选实施例的基础上,本发明实施例提供的一种多开检测绕过方法的第二个可选实施例中,将编写的fake_GetLastError函数以及自定义的hook模块,编写成组件模块,并将所述组件模块注入至应用程序中之前,还包括:使用系统函数CreateProcess创建目标进程,使用创建的目标进程打开应用程序,所述目标进程用于暂停应用程序的启动。
系统函数CreateProcess创建目标进程,其中,系统函数CreateProcess具体为:
CreateProcess(NULL,tzFilePathName,NULL,NULL,TRUE,CREATE_SUSPENDED|CREATE_DEFAULT_ERROR_MODE,NULL,tzFileFolder,&si,&pi)
其中,参数CreateProcess为系统函数,参数tzFilePathName表示待创建的目标进程的名称,参数NULL表示空,参数TRUE表示真,参数CREATE_SUSPENDED|CREATE_DEFAULT_ERROR_MODE表示进程创建后不运行,参数tzFileFolder表示文件夹,参数&si和&pi为系统函数CreateProcess中的特定参数。通过系统函数CreateProcess创建目标进程,使得进程创建后不会立即执行,而是暂停。
当应用程序启动并进行多开检测时,调用fake_GetLastError函数,具体步骤为:
S401:定义一个线程环境变量,并对所述线程环境变量的获取数据类型进行定义,以使线程环境变量获取系统函数CreateProcess创建的目标进程;线程环境变量使用CONTEXT ThreadContext表示;对线程环境变量的获取数据类型进行定义,执行代码为ThreadContext.ContextFlags=CONTEXT_FULL,用于表示获取目标进程信息。
本发明步骤中,使用系统函数CreateProcess创建的目标进程,系统函数CreateProcess创建的进程不会立即执行,而是会先暂停执行,从而方便后续可执行空间的创建。
S402:待线程环境变量获取系统函数CreateProcess创建的目标进程后,在目标进程中创建一个可执行的内存空间,具体为通过loadlibraryA函数在目标进程中创建一个可执行的内存空间;
本发明步骤中,通过在目标进程中创建一个可执行的内存空间,以便于加载组件模块至创建的内存空间中,方便组件模块的执行。
S403:加载所述组件模块至创建的内存空间中,并将目标进程当前执行的地址更改为组件模块的地址;加载组件模块至创建的内存空间中,具体执行代码为:
Figure BDA0002181334820000161
在目标进程中创建一个可执行的内存空间中,具体执行代码为:
VirtualAllocEx(pi.hProcess,NULL,1024,MEM_COMMIT,PAGE_EXECUTE_READWRITE)
其中,参数VirtualAllocEx表示句柄,参数pi.hProcess用于指定在哪个目标进程中分配内存空间,参数PAGE_EXECUTE_READWRITE表示执行的内存空间。
将目标进程当前执行的地址更改为组件模块的地址执行代码为:
ThreadContext.Eip=(DWORD)lpRemoteLoadLibraryStart
其中,参数lpRemoteLoadLibraryStart表示所创建的内存空间。
本发明步骤中,当加载组件模块至创建的内存空间中后,则将目标进程当前执行的地址更改为组件模块的地址,因为应用程序在一开始启动,便会进行多开检测,若编写的hook模块执行未及时执行,则系统GetLastError函数会被直接调用,从而返回真实的返回值,故本发明将实现应用程序多开所采用的技术方案编写成组件模块形式,对于所要实现多开的应用程序,直接注入组件模块即可。
S404:应用程序启动运行,fake_GetLastError函数被调用。之前暂停的目标进程被恢复运行,应用程序即可启动,恢复目标进程的代码为:ResumeThread(pi.hThread),其中,参数ResumeThread表示使线程的挂起时间计数减一,当计数为0时,目标进程执行,参数pi.hThread表示创建的目标进程。
当fake_GetLastError函数被调用之后,还包括:调用系统函数GetLastError,得到返回值,对返回值进行判断,若返回值为重名类型的错误码,则将返回值改为无任何错误码;若返回值为无任何错误码,则不做处理,进而实现应用程序多开。
本发明步骤中,通过fake_GetLastError函数,同时编写hook模块,当应用程序启动,系统GetLastError函数即将被调用时,对系统GetLastError函数的返回值进行判断和替换,保证返回值为无任何错误码,无论当前是否已有相同的应用程序运行,正在启动的应用程序均能继续运行,实现应用程序的多开。
本发明实施例提供的一种存储介质的一实施例包括,该存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:
编写fake_GetLastError函数,用以生成返回值ERROR_ALREADY_EXISTS,同时自定义hook模块,以便将系统GetLastError函数替换为fake_GetLastError函数;
将编写的fake_GetLastError函数以及自定义的hook模块,编写成组件模块,并将所述组件模块注入至应用程序中;
当应用程序启动并进行多开检测时,调用fake_GetLastError函数,同时基于系统GetLastError函数的内存地址,获取系统GetLastError函数;
对系统GetLastError函数的返回值进行判断,若返回值为ERROR_SUCCESS,则不做处理,若返回值为ERROR_ALREADY_EXISTS,则基于编写的hook模块,将系统GetLastError函数替换为fake_GetLastError函数,将返回值修改成fake_GetLastError函数的返回值ERROR_ALREADY_EXISTS,所述ERROR_ALREADY_EXISTS表示重名类型的错误码,所述ERROR_SUCCESS表示无任何错误码。
可选地,在上述存储介质实施例的基础上,本发明实施例提供的一种存储介质的第一个可选实施例中,存储介质可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是但不限于:电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本文件中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
可选地,在上述存储介质的实施例及第一个可选实施例的基础上,本发明实施例提供的一种存储介质的第二个可选实施例中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、RF等等,或者上述的任意合适的组合。
可选地,在上述存储介质的实施例及第一、第二个可选实施例的基础上,本发明实施例提供的一种存储介质的第三个可选实施例中,可以以一种或多种程序设计语言或其组合来编写用于执行本发明操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言,诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络,包括局域网(LAN)或广域网(WAN),连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
参见图2所示,本发明实施例提供的一种电子设备的一实施例包括:
编写单元,其用于编写fake_GetLastError函数,用以生成返回值ERROR_ALREADY_EXISTS,同时自定义hook模块,以便将系统GetLastError函数替换为fake_GetLastError函数;
注入单元,其用于将编写的fake_GetLastError函数以及自定义的hook模块,编写成组件模块,并将所述组件模块注入至应用程序中;
调用单元,其用于当应用程序启动并进行多开检测时,调用fake_GetLastError函数,同时基于系统GetLastError函数的内存地址,获取系统GetLastError函数;
判断单元,其用于对系统GetLastError函数的返回值进行判断,若返回值为ERROR_SUCCESS,则不做处理,若返回值为ERROR_ALREADY_EXISTS,则基于编写的hook模块,将系统GetLastError函数替换为fake_GetLastError函数,将返回值修改成fake_GetLastError函数的返回值ERROR_ALREADY_EXISTS,所述ERROR_ALREADY_EXISTS表示重名类型的错误码,所述ERROR_SUCCESS表示无任何错误码。
本发明实施例提供的一种多开检测绕过系统,包括:
编写模块,其用于编写fake_GetLastError函数,用以生成返回值ERROR_ALREADY_EXISTS,同时自定义hook模块,以便将系统GetLastError函数替换为fake_GetLastError函数;
注入模块,其用于将编写的fake_GetLastError函数以及自定义的hook模块,编写成组件模块,并将所述组件模块注入至应用程序中;
调用模块,其用于当应用程序启动并进行多开检测时,调用fake_GetLastError函数,同时基于系统GetLastError函数的内存地址,获取系统GetLastError函数;
判断模块,其用于对系统GetLastError函数的返回值进行判断,若返回值为ERROR_SUCCESS,则不做处理,若返回值为ERROR_ALREADY_EXISTS,则基于编写的hook模块,将系统GetLastError函数替换为fake_GetLastError函数,将返回值修改成fake_GetLastError函数的返回值ERROR_ALREADY_EXISTS,所述ERROR_ALREADY_EXISTS表示重名类型的错误码,所述ERROR_SUCCESS表示无任何错误码。
基于系统GetLastError函数的内存地址,获取系统GetLastError函数,具体过程为:
获取系统GetLastError函数所在模块的起始地址;
基于所获取的起始地址,通过GetProcAddress函数获取系统GetLastError函数的内存地址,得到系统GetLastError函数。
本发明实施例的多开检测绕过系统,通过fake_GetLastError函数,同时编写hook模块,当应用程序启动,对系统GetLastError函数的返回值进行判断,若返回值为ERROR_ALREADY_EXISTS,则基于编写的hook模块,将系统GetLastError函数替换为fake_GetLastError函数,将返回值修改成fake_GetLastError函数的返回值ERROR_ALREADY_EXISTS,即返回值为无任何错误码,从而无论当前是否已有相同的应用程序运行,正在启动的应用程序均能继续运行,实现应用程序的多开,使得在同一终端设备上能够同时运行多个相同的应用程序,方便开发人员出于测试需求的应用程序多开,有效降低应用程序的开发成本。
本发明不局限于上述实施方式,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围之内。本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。

Claims (10)

1.一种多开检测绕过方法,其特征在于,包括以下步骤:
编写fake_GetLastError函数,用以生成返回值ERROR_ALREADY_EXISTS,同时自定义hook模块,以便将系统GetLastError函数替换为fake_GetLastError函数;
将编写的fake_GetLastError函数以及自定义的hook模块,编写成组件模块,并将所述组件模块注入至应用程序中;
当应用程序启动并进行多开检测时,调用fake_GetLastError函数,同时基于系统GetLastError函数的内存地址,获取系统GetLastError函数;
对系统GetLastError函数的返回值进行判断,若返回值为ERROR_SUCCESS,则不做处理,若返回值为ERROR_ALREADY_EXISTS,则基于编写的hook模块,将系统GetLastError函数替换为fake_GetLastError函数,将返回值修改成fake_GetLastError函数的返回值ERROR_ALREADY_EXISTS,所述ERROR_ALREADY_EXISTS表示重名类型的错误码,所述ERROR_SUCCESS表示无任何错误码。
2.如权利要求1所述的一种多开检测绕过方法,其特征在于,所述基于系统GetLastError函数的内存地址,获取系统GetLastError函数,具体过程为:
获取系统GetLastError函数所在模块的起始地址;
基于所获取的起始地址,通过GetProcAddress函数获取系统GetLastError函数的内存地址,得到系统GetLastError函数。
3.如权利要求1所述的一种多开检测绕过方法,其特征在于,所述基于编写的hook模块,将系统GetLastError函数替换为fake_GetLastError函数,具体过程为:基于编写的hook模块,调用API函数DetourUpdateThread更改系统GetLastError函数的线程,从而调用fake_GetLastError函数,将系统GetLastError函数替换为fake_GetLastError函数。
4.如权利要求1所述的一种多开检测绕过方法,其特征在于,将编写的fake_GetLastError函数以及自定义的hook模块,编写成组件模块,并将所述组件模块注入至应用程序中之前,还包括:使用系统函数CreateProcess创建目标进程,使用创建的目标进程打开应用程序,所述目标进程用于暂停应用程序的启动。
5.如权利要求4所述的一种多开检测绕过方法,其特征在于,所述系统函数CreateProcess创建目标进程,其中,系统函数CreateProcess具体为:
CreateProcess(NULL,tzFilePathName,NULL,NULL,TRUE,CREATE_SUSPENDED|CREATE_DEFAULT_ERROR_MODE,NULL,tzFileFolder,&si,&pi)
其中,参数CreateProcess为系统函数,参数tzFilePathName表示待创建的目标进程的名称,参数NULL表示空,参数TRUE表示真,参数CREATE_SUSPENDED|CREATE_DEFAULT_ERROR_MODE表示进程创建后不运行,参数tzFileFolder表示文件夹,参数&si和&pi为系统函数CreateProcess中的特定参数。
6.如权利要求5所述的一种多开检测绕过方法,其特征在于,所述当应用程序启动并进行多开检测时,调用fake_GetLastError函数,具体步骤为:
定义一个线程环境变量,并对所述线程环境变量的获取数据类型进行定义,以使线程环境变量获取系统函数CreateProcess创建的目标进程;
待线程环境变量获取系统函数CreateProcess创建的目标进程后,在目标进程中创建一个可执行的内存空间;
加载所述组件模块至创建的内存空间中,并将目标进程当前执行的地址更改为组件模块的地址;
应用程序启动运行,fake_GetLastError函数被调用。
7.一种存储介质,该存储介质上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现以下步骤:
编写fake_GetLastError函数,用以生成返回值ERROR_ALREADY_EXISTS,同时自定义hook模块,以便将系统GetLastError函数替换为fake_GetLastError函数;
将编写的fake_GetLastError函数以及自定义的hook模块,编写成组件模块,并将所述组件模块注入至应用程序中;
当应用程序启动并进行多开检测时,调用fake_GetLastError函数,同时基于系统GetLastError函数的内存地址,获取系统GetLastError函数;
对系统GetLastError函数的返回值进行判断,若返回值为ERROR_SUCCESS,则不做处理,若返回值为ERROR_ALREADY_EXISTS,则基于编写的hook模块,将系统GetLastError函数替换为fake_GetLastError函数,将返回值修改成fake_GetLastError函数的返回值ERROR_ALREADY_EXISTS,所述ERROR_ALREADY_EXISTS表示重名类型的错误码,所述ERROR_SUCCESS表示无任何错误码。
8.一种电子设备,其特征在于,所述电子设备包括:
编写单元,其用于编写fake_GetLastError函数,用以生成返回值ERROR_ALREADY_EXISTS,同时自定义hook模块,以便将系统GetLastError函数替换为fake_GetLastError函数;
注入单元,其用于将编写的fake_GetLastError函数以及自定义的hook模块,编写成组件模块,并将所述组件模块注入至应用程序中;
调用单元,其用于当应用程序启动并进行多开检测时,调用fake_GetLastError函数,同时基于系统GetLastError函数的内存地址,获取系统GetLastError函数;
判断单元,其用于对系统GetLastError函数的返回值进行判断,若返回值为ERROR_SUCCESS,则不做处理,若返回值为ERROR_ALREADY_EXISTS,则基于编写的hook模块,将系统GetLastError函数替换为fake_GetLastError函数,将返回值修改成fake_GetLastError函数的返回值ERROR_ALREADY_EXISTS,所述ERROR_ALREADY_EXISTS表示重名类型的错误码,所述ERROR_SUCCESS表示无任何错误码。
9.一种多开检测绕过系统,其特征在于,包括:
编写模块,其用于编写fake_GetLastError函数,用以生成返回值ERROR_ALREADY_EXISTS,同时自定义hook模块,以便将系统GetLastError函数替换为fake_GetLastError函数;
注入模块,其用于将编写的fake_GetLastError函数以及自定义的hook模块,编写成组件模块,并将所述组件模块注入至应用程序中;
调用模块,其用于当应用程序启动并进行多开检测时,调用fake_GetLastError函数,同时基于系统GetLastError函数的内存地址,获取系统GetLastError函数;
判断模块,其用于对系统GetLastError函数的返回值进行判断,若返回值为ERROR_SUCCESS,则不做处理,若返回值为ERROR_ALREADY_EXISTS,则基于编写的hook模块,将系统GetLastError函数替换为fake_GetLastError函数,将返回值修改成fake_GetLastError函数的返回值ERROR_ALREADY_EXISTS,所述ERROR_ALREADY_EXISTS表示重名类型的错误码,所述ERROR_SUCCESS表示无任何错误码。
10.如权利要求9所述的一种多开检测绕过系统,其特征在于,所述基于系统GetLastError函数的内存地址,获取系统GetLastError函数,具体过程为:
获取系统GetLastError函数所在模块的起始地址;
基于所获取的起始地址,通过GetProcAddress函数获取系统GetLastError函数的内存地址,得到系统GetLastError函数。
CN201910797324.5A 2019-08-27 2019-08-27 一种多开检测绕过方法、存储介质、设备及系统 Pending CN112445683A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910797324.5A CN112445683A (zh) 2019-08-27 2019-08-27 一种多开检测绕过方法、存储介质、设备及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910797324.5A CN112445683A (zh) 2019-08-27 2019-08-27 一种多开检测绕过方法、存储介质、设备及系统

Publications (1)

Publication Number Publication Date
CN112445683A true CN112445683A (zh) 2021-03-05

Family

ID=74742078

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910797324.5A Pending CN112445683A (zh) 2019-08-27 2019-08-27 一种多开检测绕过方法、存储介质、设备及系统

Country Status (1)

Country Link
CN (1) CN112445683A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113489705A (zh) * 2021-06-30 2021-10-08 中国银联股份有限公司 一种抓取应用程序http通讯数据的方法、装置存储介质

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2012027669A1 (en) * 2010-08-26 2012-03-01 Verisign, Inc. Method and system for automatic detection and analysis of malware
CN106371940A (zh) * 2015-07-21 2017-02-01 腾讯科技(深圳)有限公司 一种程序崩溃解决方法及装置
CN107545182A (zh) * 2017-09-06 2018-01-05 武汉斗鱼网络科技有限公司 一种ios应用中绕过函数调用链检测的方法及系统

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2012027669A1 (en) * 2010-08-26 2012-03-01 Verisign, Inc. Method and system for automatic detection and analysis of malware
CN106371940A (zh) * 2015-07-21 2017-02-01 腾讯科技(深圳)有限公司 一种程序崩溃解决方法及装置
CN107545182A (zh) * 2017-09-06 2018-01-05 武汉斗鱼网络科技有限公司 一种ios应用中绕过函数调用链检测的方法及系统

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
JANLEX: "关于hook CreateMutex实现多开问题", 《HTTPS://BBS.CSDN.NET/TOPICS/270088455》 *
聆听半边世界: "从龙之谷双开领悟出的——HOOK API", 《HTTPS://BLOG.CSDN.NET/WDNDAJZ21K/ARTICLE/DETAILS/8757333》 *

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113489705A (zh) * 2021-06-30 2021-10-08 中国银联股份有限公司 一种抓取应用程序http通讯数据的方法、装置存储介质

Similar Documents

Publication Publication Date Title
US8893222B2 (en) Security system and method for the android operating system
CN105574411B (zh) 一种动态脱壳方法、装置和设备
US10019598B2 (en) Dynamic service discovery
CN102422299B (zh) 信息设备以及防止执行不正当程序代码的方法
US10338952B2 (en) Program execution without the use of bytecode modification or injection
CN104731622B (zh) 一种应用程序的加载方法、装置和移动终端
US8918776B2 (en) Self-adapting software system
WO2019090994A1 (zh) 测试脚本自动化执行方法、装置、设备以及存储介质
US9304762B2 (en) Automatically customizing a computer-executable application at runtime
US9250917B2 (en) Auto-cloudifying applications via runtime modifications
CN110162344B (zh) 一种隔离限流的方法、装置、计算机设备及可读存储介质
WO2023155686A1 (zh) 一种数据处理的方法和装置
CN110908837A (zh) 应用程序异常处理方法、装置、电子设备及存储介质
CN112445683A (zh) 一种多开检测绕过方法、存储介质、设备及系统
CN106055348A (zh) 一种通知系统属性更新的方法和装置
US11500982B2 (en) Systems and methods for reliably injecting control flow integrity into binaries by tokenizing return addresses
US8788785B1 (en) Systems and methods for preventing heap-spray attacks
CN104572199A (zh) 一种禁止启动项启动的方法和装置
US20130081007A1 (en) Providing continuous application availability during application update
CN113238915B (zh) 调用信息的处理方法、装置、设备、存储介质及程序
CN113835748B (zh) 基于html5的应用程序的打包方法、系统和可读介质
US9098356B2 (en) Hook re-entry prevention device and recording medium, in which program for executing method thereof in computer is recorded thereon
CN113805858B (zh) 持续部署脚本语言开发的软件的方法和装置
Lauer et al. Linux
CN110569641A (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: 20210305