一种标记设备的方法、装置、介质及计算机设备转让专利

申请号 : CN202010067565.7

文献号 : CN110928609B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 周志刚

申请人 : 武汉斗鱼鱼乐网络科技有限公司

摘要 :

本申请提供了一种标记设备的方法、装置、介质及计算机设备,方法包括:预先创建哈希算法类的抽象基类;在抽象基类中创建抽象接口;将链式指针传入抽象基类中;当需要获取目标隐藏驱动信息时,加载系统的内核文件及动态链接库文件,获得至少一个目标API函数;获取至少一个目标API函数对应的API接口,利用API接口调用对应的目标API函数,获得至少一个目标隐藏驱动信息;将至少一个目标隐藏驱动信息的实例句柄传入所述抽象基类中,基于抽象基类中的链式指针调用对应哈希算法类中的哈希算法,利用各哈希算法计算至少一个目标隐藏驱动信息的目标哈希值;以使得服务器利用目标哈希值标记所述目标隐藏驱动信息所在的设备。

权利要求 :

1.一种标记设备的方法,其特征在于,所述方法包括:

预先创建哈希算法类的抽象基类;

将链式指针传入所述抽象基类中,以使得所述抽象基类基于所述链式指针对驱动信息进行链式哈希运算;

在所述抽象基类中创建抽象接口,以使得预先创建的哈希算法类通过所述抽象接口继承所述抽象基类;

当需要获取目标隐藏驱动信息时,加载系统的内核文件及动态链接库文件,获得至少一个目标API函数;

获取所述至少一个目标API函数对应的API接口,利用所述API接口调用对应的目标API函数,获得至少一个目标隐藏驱动信息;

将所述至少一个目标隐藏驱动信息的实例句柄传入所述抽象基类中,基于所述抽象基类中的链式指针调用对应哈希算法类中的哈希算法,利用各所述哈希算法计算所述至少一个目标隐藏驱动信息的目标哈希值;以使得服务器利用所述目标哈希值标记所述目标隐藏驱动信息所在的设备。

2.如权利要求1所述的方法,其特征在于,所述抽象基类中预先创建有回调接口,当基于所述抽象基类中的链式指针调用对应哈希算法类中的哈希算法,利用各所述哈希算法计算所述至少一个目标隐藏驱动信息的目标哈希值后,方法还包括:利用所述回调接口调用所述至少一个目标隐藏驱动信息的名称或路径,将所述至少一个目标隐藏驱动信息的名称或路径发送至应用层。

3.如权利要求1所述的方法,其特征在于,所述获取所述至少一个目标API函数对应的API接口,利用所述API接口调用对应的目标API函数,获得至少一个目标隐藏驱动信息时,方法还包括:获取系统分配的内存空间对应的空间变量;

判断所述空间变量是否为空,若所述空间变量不为空,则释放所述内存空间,并将所述内存空间的指针赋值为空;

按照预设的空间内存增量递增所述内存空间,每次增大所述内存空间后,利用递增后的内存空间调用所述目标API函数;

判断所述目标API函数是否被调用成功,若所述目标API函数被调用成功,则确定增大后的所述内存空间足够。

4.如权利要求1所述的方法,其特征在于,所述获取所述至少一个目标API函数对应的API接口,利用所述API接口调用对应的目标API函数,获得至少一个目标隐藏驱动信息后,方法还包括:将所述至少一个目标隐藏驱动信息存储在预设的存储变量中;

遍历所述存储变量,获取所述至少一个目标隐藏驱动信息的占用内存及所述至少一个目标隐藏驱动信息的名称。

5.如权利要求1所述的方法,其特征在于,所述基于所述抽象基类中的链式指针调用对应哈希算法类中的哈希算法,利用各所述哈希算法计算所述至少一个目标隐藏驱动信息的目标哈希值,包括:预先确定各哈希算法的等级,获得不同等级的哈希算法组;每个等级的哈希算法组中至少包括一个对应等级的哈希算法,每个所述哈希算法组中的哈希算法具有预设的编号,所述哈希算法的等级与所述哈希算法的复杂度为正比;

确定所述抽象基类中链式指针的调用策略,基于所述链式指针的调用策略顺序调用对应等级哈希算法组的哈希算法;

根据所述对应等级哈希算法组的当前哈希算法确定出当前哈希值,并将所述当前哈希值作为当前哈希算法的下一哈希算法的运算参数;

利用所述下一哈希算法对所述运算参数进行哈希运算,获取所述至少一个目标隐藏驱动信息的目标哈希值。

6.如权利要求5所述的方法,其特征在于,所述确定所述抽象基类中链式指针的调用策略,包括:获取所述目标隐藏驱动信息的哈希名称长度;

若所述目标隐藏驱动信息的哈希名称长度小于A,则确定所述链式指针的调用策略为调用不同等级的哈希算法;

若所述目标隐藏驱动信息的哈希名称长度大于A,则确定所述链式指针的调用策略为调用同一等级的哈希算法;其中,50bytes 

7.如权利要求5所述的方法,其特征在于,所述确定所述抽象基类中链式指针的调用策略后,包括:根据F= MD5(initial + time)确定待调用的哈希算法的编号F,所述initial为预设的初始值,所述initial的值根据待计算的目标隐藏驱动信息的哈希名称长度确定,所述time为预设的时间戳。

8.一种标记设备的装置,其特征在于,所述装置包括:

创建单元,用于预先创建哈希算法类的抽象基类;

在所述抽象基类中创建抽象接口,以使得预先创建的哈希算法类通过所述抽象接口继承所述抽象基类;

传入单元,用于将链式指针传入所述抽象基类中,以使得所述抽象基类基于所述链式指针对驱动信息进行链式哈希运算;

加载单元,用于当需要获取目标隐藏驱动信息时,加载系统的内核文件及动态链接库文件,获得至少一个目标API函数;

调用单元,用于获取所述至少一个目标API函数对应的API接口,利用所述API接口调用对应的目标API函数,获得至少一个目标隐藏驱动信息;

将所述至少一个目标隐藏驱动信息的实例句柄传入所述抽象基类中,基于所述抽象基类中的链式指针调用对应哈希算法类中的哈希算法,利用各所述哈希算法计算所述至少一个目标隐藏驱动信息的目标哈希值;以使得服务器利用所述目标哈希值标记所述目标隐藏驱动信息所在的设备。

9.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现权利要求1至7任一项所述的方法。

10.一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现权利要求1至7任一项所述的方法。

说明书 :

一种标记设备的方法、装置、介质及计算机设备

技术领域

[0001] 本申请涉及软件开发技术领域,尤其涉及一种标记设备的方法、装置、介质及计算机设备。

背景技术

[0002] 设备在运行时,为了可以对设备进行追踪、定位,通常需要对设备进行标记。
[0003] 并且设备标记在不同的场景应用中可以提供不同的功能(比如在游戏应用中,可以将设备标记与用户的登录账号进行关联,来确定用户玩过的游戏,当用户在游戏A中采取不正当操作时,那么可以在游戏B中重点监测该用户)。
[0004] 现有技术中一般是利用互联网协议(IP,Internet Protocol Address)地址或者媒体访问控制(MAC,Medium Access Control)地址对设备进行标记,但是现有技术设置的设备标记容易被非正常用户篡改,导致设备标记失效,进而无法追踪到该设备中的数据。

发明内容

[0005] 针对现有技术存在的问题,本申请实施例提供了一种标记设备的方法、装置、介质及计算机设备,用于解决现有技术中对设备进行标记时,设备标记容易被非正常用户篡改,导致设备标记失效,进而导致无法追踪到设备中的数据的技术问题。
[0006] 本申请提供一种标记设备的方法,所述方法包括:
[0007] 预先创建哈希算法类的抽象基类;
[0008] 将链式指针传入所述抽象基类中,以使得所述抽象基类基于所述链式指针对驱动信息进行链式哈希运算;
[0009] 在所述抽象基类中创建抽象接口,以使得预先创建的哈希算法类通过所述抽象接口继承所述抽象基类;
[0010] 当需要获取目标隐藏驱动信息时,加载系统的内核文件及动态链接库文件,获得至少一个目标应用程序编程接口函数(API,Application Programming Interface);
[0011] 获取所述至少一个目标API函数对应的API接口,利用所述API接口调用对应的目标API函数,获得至少一个目标隐藏驱动信息;
[0012] 将所述至少一个目标隐藏驱动信息的实例句柄传入所述抽象基类中,基于所述抽象基类中的链式指针调用对应哈希算法类中的哈希算法,利用各所述哈希算法计算所述至少一个目标隐藏驱动信息的目标哈希值;以使得服务器利用所述目标哈希值标记所述目标隐藏驱动信息所在的设备。
[0013] 可选地,所述抽象基类中预先创建有回调接口,当基于所述抽象基类中的链式指针调用对应哈希算法类中的哈希算法,利用各所述哈希算法计算所述至少一个目标隐藏驱动信息的目标哈希值后,方法还包括:
[0014] 利用所述回调接口调用所述至少一个目标隐藏驱动信息的名称或路径,将所述至少一个目标隐藏驱动信息的名称或路径发送至应用层。
[0015] 可选地,所述获取所述至少一个目标API函数对应的API接口,利用所述API接口调用对应的目标API函数,获得至少一个目标隐藏驱动信息时,方法还包括:
[0016] 获取系统分配的内存空间对应的空间变量;
[0017] 判断所述空间变量是否为空,若所述空间变量不为空,则释放所述内存空间,并将所述内存空间的指针赋值为空;
[0018] 按照预设的空间内存增量递增所述内存空间,每次增大所述内存空间后,利用递增后的内存空间调用所述目标API函数;
[0019] 判断所述目标API函数是否被调用成功,若所述目标API函数被调用成功,则确定增大后的所述内存空间足够。
[0020] 可选地,所述获取所述至少一个目标API函数对应的API接口,利用所述API接口调用对应的目标API函数,获得至少一个目标隐藏驱动信息后,方法还包括:
[0021] 将所述至少一个目标隐藏驱动信息存储在预设的存储变量中;
[0022] 遍历所述存储变量,获取所述至少一个目标隐藏驱动信息的占用内存及所述至少一个目标隐藏驱动信息的名称。
[0023] 可选地,所述基于所述抽象基类中的链式指针调用对应哈希算法类中的哈希算法,利用各所述哈希算法计算所述至少一个目标隐藏驱动信息的目标哈希值,包括:
[0024] 预先确定各哈希算法的等级,获得不同等级的哈希算法组;每个等级的哈希算法组中至少包括一个对应等级的哈希算法,每个所述哈希算法组中的哈希算法具有预设的编号,所述哈希算法的等级与所述哈希算法的复杂度为正比;
[0025] 确定所述抽象基类中链式指针的调用策略,基于所述链式指针的调用策略顺序调用对应等级哈希算法组的哈希算法;
[0026] 根据所述对应等级哈希算法组的当前哈希算法确定出当前哈希值,并将所述当前哈希值作为当前哈希算法的下一哈希算法的运算参数;
[0027] 利用所述下一哈希算法对所述运算参数进行哈希运算,获取所述至少一个目标隐藏驱动信息的目标哈希值。
[0028] 可选地,所述确定所述抽象基类中链式指针的调用策略,包括:
[0029] 获取所述目标隐藏驱动信息的哈希名称长度;
[0030] 若所述目标隐藏驱动信息的哈希名称长度小于A,则确定所述链式指针的调用策略为调用不同等级的哈希算法;
[0031] 若所述目标隐藏驱动信息的哈希名称长度大于A,则确定所述链式指针的调用策略为调用同一等级的哈希算法;其中,所述50 byte 
[0032] 可选地,所述确定所述抽象基类中链式指针的调用策略后,包括:
[0033] 根据F= MD5(initial + time)确定待调用的哈希算法的编号F,所述initial为预设的初始值,所述initial的值根据待计算的目标隐藏驱动信息的哈希名称长度确定,所述time为预设的时间戳。
[0034] 本申请还提供一种标记设备的装置,所述装置包括:
[0035] 创建单元,用于预先创建哈希算法类的抽象基类;
[0036] 在所述抽象基类中创建抽象接口,以使得预先创建的哈希算法类通过所述抽象接口继承所述抽象基类;
[0037] 传入单元,用于将链式指针传入所述抽象基类中,以使得所述抽象基类基于所述链式指针对驱动信息进行链式哈希运算;
[0038] 加载单元,用于当需要获取目标隐藏驱动信息时,加载系统的内核文件及动态链接库文件,获得至少一个目标API函数;
[0039] 调用单元,用于获取所述至少一个目标API函数对应的API接口,利用所述API接口调用对应的目标API函数,获得至少一个目标隐藏驱动信息;
[0040] 将所述至少一个目标隐藏驱动信息的实例句柄传入所述抽象基类中,基于所述抽象基类中的链式指针调用对应哈希算法类中的哈希算法,利用各所述哈希算法计算所述至少一个目标隐藏驱动信息的目标哈希值;以使得服务器利用所述目标哈希值标记所述目标隐藏驱动信息所在的设备。
[0041] 本申请还提供一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现上述任一项所述的方法。
[0042] 本申请还提供一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现上述任一项所述的方法。
[0043] 本申请提供了一种标记设备的方法、装置、介质及计算机设备,方法包括:预先创建哈希算法类的抽象基类;在所述抽象基类中创建抽象接口,以使得预设的哈希算法类通过所述抽象接口继承所述抽象基类;将链式指针传入所述抽象基类中,以使得所述抽象基类基于所述链式指针对驱动信息进行链式哈希运算;当需要获取目标隐藏驱动信息时,加载系统的内核文件及动态链接库文件,获得至少一个目标API函数;获取所述至少一个目标API函数对应的API接口,利用所述API接口调用对应的目标API函数,获得至少一个目标隐藏驱动信息;将所述至少一个目标隐藏驱动信息的实例句柄传入所述抽象基类中,基于所述抽象基类中的链式指针调用对应哈希算法类中的哈希算法,利用各所述哈希算法计算所述至少一个目标隐藏驱动信息的目标哈希值,以使得服务器利用所述目标哈希值标记所述目标隐藏驱动信息所在的设备;如此,本申请可以利用目标API函数获取到目标隐藏驱动信息,并且利用链式指针调用对应哈希算法类中的哈希算法对目标隐藏驱动信息进行哈希计算,获取相应的哈希值,这样将哈希值上报至服务器,服务器可利用哈希值对设备进行标记;本申请利用隐藏驱动信息的哈希值对设备进行标记,可以提高设备标记的隐蔽性,避免被非正常用户篡改,进而确保可以正常追踪到设备中的所需的数据;并且,本申请利用链式指针调用对应的哈希算法类进行哈希计算,计算过程复杂多变,得出的哈希值复杂度高,进而可以提高破解难度。

附图说明

[0044] 图1为本申请实施例一提供的标记设备的方法流程示意图;
[0045] 图2为本申请实施例二提供的标记设备的装置结构示意图;
[0046] 图3为本申请实施例三提供的标记设备的计算机设备结构示意图;
[0047] 图4为本申请实施例四提供的标记设备的计算机介质结构示意图。

具体实施方式

[0048] 为了解决现有技术中设置的设备标记容易被非正常用户篡改,导致设备标记失效,进而无法追踪到该设备中的数据的技术问题,本申请提供一种标记设备的方法、装置、介质及计算机设备。
[0049] 下面通过附图及具体实施例对本申请的技术方案做进一步的详细说明。
[0050] 实施例一
[0051] 本实施例提供一种标记设备的方法,如图1所示,所述方法包括:
[0052] S110,预先创建哈希算法类的抽象基类,将链式指针传入所述抽象基类中,在所述抽象基类中创建抽象接口;
[0053] 本申请中的抽象基类用于提供调用哈希算法的方法及接口,那么则需要预先创建哈希算法类的抽象基类。抽象基类中还提供了各个接口的接口规范。
[0054] 抽象基类创建好之后,将链式指针传入所述抽象基类中,以使得所述抽象基类基于所述链式指针对驱动信息的哈希名称进行链式哈希运算。
[0055] 创建哈希算法类,为了使得哈希算法类可以通过所述抽象接口继承所述抽象基类,进而可以实现真正的哈希算法运算,抽象基类创建好之后,需要在抽象基类中创建抽象接口。
[0056] 这里,创建抽象基类、将链式指针传入所述抽象基类、在抽象基类中创建抽象接口及回调接口的程序实现方式如下:
[0057] Class HashBase{
[0058] Public:
[0059] HashBase(HashBase* hash):m_hash(hash);传入链式指针
[0060] Virtual Std::string imp_Hash(BYTE* pData, int nDataLen) = 0;创建抽象接口
[0061] Virutal void Hash_Event(string *devpath) = 0;创建回调接口[0062] Std::string Hash(BYTE* pData, int nDataLen);创建调用接口[0063] Return imp_Hash(pData, nDataLen);封装调用接口
[0064] protected:
[0065]     HashBase*m_hash;存储链式指针
[0066] }
[0067] 其中,HashBase为抽象基类的名称,调用接口用于调用对应的哈希算法进行哈希计算,调用接口中包含:数据指针、数据长度及结果返回值string,数据指针用于获取对应哈希算法类的哈希算法,结果返回值为计算出的目标哈希值;这里,因哈希算法可能包括多个,因此可以利用数据指针用于方便获取对应的哈希算法。
[0068] 这里,调用接口创建之后,可以对调用接口进行封装。其中,对调用接口进行封装是为了便于后续的功能扩展和组合,比如:若需要对多个哈希算法的计算日志进行日志打印时,可以将多个哈希算法计算过程的日志打印统一封装到调用接口中,同时打印,无需单独对每个哈希算法的计算日志进行一一打印。
[0069] 若获取到目标哈希值后,为了方便应用层可以获取到底层数据并对其进行处理,在抽象基类中还创建有回调接口,回调接口用于调用相应的底层数据(比如驱动信息的名称或路径),并将底层数据发送至应用层。
[0070] 进一步地,因哈希算法包括多种,在创建哈希算法类时,需要为不同的哈希算法分别建立对应的哈希算法类,每个哈希算法类均继承抽象基类。具体实现如下:
[0071] 首先创建用于调用抽象基类的构造函数;
[0072] 利用抽象接口获取驱动信息的哈希名称;
[0073] 调用对应的哈希算法计算驱动信息哈希名称的哈希值;
[0074] 将哈希值赋值给预先定义的结果变量。
[0075] 由于本申请可以采用链式调用的方式,所以将哈希值赋值给预先定义的结果变量后,判断当前的链式指针是否存在,若存在,则根据链式指针调用对应的哈希算法对哈希值进行再次哈希运算,再返回运算的结果。
[0076] 返回运算的结果后,可以触发回调接口调用该驱动信息的驱动路径或驱动名称,将该驱动信息的驱动路径或驱动名称发送至应用层,应用层可以打印驱动日志,在软件开发中显示驱动日志,方便开发过程中的错误定位。
[0077] 比如:哈希算法为Md5哈希算法时,创建Md5哈希算法对应的哈希算法类程序实现如下:
[0078] class Md5HASH : public HashBase{
[0079] Md5HASH (HashBase* hash):HashBase(hash);用于调用抽象基类的构造函数[0080] Std::string imp_Hash(BYTE* pData1, int nDataLen){
[0081] Std::string result; 定义计算结果变量
[0082] Result = MD5.Create(pData1, nDataLen);利用MD5哈希算法来计算HASH值[0083] If (m_hash){
[0084] Return m_hash(pData1 + result.data(), nDataLe + result.length());如果存在链式指针,则将原始数据和hash结果进行叠加的链式计算
[0085] }
[0086] return result;返回链式计算的结果
[0087] }
[0088] void Hash_Event(string *devpath) {
[0089] }
[0090] }
[0091] 其中,Std::string imp_Hash(BYTE* pData1, int nDataLen)为调用MD5哈希算法类中的哈希算法,pData1为MD5哈希算法类的指针。void Hash_Event(string *devpath)为利用回调接口调用驱动路径。
[0092] 其他类型的哈希算法对应的哈希算法类的程序实现与Md5哈希算法对应的哈希算法类程序实现相同,唯一不同的是,在计算哈希值时,是利用对应类型的哈希算法进行计算的,故而不再赘述。
[0093] S111,当需要获取目标隐藏驱动信息时,加载系统的内核文件及动态链接库文件,获得至少一个目标API函数;
[0094] 上述抽象基类及哈希算法类创建好之后,当需要获取目标隐藏驱动信息时,预先利用系统提供的文档确定目标隐藏驱动信息对应的目标API函数,加载系统的内核文件ntdll.dll及动态链接库文件kernel32.dll,获得至少一个目标API函数。其中,隐藏驱动信息可以理解为系统中非正常的驱动信息,每个API函数可以获取一个目标隐藏驱动信息,因目标隐藏驱动信息可能包括一个或多个,因此需要获取少一个目标API函数。
[0095] 这里,加载系统的内核文件ntdll.dll及动态链接库文件kernel32.dll的程序实现如下:
[0096] HMODULE hNtDll = ::LoadLibrary(“ntdll.dll”);
[0097] HMODULE hKernel32 = ::LoadLibrary(“kernel32.dll”);
[0098] S112,获取所述至少一个目标API函数对应的API接口,利用所述API接口调用对应的目标API函数,获得至少一个目标隐藏驱动信息;
[0099] 获取到至少一个目标API函数后,需要获取至少一个目标API函数对应的API接口,以能利用所述API接口调用对应的目标API函数,获得至少一个目标隐藏驱动信息。
[0100] 其中,获取至少一个目标API函数对应的API接口的程序实现如下:
[0101] pfnZwQuerySystemInformation =
[0102] GetProcAddress(hNtDll, “ZwQuerySystemInformation”)
[0103] S113,将所述至少一个目标隐藏驱动信息的实例句柄传入所述抽象基类中,基于所述抽象基类中的链式指针调用对应哈希算法类中的哈希算法,利用各所述哈希算法计算所述至少一个目标隐藏驱动信息的目标哈希值。
[0104] 获取到目标隐藏驱动信息后,将所述至少一个目标隐藏驱动信息的实例句柄传入所述抽象基类中,基于所述抽象基类中的链式指针调用对应哈希算法类中的哈希算法,利用各所述哈希算法计算所述至少一个目标隐藏驱动信息的目标哈希值。其中,将实例句柄传入抽象基类中计算驱动信息的哈希值不会改变驱动模块本身的代码功能,并且可以利用链式指针可以对不同的哈希算法进行叠加、组合,使得计算出的哈希结果值更具有隐蔽性。
[0105] 这里,在获取驱动信息时,需要为驱动信息分配足够的内存空间,但是因系统并未提前告知需要分配多大的内存空间,而当内存空间不足时会导致调用失败,内存空间太大又会造成资源浪费。因此,作为一种可选的实施例,获取所述至少一个目标API函数对应的API接口,利用所述API接口调用对应的目标API函数,获得至少一个目标隐藏驱动信息时,方法还包括:
[0106] 获取系统分配的内存空间对应的空间变量;
[0107] 判断所述空间变量是否为空,若所述空间变量不为空,说明当前分配的内存空间不够,则释放所述内存空间,并将所述内存空间的指针赋值为空;
[0108] 按照预设的空间内存增量递增所述内存空间,每次增大所述内存空间后,利用递增后的内存空间调用所述目标API函数;内存增量可以为1024字节;
[0109] 在 每 次 增 大 所 述 内 存 空 间 后 ,均 要 调 用 系 统 的 判 断 函 数pfnZwQuerySystemInformation判断所述目标API函数是否被调用成功,若所述目标API函数被调用成功,则确定增大后的所述内存空间足够。
[0110] 这里,内存增量可以为1024字节时正好是一个内存页面的大小,方便系统的内存管理。
[0111] 相应地,上述内存空间的分配对应的程序实现如下:
[0112] do{   if (pbyDriverListBuf){首先判断分配的空间变量是否不为空[0113]       Free(pbyDriverListBuf); 如果不为空则释放掉之前分配的空间[0114]       pbyDriverListBuf = NULL;}释放后将指针赋值为空
[0115]       ulLen += 0x1024; 每一次将分配的空间增加1024个字节
[0116]       pbyDriverListBuf = (BYTE*)Malloc(ulLen); 然后重新分配内存空间[0117] }
[0118] 内存空间分配完成后,利用判断函数pfnZwQuerySystemInformation判断所述目标API函数是否被调用成功的程序实现如下:
[0119] while(pfnZwQuerySystemInformation(SystemModuleInformation, pbyDriverListBuf, ulLen, &ulLen) == STATUS_INFO_LENGTH_MISMATCH);
[0120] 确定出内存空间,获得至少一个目标隐藏驱动信息后,将获取到的至少一个隐藏驱动信息存储至内存空间中的变量pbyDriverListBuf中,程序实现如下:
[0121] pfnZwQuerySystemInformation(SystemModuleInformation, pbyDriverListBuf, ulLen, &ulLen);
[0122] 其中,变量pbyDriverListBuf中存储有已获取到的目标隐藏驱动信息的总数量,那么可以利用Int DriverNum = *(DWORD*)pbyDriverListBuf;来获取到变量中所有隐藏驱动信息的数量Int DriverNum。
[0123] 获取到所有隐藏驱动信息的数量后,作为一种可选的实施例,遍历所述存储变量,获取所述至少一个目标隐藏驱动信息的占用内存及所述至少一个目标隐藏驱动信息的名称。遍历存储变量的程序实现如下:
[0124] for (Index = 0; Index < DriverNum ; Index++){从0开始遍历[0125] pstSysModuleInfo->Modules[Index].ImageSize;获取驱动信息的占用内存[0126] char*pszDriverName=(char*)(pstSysModuleInfo->Modules[Index].FullPathName+pstSysModuleInfo->Modules[Index].OffsetToFileName);获取第一个驱动信息的名称,其中pszDriverName是驱动信息的名称
[0127] }
[0128] 并且,由于本申请中在获取到驱动信息的名称或路径后,为了使得驱动层得知该驱动信息,做出相应的处理,方法还包括:
[0129] 利用所述回调接口调用至少一个目标隐藏驱动信息的名称或路径,将所述至少一个目标隐藏驱动信息的名称或路径发送至应用层。
[0130] 应用层获取到目标隐藏驱动信息的名称或路径后,可以打印驱动日志,也可以判断该驱动信息是否对系统存在安全隐患等相应的处理。
[0131] 获取到目标隐藏驱动信息后,作为一种可选的实施例,所述基于所述抽象基类中的链式指针调用对应哈希算法类中的哈希算法,利用各所述哈希算法计算所述至少一个目标隐藏驱动信息的目标哈希值,包括:
[0132] 预先确定各哈希算法的等级,获得不同等级的哈希算法组;每个等级的哈希算法组中至少包括一个对应等级的哈希算法,每个所述哈希算法组中的哈希算法具有预设的编号,所述哈希算法的等级与所述哈希算法的复杂度为正比;
[0133] 比如,第一等级哈希算法组中包括:编号1哈希算法、编号2哈希算法等;第二等级哈希算法组中包括编号1哈希算法、编号2哈希算法等;但第一等级哈希算法组中包括的编号1哈希算法与第二等级哈希算法组中包括的编号1哈希算法是不同的哈希算法。
[0134] 确定所述抽象基类中链式指针的调用策略,基于所述链式指针的调用策略顺序调用对应等级哈希算法组的哈希算法;
[0135] 根据所述对应等级哈希算法组的当前哈希算法确定出当前哈希值,并将所述当前哈希值作为当前哈希算法的下一哈希算法的运算参数;
[0136] 利用所述下一哈希算法对所述运算参数进行哈希运算,获取所述至少一个目标隐藏驱动信息的目标哈希值。
[0137] 这里,哈希算法有很多种,每种哈希算法本身的复杂度是不一样的,因此本申请可以根据哈希算法本身的复杂度确定相应的等级,比如哈希算法包括A F,A和B的复杂度为一~般,C和D的复杂度为较复杂,E和F的复杂度为非常复杂;那么哈希算法A和B可以为第一等级的哈希算法组,哈希算法C和D可以为第二等级的哈希算法组,哈希算法E和F可以为第三等级的哈希算法组。
[0138] 而所述确定所述抽象基类中链式指针的调用策略,包括:
[0139] 获取所述目标隐藏驱动信息哈希名称的长度;
[0140] 若所述目标隐藏驱动信息哈希名称的长度小于A,则确定所述链式指针的调用策略为调用不同等级的哈希算法;
[0141] 若所述目标隐藏驱动信息哈希名称的长度大于A,则确定所述链式指针的调用策略为调用同一等级的哈希算法;其中,所述50 byte 
[0142] 举例来说,若目标隐藏驱动信息哈希名称长度为10 byte,长度较短,为了增加其最终结果的隐蔽性,那么需要利用较为复杂的调用策略进行哈希运算。这时可以调用不同等级的哈希算法进行运算。比如,调用策略中的运算次数为3次,那么第一次哈希运算可以利用第一等级的哈希算法组中的哈希算法进行运算,第二次哈希运算可以利用第二等级的哈希算法组中的哈希算法进行运算,第三次哈希运算可以利用第三等级的哈希算法组中的哈希算法进行运算。
[0143] 若目标隐藏驱动信息哈希名称长度为80 byte,可以利用普通的调用策略进行哈希运算。这时可以调用同一等级的哈希算法进行运算。比如,调用策略中的运算次数为2次,那么第一次哈希运算可以利用第一等级的哈希算法组中第一编号的哈希算法进行运算,第二次哈希运算可以利用第一等级的哈希算法组中第二编号的哈希算法进行运算。
[0144] 这里,第二次哈希运算的运算参数是第一次的哈希结果值,第三次哈希运算的运算参数是第二次的哈希结果值。
[0145] 举例来说,若目标隐藏驱动信息哈希名称长度为80 byte,第一编号的哈希算法为MD5哈希算法,第二编号的哈希算法为SHA哈希算法,那么链式指针为HashBase* phash,调用Stl::string result = pHash->Hash();来实现运算过程:
[0146] HashBase* phashMd5 = new Md5HASH();第一编号的哈希算法的运算[0147] HashBase* phashSha = new ShaHASH(phashMd5 );第二编号的哈希算法的运算[0148] 可以看出,在进行SHA的哈希算法的运算时,运算参数是phashMd5,即Md5的哈希运算的结果值。
[0149] 即使后续有新的哈希算法NewHASH,也可以通过同样的方式进行叠加运算:
[0150] HashBase* phashNew = new NewHASH();
[0151] HashBase* phashMd5 = new Md5HASH(phashNew );
[0152] HashBase* phashSha = new ShaHASH(phashMd5 );
[0153] 这样的调用方式即使增加新的哈希算法,也无需更改底层框架代码。
[0154] 而在实际运算中,每次待调用的哈希算法的编号是可以根据公式(1)预先确定的:
[0155] F= MD5(initial + time)               (1)
[0156] 在公式(1)中,F为待调用的哈希算法的编号,所述initial为预设的初始值,所述initial的值根据待计算的目标隐藏驱动信息的哈希名称长度确定,所述time为预设的时间戳。
[0157] 比如,在实际运算中F值为246,若调用策略为同一等级哈希算法的调用时,那么在同一等级的哈希算法组中,第一次调用的是编号为2的哈希算法,第二次调用的是编号为4的哈希算法,第三次调用的是编号为6的哈希算法,逐次进行哈希运算。
[0158] 若调用策略为不同等级哈希算法的调用时,第一次调用的是第一等级哈希算法组中编号为2的哈希算法,第二次调用的是第二等级哈希算法组中编号为 4的哈希算法,第三次调用的是第三等级哈希算法组中编号为6的哈希算法,逐次进行哈希运算。
[0159] 需要说明的是,每次在进行当前次的哈希运算时,可以将预设的时间戳与当前次的上一次的哈希结果值共同作为运算参数,来进行当前次的哈希运算,这样可以根据时间戳追溯到每次的哈希运算结果。
[0160] 这样,在不影响驱动信息模块的原始代码功能的基础上,可以进行多次哈希运算,提高了最终的目标哈希值的隐蔽性,避免被非正常用户篡改。
[0161] 目标哈希值计算出之后,上报至服务器,以使得服务器利用所述目标哈希值标记所述目标隐藏驱动信息所在的设备。
[0162] 具体地,服务器接收到目标哈希值后,可以利用目标哈希值标记目标隐藏驱动信息所在的设备,可以提高设备标记的隐蔽性,避免被非正常用户篡改,进而确保可以正常追踪到设备中的所需的数据;并且,本申请利用链式指针调用对应的哈希算法类进行哈希计算,计算过程复杂多变,得出的哈希值复杂度高,进而提高破解难度。
[0163] 进一步地,因设备标记是根据隐藏驱动信息确定的,那么服务器还可以根据标记来确定该设备中是否存在非正常驱动信息,若存在非正常驱动信息,且用户在该台设备上利用目标隐藏驱动信息对应的驱动程序继续操作时,驱动程序必然需要向服务器请求数据,那么服务器可以确定出该用户为非正常用户,进而可以对该用户进行相应的处理,以确保平台收益及系统运行安全。
[0164] 比如,当某个用户利用当前设备进行游戏,服务器根据该设备的标记确定该台设备中装有目标隐藏驱动信息,那么即使非正常用户更换了账号,只要该用户使用了目标隐藏驱动信息对应的驱动程序,服务器依然可以确定当前用户为非正常用户,会根据预设的处理策略对非正常用户进行相应处理。
[0165] 进一步地,确定出非正常用户后,因服务器会接收到很多设备上报的隐藏驱动信息的哈希值,那么服务器还可以对其他用户进行检测,具体为:
[0166] 遍历接收到的所有隐藏驱动信息的哈希值,基于非正常用户对应的目标哈希值对所有哈希值进行一一比较;
[0167] 若确定存在与非正常用户对应的目标哈希值相同的当前哈希值,则确定当前哈希值对应的用户为疑似非正常用户。
[0168] 这样,服务器还可预测出疑似非正常用户,进而对这些疑似非正常用户进行重点监测。
[0169] 基于同样的发明构思,本申请还提供一种标记设备的装置,详见实施例二。
[0170] 实施例二
[0171] 本实施例提供一种标记设备的装置,如图2所示,装置包括:创建单元21、传入单元22、加载单元23、调用单元24;其中,
[0172] 本申请中的抽象基类用于提供调用哈希算法的方法及接口,创建单元21需要预先创建哈希算法类的抽象基类。抽象基类中还提供了各个接口的接口规范。
[0173] 抽象基类创建好之后,传入单元22将链式指针传入所述抽象基类中,以使得所述抽象基类基于所述链式指针对驱动信息的哈希名称进行链式哈希运算。
[0174] 创建单元21还需创建哈希算法类,为了使得哈希算法类可以通过所述抽象接口继承所述抽象基类,进而可以实现真正的哈希算法运算,抽象基类创建好之后,需要在抽象基类中创建抽象接口。
[0175] 这里,创建单元21创建抽象基类、在抽象基类中创建抽象接口,传入单元22将链式指针传入所述抽象基类的程序实现如下:
[0176] Class HashBase{ HashBase
[0177] Public:
[0178] HashBase(HashBase* hash):m_hash(hash)传入链式指针
[0179] Virtual Std::string imp_Hash(BYTE* pData, int nDataLen) = 0;创建抽象接口Virutal void Hash_Event(string *devpath) = 0;创建回调接口
[0180] Std::string Hash(BYTE* pData, int nDataLen);创建调用接口[0181] Return imp_Hash(pData, nDataLen);封装调用接口
[0182] protected:
[0183]     HashBase*m_hash;存储链式指针
[0184] }
[0185] 其中,HashBase为抽象基类的名称,调用接口用于调用对应的哈希算法进行哈希计算,调用接口中包含:数据指针、数据长度及结果返回值string,数据指针用于获取对应哈希算法类的哈希算法,结果返回值为计算出的目标哈希值。这里,因哈希算法可能包括多个,因此可以利用数据指针用于方便获取对应的哈希算法。
[0186] 这里,调用接口创建之后,可以对调用接口进行封装。对调用接口进行封装是为了便于后续的功能扩展和组合,比如:若需要对多个哈希算法的计算日志进行日志打印时,可以将多个哈希算法计算过程的日志打印统一封装到调用接口中,同时打印,无需单独对每个哈希算法的计算日志进行一一打印。
[0187] 若获取到目标哈希值后,为了方便应用层可以获取到底层数据并对其进行处理,在抽象基类中还创建有回调接口,回调接口用于调用相应的底层数据(比如驱动信息的名称或路径),并将底层数据发送至应用层。
[0188] 进一步地,因哈希算法包括多种,创建单元21在创建哈希算法类时,需要为不同的哈希算法分别建立对应的哈希算法类,每个哈希算法类均继承抽象基类。具体实现如下:
[0189] 首先创建用于调用抽象基类的构造函数;
[0190] 利用抽象接口获取驱动信息的哈希名称;
[0191] 调用对应的哈希算法计算驱动信息哈希名称的哈希值;
[0192] 将哈希值赋值给预先定义的结果变量。
[0193] 由于本申请可以采用链式调用的方式,所以将哈希值赋值给预先定义的结果变量后,判断当前的链式指针是否存在,若存在,则根据链式指针调用对应的哈希算法对哈希值进行再次哈希运算,再返回运算的结果。
[0194] 返回运算的结果后,可以触发回调接口调用该驱动信息的驱动路径或驱动名称,将该驱动信息的驱动路径或驱动名称发送至应用层,应用层可以打印驱动日志,在软件开发中显示驱动日志,方便开发过程中的错误定位。
[0195] 比如:哈希算法为Md5哈希算法时,创建Md5哈希算法对应的哈希算法类程序实现如下:
[0196] class Md5HASH : public HashBase{
[0197] Md5HASH (HashBase* hash):HashBase(hash);用于调用抽象基类的构造函数[0198] Std::string imp_Hash(BYTE* pData1, int nDataLen){
[0199] Std::string result; 定义计算结果变量
[0200] Result = MD5.Create(pData1, nDataLen);利用MD5哈希算法来计算HASH值[0201] If (m_hash){
[0202] Return m_hash(pData1 + result.data(), nDataLe + result.length());如果存在链式指针,则将原始数据和hash结果进行叠加的链式计算
[0203] }
[0204] return result;返回链式计算的结果
[0205] }
[0206] void Hash_Event(string *devpath) {
[0207] }
[0208] }
[0209] 其中,Std::string imp_Hash(BYTE* pData1, int nDataLen)为调用MD5哈希算法类中的哈希算法,pData1为MD5哈希算法类的指针。void Hash_Event(string *devpath)为利用回调接口调用驱动路径。
[0210] 其他类型的哈希算法对应的哈希算法类的程序实现与Md5哈希算法对应的哈希算法类程序实现相同,唯一不同的是,在计算哈希值时,是利用对应类型的哈希算法进行计算的,故而不再赘述。
[0211] 上述抽象基类及哈希算法类创建好之后,当需要获取目标隐藏驱动信息时,加载单元23预先利用系统提供的文档确定目标隐藏驱动信息对应的目标API函数,加载系统的内核文件ntdll.dll及动态链接库文件kernel32.dll,获得至少一个目标API函数。其中,隐藏驱动信息可以理解为系统中非正常的驱动信息,每个API函数可以获取一个目标隐藏驱动信息,因目标隐藏驱动信息可能包括一个或多个,因此需要获取少一个目标API函数。
[0212] 这里,加载系统的内核文件ntdll.dll及动态链接库文件kernel32.dll的程序实现如下:
[0213] HMODULE hNtDll = ::LoadLibrary(“ntdll.dll”);
[0214] HMODULE hKernel32 = ::LoadLibrary(“kernel32.dll”);
[0215] 获取到至少一个目标API函数后,调用单元24需要获取至少一个目标API函数对应的API接口,以能利用所述API接口调用对应的目标API函数,获得至少一个目标隐藏驱动信息。
[0216] 其中,获取至少一个目标API函数对应的API接口的程序实现如下:
[0217] pfnZwQuerySystemInformation =
[0218] GetProcAddress(hNtDll, “ZwQuerySystemInformation”)
[0219] 获取到目标隐藏驱动信息后,调用单元24将所述至少一个目标隐藏驱动信息的实例句柄传入所述抽象基类中,基于所述抽象基类中的链式指针调用对应哈希算法类中的哈希算法,利用各所述哈希算法计算所述至少一个目标隐藏驱动信息的目标哈希值。其中,将实例句柄传入抽象基类中计算驱动信息的哈希值不会改变驱动模块本身的代码功能,并且可以利用链式指针可以对不同的哈希算法进行叠加、组合,使得计算出的哈希结果值更具有隐蔽性。
[0220] 这里,在获取驱动信息时,需要为驱动信息分配足够的内存空间,但是因系统并未提前告知需要分配多大的内存空间,而当内存空间不足时会导致调用失败,内存空间太大又会造成资源浪费。因此,作为一种可选的实施例,获取所述至少一个目标API函数对应的API接口,利用所述API接口调用对应的目标API函数,获得至少一个目标隐藏驱动信息时,方法还包括:
[0221] 获取系统分配的内存空间对应的空间变量;
[0222] 判断所述空间变量是否为空,若所述空间变量不为空,说明当前分配的内存空间不够,则释放所述内存空间,并将所述内存空间的指针赋值为空;
[0223] 按照预设的空间内存增量递增所述内存空间,每次增大所述内存空间后,利用递增后的内存空间调用所述目标API函数;内存增量可以为1024字节;
[0224] 在 每 次 增 大 所 述 内 存 空 间 后 ,均 要 调 用 系 统 的 判 断 函 数pfnZwQuerySystemInformation判断所述目标API函数是否被调用成功,若所述目标API函数被调用成功,则确定增大后的所述内存空间足够。
[0225] 这里,内存增量可以为1024字节时正好是一个内存页面的大小,方便系统的内存管理。
[0226] 相应地,上述内存空间的分配对应的程序实现如下:
[0227] do{   if (pbyDriverListBuf){首先判断分配的空间变量是否不为空[0228]       Free(pbyDriverListBuf); 如果不为空则释放掉之前分配的空间[0229]       pbyDriverListBuf = NULL;}释放后将指针赋值为空
[0230]       ulLen += 0x1024; 每一次我们将分配的空间增加1024个字节[0231]       pbyDriverListBuf = (BYTE*)Malloc(ulLen); 然后重新分配内存空间[0232]   }
[0233] 内存空间分配完成后,利用判断函数pfnZwQuerySystemInformation判断所述目标API函数是否被调用成功的程序实现如下:
[0234] while(pfnZwQuerySystemInformation(SystemModuleInformation, pbyDriverListBuf, ulLen, &ulLen) == STATUS_INFO_LENGTH_MISMATCH);
[0235] 确定出内存空间,获得至少一个目标隐藏驱动信息后,将获取到的至少一个隐藏驱动信息存储至内存空间中的变量pbyDriverListBuf中,程序实现如下:
[0236] pfnZwQuerySystemInformation(SystemModuleInformation, pbyDriverListBuf, ulLen, &ulLen);
[0237] 其中,变量pbyDriverListBuf中存储有已获取到的目标隐藏驱动信息的总数量,那么可以利用Int DriverNum = *(DWORD*)pbyDriverListBuf;来获取到变量中所有隐藏驱动信息的数量Int DriverNum。
[0238] 获取到所有隐藏驱动信息的数量后,作为一种可选的实施例,遍历所述存储变量,获取所述至少一个目标隐藏驱动信息的占用内存及所述至少一个目标隐藏驱动信息的名称。遍历存储变量的程序实现如下:
[0239] for (Index = 0; Index < DriverNum ; Index++){从0开始遍历[0240] pstSysModuleInfo->Modules[Index].ImageSize;获取驱动信息的占用内存[0241] char*pszDriverName=(char*)(pstSysModuleInfo->Modules[Index].FullPathName + pstSysModuleInfo->Modules[Index].OffsetToFileName);
[0242] }
[0243] 获取第一个驱动信息的名称,其中pszDriverName是驱动信息的名称。
[0244] 并且,由于本申请中在获取到驱动信息的名称或路径后,为了使得驱动层得知该驱动信息,做出相应的处理,方法还包括:
[0245] 利用所述回调接口调用至少一个目标隐藏驱动信息的名称或路径,将所述至少一个目标隐藏驱动信息的名称或路径发送至应用层。
[0246] 应用层获取到目标隐藏驱动信息的名称或路径后,可以打印驱动日志,也可以判断该驱动信息是否对系统存在安全隐患等相应的处理。
[0247] 获取到目标隐藏驱动信息后,作为一种可选的实施例,所述基于所述抽象基类中的链式指针调用对应哈希算法类中的哈希算法,利用各所述哈希算法计算所述至少一个目标隐藏驱动信息的目标哈希值,包括:
[0248] 预先确定各哈希算法的等级,获得不同等级的哈希算法组;每个等级的哈希算法组中至少包括一个对应等级的哈希算法,每个所述哈希算法组中的哈希算法具有预设的编号,所述哈希算法的等级与所述哈希算法的复杂度为正比;
[0249] 比如,第一等级哈希算法组中包括:编号1哈希算法、编号2哈希算法等;第二等级哈希算法组中包括编号1哈希算法、编号2哈希算法等;但第一等级哈希算法组中包括的编号1哈希算法与第二等级哈希算法组中包括的编号1哈希算法是不同的哈希算法。
[0250] 确定所述抽象基类中链式指针的调用策略,基于所述链式指针的调用策略顺序调用对应等级哈希算法组的哈希算法;
[0251] 根据所述对应等级哈希算法组的当前哈希算法确定出当前哈希值,并将所述当前哈希值作为当前哈希算法的下一哈希算法的运算参数;
[0252] 利用所述下一哈希算法对所述运算参数进行哈希运算,获取所述至少一个目标隐藏驱动信息的目标哈希值。
[0253] 这里,哈希算法有很多种,每种哈希算法本身的复杂度是不一样的,因此本申请可以根据哈希算法本身的复杂度确定相应的等级,比如哈希算法包括A F,A和B的复杂度为一~般,C和D的复杂度为较复杂,E和F的复杂度为非常复杂;那么哈希算法A和B可以为第一等级的哈希算法组,哈希算法C和D可以为第二等级的哈希算法组,哈希算法E和F可以为第三等级的哈希算法组。
[0254] 而所述确定所述抽象基类中链式指针的调用策略,包括:
[0255] 获取所述目标隐藏驱动信息哈希名称的长度;
[0256] 若所述目标隐藏驱动信息哈希名称的长度小于A,则确定所述链式指针的调用策略为调用不同等级的哈希算法;
[0257] 若所述目标隐藏驱动信息哈希名称的长度大于A,则确定所述链式指针的调用策略为调用同一等级的哈希算法;其中,所述50 byte 
[0258] 举例来说,若目标隐藏驱动信息哈希名称长度为10 byte,长度较短,为了增加其最终结果的隐蔽性,那么需要利用较为复杂的调用策略进行哈希运算。这时可以调用不同等级的哈希算法进行运算。比如,调用策略中的运算次数为3次,那么第一次哈希运算可以利用第一等级的哈希算法组中的哈希算法进行运算,第二次哈希运算可以利用第二等级的哈希算法组中的哈希算法进行运算,第三次哈希运算可以利用第三等级的哈希算法组中的哈希算法进行运算。
[0259] 若目标隐藏驱动信息哈希名称长度为80 byte,可以利用普通的调用策略进行哈希运算。这时可以调用同一等级的哈希算法进行运算。比如,调用策略中的运算次数为2次,那么第一次哈希运算可以利用第一等级的哈希算法组中第一编号的哈希算法进行运算,第二次哈希运算可以利用第一等级的哈希算法组中第二编号的哈希算法进行运算。
[0260] 这里,第二次哈希运算的运算参数是第一次的哈希结果值,第三次哈希运算的运算参数是第二次的哈希结果值。
[0261] 举例来说,若目标隐藏驱动信息哈希名称长度为80 byte,第一编号的哈希算法为MD5哈希算法,第二编号的哈希算法为SHA哈希算法,那么链式指针为HashBase* phash,调用Stl::string result = pHash->Hash();来实现运算过程:
[0262] HashBase* phashMd5 = new Md5HASH();第一编号的哈希算法的运算[0263] HashBase* phashSha = new ShaHASH(phashMd5 );第二编号的哈希算法的运算[0264] 可以看出,在进行SHA的哈希算法的运算时,运算参数是phashMd5,即Md5的哈希运算的结果值。
[0265] 即使后续有新的哈希算法NewHASH,也可以通过同样的方式进行叠加运算:
[0266] HashBase* phashNew = new NewHASH();
[0267] HashBase* phashMd5 = new Md5HASH(phashNew );
[0268] HashBase* phashSha = new ShaHASH(phashMd5 );
[0269] 这样的调用方式即使增加新的哈希算法,也无需更改底层框架代码。
[0270] 而在实际运算中,每次待调用的哈希算法的编号是可以根据公式(1)预先确定的:
[0271] F= MD5(initial + time)               (1)
[0272] 在公式(1)中,F为待调用的哈希算法的编号,所述initial为预设的初始值,所述initial的值根据待计算的目标隐藏驱动信息的哈希名称长度确定,所述time为预设的时间戳。
[0273] 比如,在实际运算中F值为246,若调用策略为同一等级哈希算法的调用时,那么在同一等级的哈希算法组中,第一次调用的是编号为2的哈希算法,第二次调用的是编号为4的哈希算法,第三次调用的是编号为6的哈希算法,逐次进行哈希运算。
[0274] 若调用策略为不同等级哈希算法的调用时,第一次调用的是第一等级哈希算法组中编号为2的哈希算法,第二次调用的是第二等级哈希算法组中编号为 4的哈希算法,第三次调用的是第三等级哈希算法组中编号为6的哈希算法,逐次进行哈希运算。
[0275] 需要说明的是,每次在进行当前次的哈希运算时,可以将预设的时间戳与当前次的上一次的哈希结果值共同作为运算参数,来进行当前次的哈希运算,这样可以根据时间戳追溯到每次的哈希运算结果。
[0276] 这样,在不影响驱动信息模块的原始代码功能的基础上,可以进行多次哈希运算,提高了最终的目标哈希值的隐蔽性,避免被非正常用户篡改。
[0277] 目标哈希值计算出之后,上报至服务器,以使得服务器利用所述目标哈希值标记所述目标隐藏驱动信息所在的设备。
[0278] 具体地,服务器接收到目标哈希值后,可以利用目标哈希值标记目标隐藏驱动信息所在的设备,可以提高设备标记的隐蔽性,避免被非正常用户篡改,进而确保可以正常追踪到设备中的所需的数据;并且,本申请利用链式指针调用对应的哈希算法类进行哈希计算,计算过程复杂多变,得出的哈希值复杂度高,进而提高破解难度。
[0279] 进一步地,因设备标记是根据隐藏驱动信息确定的,那么服务器还可以根据标记来确定该设备中是否存在非正常驱动信息,若存在非正常驱动信息,且用户在该台设备上利用目标隐藏驱动信息对应的驱动程序继续操作时,驱动程序必然需要向服务器请求数据,那么服务器可以确定出该用户为非正常用户,进而可以对该用户进行相应的处理,以确保平台收益及系统运行安全。
[0280] 比如,当某个用户利用当前设备进行游戏,服务器根据该设备的标记确定该台设备中装有目标隐藏驱动信息,那么即使非正常用户更换了账号,只要该用户使用了目标隐藏驱动信息对应的驱动程序,服务器依然可以确定当前用户为非正常用户,会根据预设的处理策略对非正常用户进行相应处理。
[0281] 进一步地,确定出非正常用户后,因服务器会接收到很多设备上报的隐藏驱动信息的哈希值,那么服务器还可以对其他用户进行检测,具体为:
[0282] 遍历接收到的所有隐藏驱动信息的哈希值,基于非正常用户对应的目标哈希值对所有哈希值进行一一比较;
[0283] 若确定存在与非正常用户对应的目标哈希值相同的当前哈希值,则确定当前哈希值对应的用户为疑似非正常用户。
[0284] 这样,服务器还可预测出疑似非正常用户,进而对这些疑似非正常用户进行重点监测。
[0285] 本发明提供的标记设备的方法及装置能够带来的有益效果至少是:
[0286] 本申请提供了一种标记设备的方法、装置、介质及计算机设备,方法包括:预先创建哈希算法类的抽象基类;在所述抽象基类中创建抽象接口,以使得预设的哈希算法类通过所述抽象接口继承所述抽象基类;将链式指针传入所述抽象基类中,以使得所述抽象基类基于所述链式指针对驱动信息进行链式哈希运算;当需要获取目标隐藏驱动信息时,加载系统的内核文件及动态链接库文件,获得至少一个目标API函数;获取所述至少一个目标API函数对应的API接口,利用所述API接口调用对应的目标API函数,获得至少一个目标隐藏驱动信息;将所述至少一个目标隐藏驱动信息的实例句柄传入所述抽象基类中,基于所述抽象基类中的链式指针调用对应哈希算法类中的哈希算法,利用各所述哈希算法计算所述至少一个目标隐藏驱动信息的目标哈希值,以使得服务器利用所述目标哈希值标记所述目标隐藏驱动信息所在的设备;如此,本申请可以利用目标API函数获取到目标隐藏驱动信息,并且利用链式指针调用对应哈希算法类中的哈希算法对目标隐藏驱动信息进行哈希计算,获取相应的哈希值,这样将哈希值上报至服务器,服务器可利用哈希值对设备进行标记;本申请利用隐藏驱动信息的哈希值对设备进行标记,可以提高设备标记的隐蔽性,避免被非正常用户篡改,进而确保可以正常追踪到设备中的所需的数据;并且,本申请利用链式指针调用对应的哈希算法类进行哈希计算,计算过程复杂多变,得出的哈希值复杂度高,进而提高破解难度。
[0287] 实施例三
[0288] 本实施例提供一种计算机设备,如图3所示,包括存储器310、处理器320及存储在存储器310上并可在处理器320上运行的计算机程序311,处理器320执行计算机程序311时实现以下步骤:
[0289] 预先创建哈希算法类的抽象基类;
[0290] 将链式指针传入所述抽象基类中,以使得所述抽象基类基于所述链式指针对驱动信息进行链式哈希运算;
[0291] 在所述抽象基类中创建抽象接口,以使得预先创建的哈希算法类通过所述抽象接口继承所述抽象基类;
[0292] 当需要获取目标隐藏驱动信息时,加载系统的内核文件及动态链接库文件,获得至少一个目标API函数;
[0293] 获取所述至少一个目标API函数对应的API接口,利用所述API接口调用对应的目标API函数,获得至少一个目标隐藏驱动信息;
[0294] 将所述至少一个目标隐藏驱动信息的实例句柄传入所述抽象基类中,基于所述抽象基类中的链式指针调用对应哈希算法类中的哈希算法,利用各所述哈希算法计算所述至少一个目标隐藏驱动信息的目标哈希值;以使得服务器利用所述目标哈希值标记所述目标隐藏驱动信息所在的设备。
[0295] 在具体实施过程中,处理器320执行计算机程序311时,可以实现实施例一中任一实施方式。
[0296] 由于本实施例所介绍的计算机设备为实施本申请实施例一中一种获取数据的方法所采用的设备,故而基于本申请实施例一中所介绍的方法,本领域所属技术人员能够了解本实施例的计算机设备的具体实施方式以及其各种变化形式,所以在此对于该服务器如何实现本申请实施例中的方法不再详细介绍。只要本领域所属技术人员实施本申请实施例中的方法所采用的设备,都属于本申请所欲保护的范围。
[0297] 基于同一发明构思,本申请提供了实施例一对应的存储介质,详见实施例四。
[0298] 实施例四
[0299] 本实施例提供一种计算机可读存储介质400,如图4所示,其上存储有计算机程序411,该计算机程序411被处理器执行时实现以下步骤:
[0300] 预先创建哈希算法类的抽象基类;
[0301] 将链式指针传入所述抽象基类中,以使得所述抽象基类基于所述链式指针对驱动信息进行链式哈希运算;
[0302] 在所述抽象基类中创建抽象接口,以使得预先创建的哈希算法类通过所述抽象接口继承所述抽象基类;
[0303] 当需要获取目标隐藏驱动信息时,加载系统的内核文件及动态链接库文件,获得至少一个目标API函数;
[0304] 获取所述至少一个目标API函数对应的API接口,利用所述API接口调用对应的目标API函数,获得至少一个目标隐藏驱动信息;
[0305] 将所述至少一个目标隐藏驱动信息的实例句柄传入所述抽象基类中,基于所述抽象基类中的链式指针调用对应哈希算法类中的哈希算法,利用各所述哈希算法计算所述至少一个目标隐藏驱动信息的目标哈希值;以使得服务器利用所述目标哈希值标记所述目标隐藏驱动信息所在的设备。
[0306] 在具体实施过程中,该计算机程序411被处理器执行时,可以实现实施例一中任一实施方式。
[0307] 本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
[0308] 本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
[0309] 这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
[0310] 这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0311] 尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。
[0312] 以上所述,仅为本申请的较佳实施例而已,并非用于限定本申请的保护范围,凡在本申请的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本申请的保护范围之内。