CN112540903A - 快速查找防止多开的方法、存储介质、电子设备及系统 - Google Patents
快速查找防止多开的方法、存储介质、电子设备及系统 Download PDFInfo
- Publication number
- CN112540903A CN112540903A CN202011460265.1A CN202011460265A CN112540903A CN 112540903 A CN112540903 A CN 112540903A CN 202011460265 A CN202011460265 A CN 202011460265A CN 112540903 A CN112540903 A CN 112540903A
- Authority
- CN
- China
- Prior art keywords
- api
- function
- program
- module
- open
- 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.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/34—Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment
- G06F11/3466—Performance evaluation by tracing or monitoring
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
- G06F9/4881—Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种快速查找防止多开的方法、存储介质、电子设备及系统,涉及互联网移动端应用开发领域。该方法包括:获取所有用于检测多开的API函数及其信息,并保存至链表中;对每个程序的所有可执行模块代码进行收集,形成该程序的模块列表;当需要查找某个程序的防止多开的API调用时,获取对应的模块列表并通过枚举每个模块的导入表表项,获取到该程序静态调用的所有API函数;将获取的API函数在保存的链表中进行查找,并将查找到的API函数记录在防止多开列表中;在防止多开列表中过滤出真正用于检测多开的API调用。本发明可以快速完成查找并识别出程序是使用何种防止多开的策略,不但便捷高效,而且准确性高,满足实际应用需求。
Description
技术领域
本发明涉及互联网移动端应用开发领域,具体来讲是一种快速查找防止多开的方法、存储介质、电子设备及系统。
背景技术
在互联网移动端的程序设计中,对于一些程序,一台设备上同时只能打开一个程序,而不能同时打开多个程序。而一些情况下为了使用方便,使用者需要能够同时打开多个程序。然而,现有的程序都会采用不同的手段来设计阻止程序的多开,即防止多开。目前,不同的程序采用不一样的方式来防止多开,如果需要对每个程序去绕过多开检测,那么通常的做法则是去逆向分析每个程序,查看其实现原理,然后基于其实现原理来实现绕过的策略。
由于采用现有方式需要针对每个程序都去进行逆向分析,从而需要花费大量的时间和人力。因此,如何提供一种快速便捷的方式来查找到程序使用的是何种策略来防止多开,是本领域技术人员亟需解决的问题。
发明内容
本发明的目的是为了克服上述背景技术的不足,提供一种快速查找防止多开的方法、存储介质、电子设备及系统,可以快速完成查找并识别出程序是使用何种防止多开的策略,不但便捷高效,而且准确性高,满足实际应用需求。
为达到以上目的,第一方面,本发明实施例提供一种快速查找防止多开的方法,其包括:
S1、获取所有用于检测多开的API函数及其信息,并保存至一个链表中;
S2、对每个程序的所有可执行模块代码进行收集和检测,形成该程序的模块列表;
S3、当需要查找某个程序的防止多开的API调用时,获取该程序对应的模块列表;通过枚举该模块列表中每个模块的导入表表项,获取到该程序直接静态调用的所有API函数;将获取到的API函数在步骤S1的链表中进行匹配查找,并将查找到的API函数记录在一个防止多开列表中;
S4、采用判断错误消息的方式以及判断窗口函数的方式,在所述防止多开列表中过滤出真正用于检测多开的API调用。
作为一个优选的实施方案,步骤S1采用静态枚举的实现方式,包括以下操作:
根据函数的实现功能,收集所有用于检测多开的API函数;
针对收集的每个用于检测多开的API函数,查看其相关API信息,所述API信息包括API所属的系统模块的名称,以及API的名称或API所属模块的偏移地址;并将所述API信息记录在预先定义好的数据结构Info中;
将每个记录有API信息的Info,存储至一个链表中。
作为一个优选的实施方案,步骤S1采用配置化的实现方式,包括以下操作:
获取本地预置的或由服务器平台下发的多开配置文件,所述多开配置文件存储有用于检测多开的API函数及其信息;
定义API信息类,该类中设置有API信息加载方法,用于通过读取所述多开配置文件,获取到用于检测多开的API函数及其信息;该类中还设置有API函数添加方法,用于添加新增的用于检测多开的API函数及其信息;
当获取所有用于检测多开的API函数及其信息时,先定义一个用于存储所有信息的链表;然后依次调用所述API信息加载方法和所述API函数添加方法,将获取到的所有用于检测多开的API函数及其信息,填入到所述链表中。
作为一个优选的实施方案,所述API函数添加方法默认实现为空,表明默认情况下,无需新增新的用于检测多开的API函数及其信息;
当需要添加系统公有API函数时,通过自定义编写API函数添加方法的实现,来完成添加系统公有API函数及其信息,且所添加的公有API函数信息包括该API所属的模块名称以及该API的名称;
当需要添加系统私有API函数时,通过继承所述API信息类并实现API函数添加方法,来完成添加系统私有API函数及其信息,且所添加的私有API函数信息包括API所属的模块名称以及API所属模块的偏移地址。
作为一个优选的实施方案,所述多开配置文件包括:该文件的HASH值、该文件存储的系统API函数的总个数,以及按照模块名来划分的各API函数及其信息。
作为一个优选的实施方案,步骤S3之后,还包括动态获取模块的加载系统函数的流程,其包括:
通过修改程序最先启动的模块的导入表,将自定义的hook模块注入到该程序中,使得该程序一旦启动后,所述hook模块将对当前程序的系统函数GetProcAddress进行hook;通过hook获取到该程序调用的所有系统模块的API函数;
将获取到的API函数在步骤S1中的链表中进行匹配查找,找到该程序所使用的用于检测多开的API函数;并将查找到的API函数记录在一个防止多开列表中。
作为一个优选的实施方案,步骤S4包括以下操作:
遍历所述防止多开列表中的每个API函数,判断当前API函数是否会在创建时通过创建后系统返回的错误消息来判断程序是否多开,如果是,则判定当前API函数为真正用于检测多开的API调用,之后继续进行下一API函数的判断;
否则,判断当前API函数后续是否有调用窗口函数FindWindow和SetForegroundWindow,如果有,则判定当前API函数为真正用于检测多开的API调用,之后继续进行下一API函数的判断;否则,判定当前API函数不是真正用于检测多开的API调用,之后继续进行下一API函数的判断。
第二方面,本发明实施例提供一种快速查找防止多开的系统,其包括:
多开函数获取单元,其用于获取所有用于检测多开的API函数及其信息,并保存至一个链表中;
程序模块收集单元,其用于对每个程序的所有可执行模块代码进行收集和检测,形成该程序的模块列表;
多开函数查找单元,其用于当需要查找某个程序的防止多开的API调用时,获取该程序对应的模块列表;通过枚举该模块列表中每个模块的导入表表项,获取到该程序直接静态调用的所有API函数;将获取到的API函数在所述多开函数获取单元保存的链表中进行匹配查找,并将查找到的API函数记录在一个防止多开列表中;
多开函数过滤单元,其用于采用判断错误消息的方式以及判断窗口函数的方式,在所述防止多开列表中过滤出真正用于检测多开的API调用。
第三方面,本发明实施例还提供一种存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现第一方面实施例中的方法。
第四方面,本发明实施例还提供一种电子设备,包括存储器和处理器,存储器上储存有在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现第一方面实施例中的方法。
本发明的有益效果在于:
(1)本发明中,会事先收集所有可用于检测多开的API函数及其信息,当需要查找某个程序的防止多开的API调用时,会将该程序调用的所有系统API函数与事先收集的所有可用于检测多开的API函数进行匹配,从而快速查找出该程序具体调用了哪些可用于检测多开的API函数。整个查找过程快速高效,且无需对每个程序都去进行逆向分析来查找各程序的防止多开策略,能节省大量的时间和人力成本。并且,在查找出程序具体调用了哪些可用于检测多开的API函数之后,还会采用多种方式过滤出真正用于检测多开的API调用,从而有效提高了查找结果的准确性及可靠性,满足实际应用需求。
(2)本发明中,当获取所有用于检测多开的API函数及其信息时,可优选采用配置化的实现方式。该实现方式可以通过配置文件快速、便捷地获取到用于检测多开的API函数,还可以很方便的增加新的模块,或者是一个模块增加新的用于检测多开的API函数。通过这种配置化的实现方式,可以无需修改程序,而基于配置则完成了新增加API的功能扩展,可扩展性强。另外,实际应用中,这种配置化文档是非代码类的,属于数据类的;对于移动端(或客户端)而言,可由服务器平台进行配置下发,直接在移动端(或客户端)进行使用,而无需进行代码类的修改操作,便于移动端(或客户端)的实现,适应性更广,满足了实际应用需求。
(3)本发明中,不但可以通过静态获取的方式(枚举该模块列表中每个模块的导入表表项),获取到该程序直接静态调用的所有API函数;而且还可以通过动态获取模块的加载系统函数的方式,来获取到该程序直接静态调用的所有API函数。这种通过动态获取的方式,可以应对实际应用中具有更为隐蔽的情况(通过动态加载来调用的情况),使得本方案的查找更加全面、准确,使用效果更加理想。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面对实施例对应的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例中快速查找防止多开的方法的流程图;
图2为本发明实施例中快速查找防止多开的系统的结构框图。
图中:10-多开函数获取单元,20-程序模块收集单元,30-多开函数查找单元,40-多开函数过滤单元。
具体实施方式
针对现有技术中,采用对每个程序都去进行逆向分析的方式来查找各程序的防止多开策略,存在需要花费大量的时间和人力的问题。本发明旨在提供一种快速查找防止多开的方法、存储介质、电子设备及系统,可以快速完成查找并识别出程序是使用何种防止多开的策略,不但便捷高效,而且准确性高,能满足实际应用需求。
为达到上述技术效果,本发明的主要设计思路为:
获取所有用于检测多开的API函数及其信息,并保存至一个链表中;
对每个程序的所有可执行模块代码进行收集和检测,形成该程序的模块列表;
当需要查找某个程序的防止多开的API调用时,获取该程序对应的模块列表;通过枚举该模块列表中每个模块的导入表表项,获取到该程序直接静态调用的所有API函数;将获取到的API函数在上述链表中进行匹配查找,并将查找到的API函数记录在一个防止多开列表中;
采用判断错误消息的方式以及判断窗口函数的方式,在所述防止多开列表中过滤出真正用于检测多开的API调用。
综上所述,本方案中会事先收集所有可用于检测多开的API函数及其信息,当需要查找某个程序的防止多开的API调用时,会将该程序调用的所有系统API函数与事先收集的所有可用于检测多开的API函数进行匹配,从而快速查找出该程序具体调用了哪些可用于检测多开的API函数。整个查找过程快速高效,且无需对每个程序都去进行逆向分析来查找各程序的防止多开策略,能节省大量的时间和人力成本。并且,在查找出程序具体调用了哪些可用于检测多开的API函数之后,还会采用多种方式过滤出真正用于检测多开的API调用,从而有效提高了查找结果的准确性及可靠性,满足实际应用需求。
为使本发明要解决的技术问题、技术方案和优点更加清楚,下面将结合说明书附图以及具体的实施例对本发明的技术方案进行详细的说明。
但需说明的是:接下来要介绍的示例仅是一些具体的例子,而不作为限制本发明的实施例必须为如下具体的步骤、数值、条件、数据、顺序等。本领域技术人员可以通过阅读本说明书来运用本发明的构思来构造本说明书中未提到的更多实施例。
实施例一
参见图1所示,本实施例提供了一种快速查找防止多开的方法,该方法包括以下步骤:
S1、获取所有用于检测多开的API函数及其信息,并保存至一个链表中。
可以理解的是,通常对于检测多开的方法来说,都是通过系统API函数来创建一个命名的内核句柄,该句柄的特性是整个系统共享,具有任何一个进程都可以访问到的特点,同时其他进程可以通过名称来判断当前系统中是否已经存在了,如果存在则说明已经有程序已经使用了,如果没有存在则说明当前系统没有。而这些用于检测多开的系统API函数,则是本方案中需要进行查找的对象,因此,为了便于后续针对不同程序进行快速查找,本方案提出在进行查找之前,将所有用于检测多开的API函数及其信息进行归纳收集,使得后续在查找过程中能实现快速比对。
具体来说,作为一种可选的实施方式,步骤S1中,获取所有用于检测多开的API函数及其信息时,采用静态枚举的实现方式。则步骤S1具体包括以下操作:
S101、根据函数的实现功能,收集所有用于检测多开的API函数。举例来说,这些用于检测多开的API函数包括但不限于以下几种:
(1)FindWindow函数:通过查找窗口标题(或/和类名)来判断程序是否正在运行。如果找到了,表明程序正在运行,这时可退出程序,达到不重复运行的效果;反之表明程序是第一次运行。
(2)利用Mutex对象来确定程序是否已经运行;核心API函数是Mutex对象创建函数,即CreateMutex函数。
(3)CreateFileMapping函数:通过将程序实例信息放到跨进程的内存映射文件中,从而控制程序多开。
S102、针对收集的每个用于检测多开的API函数,查看其相关API信息,所述API信息包括API所属的系统模块的名称,以及API的名称或API所属模块的偏移地址;并将所述API信息记录在预先定义好的数据结构Info中。
实际应用中,查看各API函数的相关API信息时,其实是针对每个API函数查看其所属于哪个系统模块,并对API所属的系统模块的名称等信息进行记录。另外,可以理解的是,当用于检测多开的API函数为私有API函数时,由于对于私有的API函数无法通过名称来获取,只能通过逆向分析得到其内存地址,所以只能记录私有API函数所属的模块名称以及所属模块的偏移地址。即,对于私有API函数来说,其相关API信息中包括:API所属的模块名称以及API所属模块的偏移地址;对于公有API函数来说,其相关API信息中包括:API所属的模块名称以及API的名称。
与此对应的,举例来说,所定义的数据结构Info可为以下内容:
Struct Info{
String api;//此数据用于存储API的名称。
String module;//为API所属的系统模块的名称,具体可通过查看系统的帮助文档来获知每个系统API函数属于哪个系统模块。
Uint64_t address;//此数据用于存储私有API所属模块的偏移地址。
}
S103、将每个记录有API信息的Info(每个用于检测多开的API函数,都有对应的一个Info来记录其相关的API信息),存储至一个链表(如链表listapi,List<Info>listapi)中。可以理解的是,本步骤中使用一个链表来存储这些信息,可以方便后续快速获取所有的这些API信息,从而实现快速查找的目的。
下面以系统API函数CreateMutex为例,对上述步骤S103进行具体说明:
对于系统API函数CreateMutex,通过查看系统的帮助文档可获知其属于系统模块Kernel32.dll中。则系统API函数CreateMutex所对应的,记录其API信息的数据结构Info可为:Info i(“CreateMutex”,“Kernel32.dll”);然后,通过lisapi.push_back(i)将其存储到链表listapi中。
进一步地,虽然采用上述静态枚举的方式,已经可以实现获取所有用于检测多开的API函数及其信息的功能。但是,作为更为理想的方案,是希望上述功能能够支持后续的一些扩展,也就是对于后续其他程序增加了新的防止多开的检测函数,都能够适用,从而提高本方案的易扩展性。因此,本实施例中,作为一种优选的实施方式,步骤S1中,获取所有用于检测多开的API函数及其信息时,采用配置化的实现方式。则步骤S1具体包括以下操作:
S101'、获取本地预置的或由服务器平台下发的多开配置文件,所述多开配置文件存储有用于检测多开的API函数及其信息。
可以理解的是,为了达到配置化的实现方式,本实施方式中将常用的检测多开的API函数及其信息,预先设置成了一个配置文件,该配置文件可以方便的填入各个用于检测多开的API函数及其信息,包括之前收集的已知的API函数,同时也包括后续新增加的API函数,该配置文件都可以支持。
具体来说,本实施例中的多开配置文件中包括以下内容:该文件的HASH值、该文件存储的系统API函数的总个数,以及按照模块名来划分的各API函数及其信息。其中,将每个模块相关的API函数及其信息,按照所属的模块来划分并放到一起,可方便后续更快地读取和查找,从而提高读取和查找的速度。举例来说,该多开配置文件可设计如下:
{
“Hash”:“xxxx”//用于存储本文件的HASH值,为了防止该配置文件被破坏或者数据不一致从而可以形成校验,避免程序读取错误配置导致程序crash。
“Num”:“xx”//用于存储本文件所保存的系统API函数的总个数,从而可以与后续读取的形成校验。
{“moduleName”:[{“name”:“apiname”},{“name”:“apiname”},]}//其中,“moduleName”为系统模块的名称,{“name”:“apiname”}则都表示一个系统API函数的名称;整体则是将一个模块的所有相关API函数列到一起;采用同样的方式可以增加其他模块的相关API函数及其信息。
}
S102'、定义API信息类(如Class APIInfo),该类中设置有API信息加载方法(如LoadApiInfo),用于通过读取所述多开配置文件,获取到用于检测多开的API函数及其信息;该类中还设置有API函数添加方法(如AddApiInfo),用于添加新增的用于检测多开的API函数及其信息。
具体来说,实际应用中,定义的API信息类可设计如下:
Class APIInfo{
Virtual void LoadApiInfo(List<Info>&info,string filename)//其中,参数info,是从多开配置文件读取到的所有系统API和对应模块名称,即API信息;参数filename,则是多开配置文件的文件名称
{具体实现则是通过读取上述多开配置文件,并创建Info对象,将对象赋值后存储到info链表中}
上述API信息加载方法LoadApiInfo提供了一种从配置读取的模式,然而也存在一些情况是无法通过读取配置能够获取到的系统API,则需要进行添加操作。因此,本方案还提供了扩展接口由后续的功能实现者自定义去实现添加,即API函数添加方法AddApiInfo,如下:
Virtual void AddApiInfo(List<Info>&info){}
}
更进一步地,作为一种优选的实施方式,步骤S102'中,所述API函数添加方法默认实现为空,表明默认情况下,无需新增新的用于检测多开的API函数及其信息;
当需要添加系统公有API函数时,通过自定义编写API函数添加方法(AddApiInfo)的实现,来完成添加系统公有API函数及其信息,且所添加的公有API函数信息包括该API所属的模块名称以及该API的名称;
当需要添加系统私有API函数时,通过继承API信息类(Class APIInfo)并实现API函数添加方法(AddApiInfo),来完成添加系统私有API函数及其信息,且所添加的私有API函数信息包括API所属的模块名称以及API所属模块的偏移地址。
通过上述内容可知,本方案中对于通常的情况,是默认无需新增API函数及其信息的,只需通过配置获取已有的用于检测多开的API函数及其信息即可;而对于需要新增API函数的情况,又具体区分为两种:一种情况是需要添加系统公有API函数,由于系统公有API函数通常对外提供了接口,则可直接通过自定义编写API函数添加方法(AddApiInfo)的实现,来完成添加系统公有API函数及其信息。另一种情况则是需要增加系统私有API函数,而私有API函数并没有对外提供接口,因此需要通过其他的方法来获取。那么,则可以继承上述API信息类(Class APIInfo)来实现。具体设计可如下:
Class APIInfo_Private:public APIInfo{
Virtual void AddApiInfo(List<Info>&info){
其中,通过继承APIInfo并实现AddApiInfo来实现添加系统的私有API函数。私有API函数的获取通常会通过逆向分析系统模块的代码或者查看系统文档,基于逆向分析后得出。例如,系统提供了一种私有API也实现了类似于CreateMutex的功能,那么一些程序开发者则会尝试使用这种私有API,从而不易于被发现,隐蔽效果更好。而对于私有的API函数无法通过名称来获取,因此只能通过逆向分析得到其内存地址,所以只能存储私有API所属的模块名称以及所属模块的偏移地址,作为API信息(Info)的内容,其内容如下:
Info i(“模块名称”,0x238);
然后,通过Info.push_back(i);将Info信息存储到一个info链表中。}
另外,需要创建一个存储了多个APIInfo的指针并存储到链表listApi中,从而可以基于APIInfo继承实现的多个子类都存储到链表中,使得通过遍历链表则可以加载所有的API信息。具体设计可如下:
list<APIInfo*>listApi;
listApi.push_back(new APIInfo());//创建一个APIInfo的实例对象并存储到listApi链表中
listApi.push_back(new APIInfo_Private());//创建一个APIInfo_Private的实例对象并存储到listApi链表中
这样,listApi链表中则存储了2个APIInfo的实现,当然还可以依据实际情况添加更多其他的实现。
最后,提供一个接口给外部使用来获取所有的系统API接口,具体设计如下:
List<Info>getApiInfo(list<APIInfo*>listApi);其中,参数存储了多个APIInfo的指针并存储到链表listApi中,从而可以基于APIInfo继承实现的多个子类都存储到链表中,从而通过遍历链表则可以加载所有的API信息。
基于上述设计,开发者还可以继续编写添加各种自行设置的各种系统API函数,只需要通过实现一个类继承自APIInfo并且实现方法AddApiInfo即可。
S103'、当获取所有用于检测多开的API函数及其信息时,先定义一个用于存储所有信息的链表(如info链表,List<Info>info);然后依次调用所述API信息加载方法(LoadApiInfo)和所述API函数添加方法(如AddApiInfo),将获取到的所有用于检测多开的API函数及其信息,填入到该链表中。
从上述步骤S101'~S103'的操作可以看出,该优选的实施方式可以通过配置文件快速、便捷地获取到用于检测多开的API函数,还可以很方便的增加新的模块,或者是一个模块增加新的用于检测多开的API函数。通过这种配置化的实现方式,可以无需修改程序,而基于配置则完成了新增加API的功能扩展,可扩展性强。另外,实际应用中,这种配置化文档是非代码类的,属于数据类的;对于移动端(或客户端)而言,可由服务器平台进行配置下发,直接在移动端(或客户端)进行使用,而无需进行代码类的修改操作,便于移动端(或客户端)的实现,适应性更广,满足了实际应用需求。
S2、对每个程序的所有可执行模块代码进行收集和检测,形成该程序的模块列表。
可以理解的是,对于任何一个安装程序来说,其是由一个EXE文件和多个DLL模块组成的。那么,其实现防止多开的功能则可能在EXE文件中去实现,也可能在DLL模块中实现。所以,需要对这些所有的可以执行的模块代码进行收集并对其进行检测。最终,形成一份该程序的模块列表。其代码设计可如下:
List<string>listmodule;其中,listmodule为程序的模块列表。
S3、当需要查找某个程序的防止多开的API调用时,获取该程序对应的模块列表;通过枚举该模块列表中每个模块的导入表表项,获取到该程序直接静态调用的所有API函数;将获取到的API函数在步骤S1的链表中进行匹配查找,并将查找到的API函数记录在一个防止多开列表中。
可以理解的是,本实施例的步骤S3中,通过静态的方法,也就是不需要把目标程序执行则可以直接获取的方式,来完成获取该程序直接静态调用的所有API函数。该方式首先会对该程序对应的模块列表(即上述的listmodule)进行遍历,遍历每个模块;然后获取每个模块的导入表,并枚举导入表的所有项目,从而得到该程序直接静态调用的所有API函数。获取到该程序直接静态调用的所有API函数后,通过进行匹配查找,可判断是否存在之前在链表中存储的用于检测多开的API函数中的任何一个,从而可知道该程序有没有使用这些API函数来检测多开。具体来说,包括以下操作:
S301、获取模块列表:当需要查找某个程序的防止多开的API调用时,获取该程序对应的模块列表(listmodule)。
S302、遍历模块列表:对该程序的模块列表进行遍历,得到模块列表中每个模块的名称。具体实现可如下:
For(auto it=listmodule.begin();it!=listmodule.end();++it){
String name=(*it);//得到每个模块的名称。}
S303、加载遍历的模块:使用程序执行时的模式加载模块,并使用文件加载到内存的模式来读取模块,获取到该模块列表中每个模块的导入表表项;通过查找导入表表项,获取到该程序直接静态调用的所有API函数。
可以理解的是,得到每个模块的名称后,需要来加载模块,此处不能用读取普通文件的模式来加载模块,而需要使用程序执行时的模式加载模块,主要由于模块在文件中的对齐方式和在内存中的对齐方式是不一样的,所以可以使用文件加载到内存的模式来读取模块。这种方式加载后,则可以使用模块文件的格式也就是PE文件格式来读取模块。然后,就可以读取每个模块的导入表表项,导入表表项中填入了此模块依赖其他模块哪些API函数。
那么,如果一个模块要想通过系统API函数来检测当前软件是否存在多开的方式,则只能通过调用系统API函数。如果模块调用系统API函数,那么在其导入表中则会引入调用的所有系统API函数,从而通过查找导入表则可以知道该模块有没有使用这些API函数来检测多开。具体来说,对于每个模块的导入表项。其具体实现可如下:
DWORD dwImportInFile=(导入表的模块偏移+模块内存起始地址);
PIMAGE_IMPORT_DESCRIPTOR pImport=dwImportInFile;//得到导入表项结构数据;
while(pImport->Name){//通过while循环来遍历导入表,并通过导入表模块名称来判断当前遍历是否结束;
char*pName=(pImport->Name+模块内存起始地址);//pName则是对应的模块的名称;
得到模块名称后,则可以去遍历之前存储的info链表,来查找是否存在此模块。如果存在,则获取该模块导入的API函数的名称。}
S304、查找使用的检测多开的API函数:将获取到的API函数在步骤S1的链表中进行匹配查找,找到该程序所使用的用于检测多开的API函数;并将查找到的API函数记录在一个防止多开列表中。
可以理解的是,实际操作时,可以从导入表项结构中获取到导入API的名称来查找之前存储的info链表中该模块是否存在此API函数,如果存在则说明其中的模块存在调用;否则,说明此模块不存在调用了检测多开的API函数。最终,通过查找和记录,可以得到一份防止多开列表,该列表用来记录每个模块有调用哪些检测多开的系统API函数。
进一步地,在上述操作中,是通过枚举每个模块的导入表从而得到了该模块是否有调用一些之前收集的用于检测多开的API函数。然而,此种方式只能够解决一种代码中直接静态调用的情况。而另一种更为隐蔽的情况则是通过动态加载来调用,此种方式则隐蔽很多,导入表中无法找到对应的加载项。因此,这种情况需要另一种方式来检测。对此,作为一种优选的实施方式,步骤S3之后,还包括动态获取模块的加载系统函数的流程,该流程包括:
(1)通过修改程序最先启动的模块的导入表,将自定义的hook模块注入到该程序中,使得该程序一旦启动后,所述hook模块将对当前程序的系统函数GetProcAddress进行hook;通过hook获取到该程序调用的所有系统模块的API函数;
(2)将获取到的API函数在步骤S1的链表中进行匹配查找,找到该程序所使用的用于检测多开的API函数;并将查找到的API函数记录在一个防止多开列表中。
可以理解的是,该优选的实施方式针对更为隐蔽的通过动态加载来调用的情况,通过分析和研究,其必定会调用系统API函数GetProcAddress。此函数原型如下:
FARPROC GetProcAddress(
HMODULE hModule,//DLL模块句柄
LPCSTR lpProcName//函数名
);
此函数可以在程序执行时,实时的获取系统API函数来调用,从而在模块的导入表中则不会有对应的API引入。因此,对于这种情况需要编写一个独立的hook模块并且注入到此程序中。当程序启动后,该hook模块则会对当前程序的系统函数GetProcAddress来进行hook,从而通过hook可以感知到当前程序获取了哪些系统模块的API函数。其中,对于注入的hook模块,需要在程序启动时马上能够注入并且得到执行,因此需要通过修改最先启动的模块的导入表来增加一个导入项,从而保障注入的hook模块能尽早的得到执行。
通过上述动态获取的方式,可以应对实际应用中具有更为隐蔽的情况(通过动态加载来调用的情况),使得本方案的查找更加全面、准确,使用效果更加理想。
S4、采用判断错误消息的方式以及判断窗口函数的方式,在所述防止多开列表中过滤出真正用于检测多开的API调用。
可以理解的是,通过步骤S3已经查找到了某个程序调用了哪些系统API函数来用于检测多开。但是,即使存在例如系统API函数CreateMutex的调用,也并不能判定说其一定是正在用于检测多开的功能。所以,需要采用方法来排除掉非检测多开的调用,而过滤出真正用于检测多开的调用。为此,本实施例提出以下两种方案来实现上述过滤功能。
方案一、采用判断错误消息的方式:对于类似于系统API函数CreateMutex来说,如果其是真正用于检测多开,则是在创建时通过创建后系统返回的错误消息来判断,即GetLastError()==ERROR_ALREADY_EXISTS;如果系统返回的错误消息是ERROR_ALREADY_EXISTS,表明当前系统已经创建了一个同样的程序,那么可检测到存在多开的情况;否则,如果返回的是OK,没有错误,则表明当前不存在同样的程序,则可检测到当前不存在多开。因此,只要查找到的API函数,会在创建时通过创建后系统返回的错误消息来判断程序是否多开,那么该API函数就是真正用于检测多开的API调用。但是,由于方案一对于一些不是通过判断错误的方式来判断多开的API函数不适用,因此,还提出了下述方案二来作为补充过滤手段。
方案二、采用判断窗口函数的方式:对于更通用的检测多开的API函数来说,如果其要检测当前是否存在多开时,若当前程序只有一个实例没有出现多开的情况下,那么则必须获取程序的窗口句柄,设置焦点到该窗口上,否则用户打开程序,程序没有显示出来就是程序bug。因此,可以通过判断程序在调用了查找到的API函数后,后续是否有调用窗口函数——FindWindow(用于查找程序的窗口句柄)和SetForegroundWindow(用于将当前窗口设置为焦点窗口),如果有,则说明当前为真正用于检测多开的API调用;否则,说明当前不是真正用于检测多开的API调用。而更具体地,判断程序在调用了查找到的API函数后,后续是否有调用FindWindow函数和SetForegroundWindow函数时,也有两种实现方式。一种快速的实现方式是:通过之前的静态查找,查找到调用的用于检测多开的API函数后,继续查看后续代码是否有调用FindWindow函数和SetForegroundWindow函数,如果有则说明当前就是检测多开的调用;否则不是。另一种方法则是:通常一般软件程序为了更安全更准确的检测多开,都是对用于检测多开的API函数进行检测保护,防止hook等方式。而上述的FindWindow和SetForegroundWindow则都是和多开撤不上关系的API函数,因此基于对上述API的hook则是比较安全的,通过hook则可以感知到其的调用,那么凡是调用了系统多开检测的API后,又调用了上述的窗口函数则说明当前的代码是在检测多开程序。
进一步地,作为一种优选的实施方式,步骤S4具体包括:
S401、遍历所述防止多开列表中的每个API函数,判断当前API函数是否会在创建时通过创建后系统返回的错误消息来判断程序是否多开,如果是,则判定当前API函数为真正用于检测多开的API调用,转入步骤S403;否则,转入步骤S402;
S402、判断当前API函数后续是否有调用窗口函数FindWindow和SetForegroundWindow,如果有,则判定当前API函数为真正用于检测多开的API调用,转入步骤S403;否则,判定当前API函数不是真正用于检测多开的API调用,转入步骤S403;
S403、继续进行下一API函数的判断,直至遍历完整个防止多开列表。
总的来说,通过上述步骤S1~S4的操作可以看出,本方案会事先收集所有可用于检测多开的API函数及其信息,当需要查找某个程序的防止多开的API调用时,会将该程序调用的所有系统API函数与事先收集的所有可用于检测多开的API函数进行匹配,从而快速查找出该程序具体调用了哪些可用于检测多开的API函数。整个查找过程快速高效,且无需对每个程序都去进行逆向分析来查找各程序的防止多开策略,能节省大量的时间和人力成本。并且,在查找出程序具体调用了哪些可用于检测多开的API函数之后,还会采用多种方式过滤出真正用于检测多开的API调用,从而有效提高了查找结果的准确性及可靠性,满足实际应用需求。
实施例二
基于同一发明构思,如图2所示,本发明第二实施例提供一种快速查找防止多开的系统,其包括:
多开函数获取单元10,其用于获取所有用于检测多开的API函数及其信息,并保存至一个链表中;
程序模块收集单元20,其用于对每个程序的所有可执行模块代码进行收集和检测,形成该程序的模块列表;
多开函数查找单元30,其用于当需要查找某个程序的防止多开的API调用时,获取该程序对应的模块列表;通过枚举该模块列表中每个模块的导入表表项,获取到该程序直接静态调用的所有API函数;将获取到的API函数在所述多开函数获取单元保存的链表中进行匹配查找,并将查找到的API函数记录在一个防止多开列表中;
多开函数过滤单元40,其用于采用判断错误消息的方式以及判断窗口函数的方式,在所述防止多开列表中过滤出真正用于检测多开的API调用。
前述方法实施例中的各种变化方式和具体实例同样适用于本实施例的系统,通过前述方法的详细描述,本领域技术人员可以清楚的知道本实施例中系统的实施方法,所以为了说明书的简洁,在此不再详述。
实施例三
基于同一发明构思,本发明第三实施例提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如本发明任意实施例所提供的一种快速查找防止多开的方法,该方法包括:
获取所有用于检测多开的API函数及其信息,并保存至一个链表中;
对每个程序的所有可执行模块代码进行收集和检测,形成该程序的模块列表;
当需要查找某个程序的防止多开的API调用时,获取该程序对应的模块列表;通过枚举该模块列表中每个模块的导入表表项,获取到该程序直接静态调用的所有API函数;将获取到的API函数在步骤S1的链表中进行匹配查找,并将查找到的API函数记录在一个防止多开列表中;
采用判断错误消息的方式以及判断窗口函数的方式,在所述防止多开列表中过滤出真正用于检测多开的API调用。
本发明实施例的计算机存储介质,可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是但不限于:电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本文件中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、RF等等,或者上述的任意合适的组合。
可以以一种或多种程序设计语言或其组合来编写用于执行本发明操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言,诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络,包括局域网(LAN)或广域网(WAN),连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
实施例四
基于同一发明构思,本发明第四实施例还提供一种电子设备,包括存储器和处理器,存储器上储存有在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现第一实施例中的所有方法步骤或部分方法步骤。
所称处理器可以是中央处理单元(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 (10)
1.一种快速查找防止多开的方法,其特征在于,包括以下步骤:
S1、获取所有用于检测多开的API函数及其信息,并保存至一个链表中;
S2、对每个程序的所有可执行模块代码进行收集和检测,形成该程序的模块列表;
S3、当需要查找某个程序的防止多开的API调用时,获取该程序对应的模块列表;通过枚举该模块列表中每个模块的导入表表项,获取到该程序直接静态调用的所有API函数;将获取到的API函数在步骤S1的链表中进行匹配查找,并将查找到的API函数记录在一个防止多开列表中;
S4、采用判断错误消息的方式以及判断窗口函数的方式,在所述防止多开列表中过滤出真正用于检测多开的API调用。
2.如权利要求1所述的快速查找防止多开的方法,其特征在于,步骤S1采用静态枚举的实现方式,包括以下操作:
根据函数的实现功能,收集所有用于检测多开的API函数;
针对收集的每个用于检测多开的API函数,查看其相关API信息,所述API信息包括API所属的系统模块的名称,以及API的名称或API所属模块的偏移地址;并将所述API信息记录在预先定义好的数据结构Info中;
将每个记录有API信息的Info,存储至一个链表中。
3.如权利要求1所述的快速查找防止多开的方法,其特征在于,步骤S1采用配置化的实现方式,包括以下操作:
获取本地预置的或由服务器平台下发的多开配置文件,所述多开配置文件存储有用于检测多开的API函数及其信息;
定义API信息类,该类中设置有API信息加载方法,用于通过读取所述多开配置文件,获取到用于检测多开的API函数及其信息;该类中还设置有API函数添加方法,用于添加新增的用于检测多开的API函数及其信息;
当获取所有用于检测多开的API函数及其信息时,先定义一个用于存储所有信息的链表;然后依次调用所述API信息加载方法和所述API函数添加方法,将获取到的所有用于检测多开的API函数及其信息,填入到所述链表中。
4.如权利要求3所述的快速查找防止多开的方法,其特征在于:
所述API函数添加方法默认实现为空,表明默认情况下,无需新增新的用于检测多开的API函数及其信息;
当需要添加系统公有API函数时,通过自定义编写API函数添加方法的实现,来完成添加系统公有API函数及其信息,且所添加的公有API函数信息包括该API所属的模块名称以及该API的名称;
当需要添加系统私有API函数时,通过继承所述API信息类并实现API函数添加方法,来完成添加系统私有API函数及其信息,且所添加的私有API函数信息包括API所属的模块名称以及API所属模块的偏移地址。
5.如权利要求3所述的快速查找防止多开的方法,其特征在于,所述多开配置文件包括:该文件的HASH值、该文件存储的系统API函数的总个数,以及按照模块名来划分的各API函数及其信息。
6.如权利要求1所述的快速查找防止多开的方法,其特征在于,步骤S3之后,还包括动态获取模块的加载系统函数的流程,其包括:
通过修改程序最先启动的模块的导入表,将自定义的hook模块注入到该程序中,使得该程序一旦启动后,所述hook模块将对当前程序的系统函数GetProcAddress进行hook;通过hook获取到该程序调用的所有系统模块的API函数;
将获取到的API函数在步骤S1中的链表中进行匹配查找,找到该程序所使用的用于检测多开的API函数;并将查找到的API函数记录在一个防止多开列表中。
7.如权利要求1所述的快速查找防止多开的方法,其特征在于,步骤S4包括以下操作:
遍历所述防止多开列表中的每个API函数,判断当前API函数是否会在创建时通过创建后系统返回的错误消息来判断程序是否多开,如果是,则判定当前API函数为真正用于检测多开的API调用,之后继续进行下一API函数的判断;
否则,判断当前API函数后续是否有调用窗口函数FindWindow和SetForegroundWindow,如果有,则判定当前API函数为真正用于检测多开的API调用,之后继续进行下一API函数的判断;否则,判定当前API函数不是真正用于检测多开的API调用,之后继续进行下一API函数的判断。
8.一种存储介质,其上存储有计算机程序,其特征在于:所述计算机程序被处理器执行时实现权利要求1至7任一项所述的方法。
9.一种电子设备,包括存储器和处理器,存储器上存储有在所述处理器上运行的计算机程序,其特征在于:所述处理器执行所述计算机程序时实现权利要求1至7任一项所述的方法。
10.一种快速查找防止多开的系统,其特征在于,包括:
多开函数获取单元,其用于获取所有用于检测多开的API函数及其信息,并保存至一个链表中;
程序模块收集单元,其用于对每个程序的所有可执行模块代码进行收集和检测,形成该程序的模块列表;
多开函数查找单元,其用于当需要查找某个程序的防止多开的API调用时,获取该程序对应的模块列表;通过枚举该模块列表中每个模块的导入表表项,获取到该程序直接静态调用的所有API函数;将获取到的API函数在所述多开函数获取单元保存的链表中进行匹配查找,并将查找到的API函数记录在一个防止多开列表中;
多开函数过滤单元,其用于采用判断错误消息的方式以及判断窗口函数的方式,在所述防止多开列表中过滤出真正用于检测多开的API调用。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011460265.1A CN112540903B (zh) | 2020-12-11 | 2020-12-11 | 快速查找防止多开的方法、存储介质、电子设备及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011460265.1A CN112540903B (zh) | 2020-12-11 | 2020-12-11 | 快速查找防止多开的方法、存储介质、电子设备及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112540903A true CN112540903A (zh) | 2021-03-23 |
CN112540903B CN112540903B (zh) | 2022-07-05 |
Family
ID=75018431
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011460265.1A Active CN112540903B (zh) | 2020-12-11 | 2020-12-11 | 快速查找防止多开的方法、存储介质、电子设备及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112540903B (zh) |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105589747A (zh) * | 2016-02-25 | 2016-05-18 | 深圳市创想天空科技股份有限公司 | 应用程序多开的控制方法及系统 |
CN105664489A (zh) * | 2015-12-30 | 2016-06-15 | 广州华多网络科技有限公司 | 一种防止游戏外挂的方法及系统 |
CN106528055A (zh) * | 2016-10-31 | 2017-03-22 | 宇龙计算机通信科技(深圳)有限公司 | 应用程序多开的控制方法、装置及移动终端 |
CN106547547A (zh) * | 2016-10-18 | 2017-03-29 | 广州酷狗计算机科技有限公司 | 数据采集方法及装置 |
CN108932427A (zh) * | 2018-05-18 | 2018-12-04 | 华中科技大学 | 一种Android应用多开环境中限制访问的控制方法及系统 |
CN110798468A (zh) * | 2019-10-31 | 2020-02-14 | 福建天晴在线互动科技有限公司 | 一种通过枚举防火墙规则检测虚拟化环境的方法 |
CN111027054A (zh) * | 2019-11-15 | 2020-04-17 | 武汉极意网络科技有限公司 | 基于安卓系统判断应用程序在多开环境中运行方法、系统 |
-
2020
- 2020-12-11 CN CN202011460265.1A patent/CN112540903B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105664489A (zh) * | 2015-12-30 | 2016-06-15 | 广州华多网络科技有限公司 | 一种防止游戏外挂的方法及系统 |
CN105589747A (zh) * | 2016-02-25 | 2016-05-18 | 深圳市创想天空科技股份有限公司 | 应用程序多开的控制方法及系统 |
CN106547547A (zh) * | 2016-10-18 | 2017-03-29 | 广州酷狗计算机科技有限公司 | 数据采集方法及装置 |
CN106528055A (zh) * | 2016-10-31 | 2017-03-22 | 宇龙计算机通信科技(深圳)有限公司 | 应用程序多开的控制方法、装置及移动终端 |
CN108932427A (zh) * | 2018-05-18 | 2018-12-04 | 华中科技大学 | 一种Android应用多开环境中限制访问的控制方法及系统 |
CN110798468A (zh) * | 2019-10-31 | 2020-02-14 | 福建天晴在线互动科技有限公司 | 一种通过枚举防火墙规则检测虚拟化环境的方法 |
CN111027054A (zh) * | 2019-11-15 | 2020-04-17 | 武汉极意网络科技有限公司 | 基于安卓系统判断应用程序在多开环境中运行方法、系统 |
Non-Patent Citations (2)
Title |
---|
网友: "《手游多开检测新招式,阻止手游外挂满天飞》", 《HTTPS://BLOG.CSDN.NET/YIDUNMARKET/ARTICLE/DETAILS/109366701》 * |
网友: "《防止程序多开方法_Canvas的博客-CSDN博客_防多开方法》", 《HTTPS://BLOG.CSDN.NET/YOUR8686/ARTICLE/DETAILS/7071430》 * |
Also Published As
Publication number | Publication date |
---|---|
CN112540903B (zh) | 2022-07-05 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10423474B2 (en) | Performing diagnostic tracing of an executing application to identify suspicious pointer values | |
US9336018B2 (en) | Mechanism for class data sharing using extension and application class-loaders | |
JP2005293578A (ja) | 属性を介して制御されるテストケース継承 | |
CN112733158B (zh) | Android系统漏洞检测方法、电子设备及存储介质 | |
US20160125194A1 (en) | Dynamic service discovery | |
CN109086183B (zh) | 一种应用程序的监控方法、装置、电子设备及存储介质 | |
CN111027054A (zh) | 基于安卓系统判断应用程序在多开环境中运行方法、系统 | |
CN111506500B (zh) | 内存泄露检测方法、装置、电子设备及可读存储介质 | |
CN108279940A (zh) | 一种web容器中的模块加载方法和装置 | |
CN113961919A (zh) | 恶意软件检测方法和装置 | |
CN109032572B (zh) | 一种基于字节码的java程序方法内联的方法 | |
CN112540903B (zh) | 快速查找防止多开的方法、存储介质、电子设备及系统 | |
CN111338831B (zh) | 一种多线程运行性能的处理方法、装置、介质和电子设备 | |
CN110889116A (zh) | 一种广告拦截方法、装置及电子设备 | |
KR20180058579A (ko) | 액티비티 스택에 기반한 테스트 시나리오 생성 방법 | |
CN107562423B (zh) | Ui页面开发方法及装置 | |
CN114936368A (zh) | 一种Java内存木马检测方法、终端设备及存储介质 | |
KR101858594B1 (ko) | 안티리버싱 코드 검출 방법 및 그 장치 | |
CN106897588B (zh) | 一种标签函数的处理方法及装置 | |
CN115659342B (zh) | 一种无害执行pe文件的方法、装置、电子设备及存储介质 | |
CN114490366A (zh) | Flutter内存泄漏的检测方法及装置 | |
CN110879783B (zh) | 一种程序测试方法、装置、设备及存储介质 | |
CN112685305B (zh) | 用户界面性能测试方法及装置、电子设备和可读存储介质 | |
CN107145364B (zh) | 一种Flash跨域访问数据的方法及装置 | |
CN117331838A (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 | ||
EE01 | Entry into force of recordation of patent licensing contract | ||
EE01 | Entry into force of recordation of patent licensing contract |
Application publication date: 20210323 Assignee: Yidu Lehuo Network Technology Co.,Ltd. Assignor: WUHAN DOUYU YULE NETWORK TECHNOLOGY Co.,Ltd. Contract record no.: X2023980041383 Denomination of invention: Quick search for methods, storage media, electronic devices, and systems to prevent excessive opening Granted publication date: 20220705 License type: Common License Record date: 20230908 |