CN109214180B - 一种内存代码的校验方法及装置 - Google Patents
一种内存代码的校验方法及装置 Download PDFInfo
- Publication number
- CN109214180B CN109214180B CN201710527519.9A CN201710527519A CN109214180B CN 109214180 B CN109214180 B CN 109214180B CN 201710527519 A CN201710527519 A CN 201710527519A CN 109214180 B CN109214180 B CN 109214180B
- Authority
- CN
- China
- Prior art keywords
- task
- function
- memory
- hash
- functions
- 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.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/55—Detecting local intrusion or implementing counter-measures
- G06F21/56—Computer malware detection or handling, e.g. anti-virus arrangements
- G06F21/562—Static detection
- G06F21/563—Static detection by source code analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/60—Protecting data
- G06F21/64—Protecting data integrity, e.g. using checksums, certificates or signatures
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2221/00—Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F2221/03—Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
- G06F2221/033—Test or assess software
Landscapes
- Engineering & Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Computer Hardware Design (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Physics & Mathematics (AREA)
- Health & Medical Sciences (AREA)
- General Health & Medical Sciences (AREA)
- Virology (AREA)
- Bioethics (AREA)
- Storage Device Security (AREA)
Abstract
本发明公开了一种内存代码的校验方法及装置,通过将多个读取函数和多个哈希函数进行随机组合封装为对应的独立任务;并将所有独立任务随机投入到多线程中;通过多线程调用各自的独立任务对内存代码进行校验。由于读取内存代码的方式和计算哈希值的方式都有很多种,每一种不同的HASH函数对同一处代码校验的值是不一样的,从而对结果的安全性进一步的保障,而不同的HASH也可以防止被黑客通过HASH碰撞。另外,利用多线程来执行独立任务,即使一个线程被断点调试,而其他线程则可以继续进行校验,从而还可以校验其他线程的校验函数是否被修改,极大的提高了代码完整性校验的功能和效果。
Description
技术领域
本申请涉及通信安全技术领域,尤其涉及一种内存代码的校验方法及装置。
背景技术
目前,对于一些客户端工具软件会有些收费功能,客户端逻辑中会判断当前用户是否是一个VIP用户,只有是VIP用户该功能才能够使用。
而对于一些HACK(黑客)通过反汇编逆向去分析软件的这个功能的实现逻辑,通过修改客户端代码中对VIP判断的进程的内存代码,从而绕过了VIP用户的判断,使得非VIP用户也可以使用该功能。
对于网络游戏来说,HACK可以通过修改客户端内存中的代码来实现多种多样的游戏“外挂”功能,比如通过修改游戏中的碰撞检测逻辑,从而可以实现游戏角色的穿墙功能和格斗游戏的“无敌”功能,最终对于游戏开发厂商带来了巨大的利益损失。目前各个软件开发商都有对代码进行完整性检查,检查的方法大多都是通过一个HASH(Hash,就是把任意长度的输入通过散列算法,变换成固定长度的输出,该输出就是散列值)函数来计算一段内存的HASH值,并将结果上报服务器,服务器来判断结果是否正确。
然而这种简单的单点的校验很容易被HACK绕过以及通过动态调试跟踪查找到代码校验的逻辑,HACK通过修改校验的代码本身的逻辑从而绕过了对内存代码的HASH,存在极大的安全隐患。
发明内容
本发明了提供了一种内存代码的校验方法及装置,用于对客户端内存代码进行完整性校验,以解决目前的内存代码的校验逻辑容易被破解,进而存在极大的安全隐患的技术问题。
为解决上述技术问题,本发明提供了一种内存代码的校验方法,所述方法包括:
将多个读取函数和多个哈希函数进行随机组合封装为对应的独立任务;其中,所述多个读取函数用于分别读取所述内存代码,所述哈希函数用于分别计算所述内存代码的哈希值。
将组合封装得到的所有独立任务随机投入到多线程对应的任务线程队列中;
通过所述多线程中的各个线程调用各自对应的线程函数分别从各自对应的任务线程队列中获取到对应的独立任务;
通过所述多线程同时执行所述独立任务对所述内存代码进行校验,然后将得到的所有校验结果发送给服务器进行验证。
优选的,所述将多个读取函数和多个哈希函数进行随机组合封装为对应的独立任务,包括:
创建一个任务对象Task*pHashTask=new Task;利用所述任务对象对将多个读取函数和多个哈希函数进行随机组合封装为对应的独立任务;其中,Task是一个任务对象,pHashTask是任务对象的变量名称,New Task标示创建一个任务对象;
对pHashTask中的成员变量MemoryAddress存储地址和Length长度进行赋值以确定所述任务对象对应的待校验内存代码;
pHashTask的任务是用于随机调用一读取函数,然后随机调用一哈希函数来对所述待校验内存代码读取并计算HASH值,并将所述哈希值上报所述服务器。
优选的,所述将组合封装得到的所有独立任务随机投入到多线程对应的任务线程队列中,包括:
通过线程的管理对象ThreadManager的接口GetThtread()来获取一个线程对象,然后通过线程对象中的Cqueue对象来调用其接口AddTask来加入一个独立任务到调用GetThread获取的线程对象的任务队列中。
优选的,所述读取函数用于将所述内存代码读取并存储到缓存中,所述哈希函数用于从所述缓存中取出所述内存代码计算哈希值。
优选的,所述哈希函数包括但不限于下述开源函数:MD5函数,SHA函数,CRC32函数。
优选的,所述读取函数包括但不限于是下述开源函数:
调用系统函数ReadProcessMemory的读取进程内存代码的函数、调用系统函数Memcpy来读取内存代码的函数。
优选的,所述方法还包括:
调用所述多个读取函数和多个哈希函数进行随机组合,进而对所述多线程本身的代码进行校验。
本发明公开了一种内存代码的校验装置,包括:
封装模块,用于将多个读取函数和多个哈希函数进行随机组合封装为对应的独立任务;其中,所述多个读取函数用于分别读取所述内存代码,所述哈希函数用于分别计算所述内存代码的哈希值。
投入模块,用于将组合封装得到的所有独立任务随机投入到多线程对应的任务线程队列中;
调用模块,用于通过所述多线程中的各个线程调用各自对应的线程函数分别从各自对应的任务线程队列中获取到对应的独立任务;
校验模块,用于通过所述多线程同时执行所述独立任务对所述内存代码进行校验,然后将得到的所有校验结果发送给服务器进行验证。
本发明公开了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述方法的步骤。
本发明公开了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述方法的步骤。
通过本发明的一个或者多个技术方案,本发明具有以下有益效果或者优点:
本发明公开了一种内存代码的校验方法及装置,通过将多个读取函数和多个哈希函数进行随机组合封装为对应的独立任务;并将所有独立任务随机投入到多线程中;通过多线程调用各自的独立任务对内存代码进行校验。由于读取内存代码的方式和计算哈希值的方式都有很多种,每一种不同的HASH函数对同一处代码校验的值是不一样的,从而对结果的安全性进一步的保障,而不同的HASH也可以防止被黑客通过HASH碰撞。另外,利用多线程来执行独立任务,即使一个线程被断点调试,而其他线程则可以继续进行校验,从而还可以校验其他线程的校验函数是否被修改,极大的提高了代码完整性校验的功能和效果。
附图说明
图1为本发明实施例中一种内存代码的校验方法的流程图;
图2为本发明实施例中一种内存代码的校验方法的装置示意图。
具体实施方式
本发明从提高阻扰黑客分析方法着手,利用多线程来校验代码的完整性,同时结合不同的校验算法,不同的读取内存的方法,将每个校验逻辑编写成一个个独立的任务,随机的投递到不同的线程,可利用多线程对代码进行校验。
为了使本申请所属技术领域中的技术人员更清楚地理解本申请,下面结合附图,通过具体实施例对本申请技术方案作详细描述。
参看图1,在本发明实施例中,公开了一种内存代码的校验方法,包括:
步骤11,将多个读取函数和多个哈希函数进行随机组合封装为对应的独立任务。
所述多个读取函数用于分别读取所述内存代码,所述哈希函数用于分别计算所述内存代码的哈希值。
下面先介绍哈希函数。
目前,由于对内存中的内存代码进行校验,通常的做法是对内存的代码计算其HASH值,通过和没被修改过的内存计算出来的HASH值进行比较,如果HASH值一致则说明没有被修改,如果不一致则说明内存代码被修改了。
但是,通常的仅仅使用一种HASH算法是不够安全的,本发明则是使用不同的HASH函数来校验代码,使用不同的HASH函数来校验的好处是,一个使得校验逻辑更为复杂,每一种不同的HASH函数对同一处代码校验的值是不一样的,从而对结果的安全性进一步的保障,同时不同的HASH也可以防止被黑客通过HASH碰撞(指即使代码被修改,但是通过不断的枚举尝试修改的数据,使得修改后的HASH结果和没被修改过的HASH值是一致的)使得即使被修改过的内存代码计算的HASH值是一致的,但是如果使用多种不同的HASH则可以避免这个问题。
本发明实施例可以使用很多种哈希函数来计算内存代码的哈希值,例如:MD5函数,SHA函数,CRC32函数等等。
内存代码的HASH校验就是对内存的一段数据计算其HASH的结果。
其中假设校验的内存代码存储的缓存是MemoryBuff,校验的内存长度是Length。
那么,根据上面所列举的哈希函数对内存代码进行哈希时,具体如下:
1、利用MD5函数来计算内存代码的HASH值。
Md5Result=MD5.Create(MemoryBuff,Length);
其中,调用函数MD5.Create来对内存代码计算其MD5的HASH结果Md5Result。
2、利用SHA函数来计算内存代码的HASH值。
ShaResult=SHA.Create(MemoryBuff,Length);
其中,调用函数SHA.Create来对内存代码计算其SHA的HASH结果ShaResult。
3、利用CRC32函数来计算内存代码的HASH值。
Crc32Result=CRC32.Create(MemoryBuff,Length);
其中,调用函数CRC32.Create来对内存代码计算其CRC32的HASH结果Crc32Result。
其中,MD5、SHA、CRC32等都是开源的HASH函数,本文还可以编写更多的HASH函数来实现对内存代码的校验。
作为一种可选的实施例,对不同的HASH函数也可以设置不同的编号,从而将HASH结果上报到服务器时可以携带上报编号,服务器则通过编号来对比客户端上报的HASH结果的正确性。
在本发明实施例中,通过上述步骤就完成了利用多种HASH函数来对内存代码计算其HASH结果,当然,在实际情况中,还可以利用更多的HASH函数来对内存代码进行计算。
而在利用哈希函数计算内存代码之前,需要先将对应的内存代码调用出来。
作为一种可选的实施例,可以直接利用哈希函数对内存代码进行校验。那么HASH函数直接对内存代码的需要校验的起始地址和长度进行读取校验,即:则传入的参数为内存的地址,和要校验的长度,然后进行计算即可,不需要读取函数。
以MD5函数为例:
Md5Result=MD5.Create(MemoryAddress,Length);
其中,参数MemoryAddress则是需要校验内存代码的起始地址,Length则是其需要校验的长度。
作为一种可选的实施例,还可以先利用读取函数读取内存的代码到一个缓存中,然后利用哈希函数对缓存中的数据进行校验。
本发明实施例提供了多种方法来调用内存代码,从而进一步的加强其安全性。
原因在于,如果仅仅使用一种系统的读取函数来读取内存代码也存在被黑客进行攻击的可能性,通过攻击系统的读取函数从而对读取的内容进行修改,所以本文提供多种读取内存的读取函数来对内存代码进行读取,从而增加安全性。
而在本发明是实施例中,读取函数至少包括以下一种或多种开源函数:调用系统函数ReadProcessMemory的读取进程内存代码的函数、调用系统函数Memcpy来读取内存代码的函数。
下面分别介绍读取函数。
1、利用读取函数ReadProcessMemory的读取进程内存代码。
BOOL ReadProcessMemory(
HANDLE hProcess,//待读进程的句柄
LPCVOID lpBaseAddress,//目标进程中待读内存的起始地址
LPVOID lpBuffer,//用来接受读取数据的缓冲区
DWORD nSize,//要读取的字节数
LPDWORD lpNumberOfBytesRead//用来供函数返回实际读取的字节数
);
其中参数hProcess则传入本进程的句柄,因为是对本进程代码校验。
其中参数lpBaseAddress则是需要传入读取内存代码的起始地址。
其中参数nSize则是读取内存代码的长度。
通过调用该函数则将内存的代码读取到缓存lpBuffer中。
具体校验以MD5函数为例:
Md5Result=MD5.Create(lpBuffer,nSize);
其中参数lpBuffer则是读取内存代码的缓存,Length则是读取的长度。
2、利用读取函数Memcpy来读取内存代码。
memcpy(void*dest,const void*src,size_t nSize);
调用memcpy来将内存数据拷贝到缓存中。
其中参数dest填入拷贝到的缓存。其中参数src则是需要读取的内存代码的起始地址。其中参数nSize则是拷贝内存代码的大小。
具体校验以MD5函数为例:
Md5Result=MD5.Create(dest,nSize);
其中参数dest则是拷贝内存代码的缓存,Length则是读取的长度。
同样的方法还可以找到系统的其他函数如ReadFile等来读取内存代码到缓存中,然后通过哈希函数来进行调用并计算内存代码的哈希值。
故而,本发明通过上述方法能够完成利用多种读取内存代码并调用HASH函数进行校验的方法。
在介绍完毕上述读取函数和哈希函数之后,本发明会将多个读取函数和多个哈希函数进行随机组合封装为对应的独立任务,将具体的校验功能创建成一个个独立的任务投递到多线程的队列中,使得多线程同时对内存代码进行校验。
例如,创建一个任务对象Task*pHashTask=new Task;其中,Task是一个任务对象,pHashTask是任务对象的变量名称,New Task标示创建一个任务对象;
对pHashTask中的成员变量MemoryAddress存储地址和Length长度进行赋值以确定所述任务对象对应的待校验内存代码,也即确定是对内存中的哪一处内存代码进行校验。
而pHashTask的作用则是随机调用一读取函数,然后随机调用一哈希函数来对所述待校验内存代码读取并计算HASH值,并将所述哈希值上报所述服务器。如下:
pHashTask.func=随机选择一种读取内存代码的读取函数。
+随机选择一种计算内存代码的HASH值的哈希函数。
+将计算的HASH结果上报到服务器。
作为一种可选的实施例,为了进一步保证对内存代码校验的安全性,降低被黑客攻击的风险。本发明实施例还可以调用所述多个读取函数和多个哈希函数进行随机组合,进而对所述多线程本身的代码进行校验。也就是说,本发明还会对多线程本身的内存代码也利用公开的读取函数和哈希函数进行校验,从而对校验内存的多线程的校验代码也进行校验。
在具体的组合封装过程中,对同一处的内存代码进行校验时,可以创建多个任务,本发明实施例在封装独立任务时,可分多种策略,通过变换策略,从而可以使得本身的校验安全性及可变性更高,最终导致黑客破解分析更难。
具体策略如下:
(1)组合策略。
组合策略,是指从对多种HASH函数和多种读取内存的函数进行排列组合,从而每一种HASH函数都会对应于多种读取内存的函数。从而所有可变的方式都使用上了。
如果校验的代码比较重要,则可以考虑组合策略,从而将所有的HASH函数和读取内存的方式都进行组合,并都用来对同一处代码进行校验一次,从而极大的保护了被校验的代码。
(2)随机策略。
随机策略,是指随机的选择一种HASH函数和随机的选择一种读取内存的函数,然后产生任务对内存代码进行校验。随机策略具有更多的不确定性和变化性。
(3)两两组合策略。
两两组合策略,是指对需要校验的内存代码使用一种HASH函数和一种读取内存的函数,然后对多线程本身的代码使用另一种HASH函数和另一种读取内存的函数进行校验。从而确保一次校验使用了多种校验方法。
在校验完毕之后,会上报校验结果给服务器,而具体上报的数据就包括校验内存的起始地址、校验的长度、校验的结果、校验的HASH函数名称或者编号。
步骤12,将组合封装得到的所有独立任务随机投入到多线程对应的任务线程队列中。
在具体的实施过程中,本发明实施例会先构建设计多线程的队列方法模型,这是本发明利用多线程处理鉴权的基础。
多线程的特点是每个线程所执行的代码和环境是不一样的(每个线程有个线程函数来让该线程去执行相应的逻辑),当一个线程停止时另一个线程可能还在执行,通常的黑客逆向分析程序时,会对程序进行设置调试断点,而调试断点是通过修改被调试的代码来实现(在被调试的代码中修改汇编指令为一个int3中断指令来实现断点功能),此时一旦一个线程的执行被断下来,那么如果是单线程则无法对断点修改的代码进行校验,而如果是多线程程序则即使一个线程被断点调试,而其他线程则可以继续进行校验,从而还可以校验其他线程的校验函数是否被修改,进一步的还可以检验被黑客设置的调试断点,可以极大的提高代码完整性校验的功能和效果。
多线程的方法模型,是一种以计算任务为主的一种模型,每个线程的队列模型是一样的,每个线程都会设计一个任务队列,该线程各自不同的线程函数则会不断的从队列中取任务来执行,如果线程中没有任务则会调用系统函数Sleep(休眠)来停止线程的执行,当Sleep的时间到达后则又会继续从队列中取任务,线程重复以往执行该循环来取任务执行,没任务则休眠。如果线程收到一个退出线程的任务则会退出该循环,从而终止该线程的执行。
下面介绍本发明的实施例的实施基础。
在事先准备的基础中:1、会编写一任务数据结构。任务数据结构主要用来对所需信息(例如本实施例中的各读取函数、各哈希函数)进行封装,如上述步骤12中的内容,则是依据编写的任务数据结构对N个鉴权要素分别进行封装。2、会编写任务队列,值得注意的是,每个线程都有各自对应的任务队列,队列用来对存储封装后的任务,供对应的线程取用。3、编写创建线程的函数,该函数是线程整个的执行逻辑。4、编写具体的线程函数,每个线程对应有各自的线程函数。
1、编写任务数据结构。
编写一个任务的数据结构,该结构主要是将任务的所需要的信息进行封装,那么线程取出这个任务时则依据于这个数据结构来执行。
具体的数据结构包括:
2、编写一个任务队列。
编写一个任务队列,该队列则可以被其他线程投递任务,本线程则会从队列中取任务来执行。本文使用STL容器的list容器,list容器是一个链表,可以高效的从链表中插入任务已经取任务操作。对于每个任务则是上面的1中编写的任务的数据结构。具体队列实现如下:
编写一个队列的类,该类有成员变量list<Task>用于存储任务,并且编写接口来提供从队列中取任务和从队列中插入任务的操作。具体的类如下:
Class Cqueue
{
Public:
Task*GetTask()
{
Lock(m_mutex);
对互斥变量加锁,防止其他线程同时对该队列增加任务和取任务。
If(m_listTask.empt())
{return NULL;}
如果队列中没有任务则返回的任务为空。
Task*pTask=m_listTask.front();
从任务队列的头部取出一个任务。
m_listTask.pop_front();
将头部被取出的任务从队列中删除掉。
}
Void AddTask(Task*pTask)
{
Lock(m_mutex);
对互斥变量加锁,防止其他线程同时对该队列增加任务。
m_listTask.push_back(pTask);
网任务队列中添加一个任务,并且加入到任务队列的最尾部。
}
Private:
List<task*>m_listTask;
定义一个list容器来存储任务task。
Mutex m_mutex;
定义一个互斥变量来保障对任务队列的操作是线程安全的,当多个线程同时对一个队列进行操作时,互斥变量保障操作按照先后顺序进行。
}
3、编写一个创建线程的函数。
本文调用系统API函数CreateThread来创建一个线程,其中重要的参数是线程函数的地址,该线程函数则是这个线程整个的执行逻辑。可以调用此函数来创建多个线程。
4、编写具体的线程函数。
此线程函数是一个循环结构,会不断的从任务队列中取出任务来执行,如果没有任务则进行休眠,直到执行的任务是一个退出线程循环的任务则该线程的执行会被终止。具体实现如下:
While(True)
{
创建一个循环,来从任务队列中取任务执行。
创建一个任务队列的对象Cqueue queue;
Task*pTask=queue.GetTask();
从队列中取出一个任务到变量pTask中。
If(pTask==NULL)
{
此分支标示取出的任务为空,则说明此时任务队列中没有可执行的任务。那么此时则进入休眠状态,将CPU资源让出来给其他线程使用。
Sleep(10);
调用系统函数休眠10毫秒。
}
Else
{
pTask.func();
执行任务中的任务函数代码。
}
}
至此,通过上述方式完成了设计编写一个队列的多线程模型算法,每个线程都会创建一个队列。
而在将独立任务分配到多线程的任务线程队列中的具体实施过程,则是通过线程的管理对象ThreadManager的接口GetThtread()来获取一个线程对象,然后通过线程对象中的Cqueue对象来调用其接口AddTask来加入一个独立任务到调用GetThread获取的线程对象的任务队列中。
步骤13,通过所述多线程中的各个线程调用各自对应的线程函数分别从各自对应的任务线程队列中获取到对应的独立任务。
步骤14,通过所述多线程同时执行所述独立任务对所述内存代码进行校验,然后将得到的所有校验结果发送给服务器进行验证。
校验的过程实际上就是执行读取函数、哈希函数对内存代码的处理过程,在上述实施例中已经具体介绍了读取函数、哈希函数对内存代码的具体实施过程,故而本发明在此不再赘述。
在服务器侧,对客户端上报的校验结果进行验证时,服务器可以先对没有修改过的内存代码进行校验,从而获取到正确的HASH值。并且需要对每一种不同的HASH算法计算一次其正确的HASH值。当客户端上报校验结果时,服务器则可以对比其上报的结果和服务器存储的正确的结果进行比较,如果一致则说明客户端上报的校验结果正确,客户端的内存代码没有被修改,否则客户端的内存代码被修改过。
参见图2,基于同一发明构思,本发明还提供了一种内存代码的校验装置,包括:
封装模块21,用于将多个读取函数和多个哈希函数进行随机组合封装为对应的独立任务;其中,所述多个读取函数用于分别读取所述内存代码,所述哈希函数用于分别计算所述内存代码的哈希值。
投入模块22,用于将组合封装得到的所有独立任务随机投入到多线程对应的任务线程队列中;
调用模块23,用于通过所述多线程中的各个线程调用各自对应的线程函数分别从各自对应的任务线程队列中获取到对应的独立任务;
校验模块24,用于通过所述多线程同时执行所述独立任务对所述内存代码进行校验,然后将得到的所有校验结果发送给服务器进行验证。
基于与前述实施例中同样的发明构思,本发明还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现前文任一所述方法的步骤。
基于与前述实施例中同样的发明构思,本发明还提供一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现前文任一所述方法的步骤。
通过本发明的一个或者多个实施例,本发明具有以下有益效果或者优点:
本发明公开了一种内存代码的校验方法及装置,通过将多个读取函数和多个哈希函数进行随机组合封装为对应的独立任务;并将所有独立任务随机投入到多线程中;通过多线程调用各自的独立任务对内存代码进行校验。由于读取内存代码的方式和计算哈希值的方式都有很多种,每一种不同的HASH函数对同一处代码校验的值是不一样的,从而对结果的安全性进一步的保障,而不同的HASH也可以防止被黑客通过HASH碰撞。另外,利用多线程来执行独立任务,即使一个线程被断点调试,而其他线程则可以继续进行校验,从而还可以校验其他线程的校验函数是否被修改,极大的提高了代码完整性校验的功能和效果。
尽管已描述了本申请的优选实施例,但本领域内的普通技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。
显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。
Claims (10)
1.一种内存代码的校验方法,其特征在于,所述方法包括:
将多个读取函数和多个哈希函数进行随机组合封装为对应的独立任务;其中,所述多个读取函数用于分别读取所述内存代码,所述哈希函数用于分别计算所述内存代码的哈希值;
将组合封装得到的所有独立任务随机投入到多线程对应的任务线程队列中;
通过所述多线程中的各个线程调用各自对应的线程函数分别从各自对应的任务线程队列中获取到对应的独立任务;
通过所述多线程同时执行所述独立任务对所述内存代码进行校验,然后将得到的所有校验结果发送给服务器进行验证。
2.如权利要求1所述的方法,其特征在于,所述将多个读取函数和多个哈希函数进行随机组合封装为对应的独立任务,包括:
创建一个任务对象Task* pHashTask = new Task;利用所述任务对象将多个读取函数和多个哈希函数进行随机组合封装为对应的独立任务;其中,Task是一个任务对象,pHashTask是任务对象的变量名称,New Task 标示创建一个任务对象;
对pHashTask中的成员变量MemoryAddress存储地址和Length长度进行赋值以确定所述任务对象对应的待校验内存代码;
pHashTask的任务是用于随机调用一读取函数,然后随机调用一哈希函数来对所述待校验内存代码读取并计算HASH值,并将所述哈希值上报所述服务器。
3.如权利要求1所述的方法,其特征在于,所述将组合封装得到的所有独立任务随机投入到多线程对应的任务线程队列中,包括:
通过线程的管理对象ThreadManager的接口GetThtread()来获取一个线程对象,然后通过线程对象中的Cqueue对象来调用其接口AddTask来加入一个独立任务到调用GetThread获取的线程对象的任务队列中。
4.如权利要求1所述的方法,其特征在于,所述读取函数用于将所述内存代码读取并存储到缓存中,所述哈希函数用于从所述缓存中取出所述内存代码计算哈希值。
5.如权利要求1所述的方法,其特征在于,所述哈希函数包括但不限于下述开源函数:MD5函数,SHA函数,CRC32函数。
6.如权利要求1所述的方法,其特征在于,所述读取函数包括但不限于是下述开源函数:
调用系统函数ReadProcessMemory的读取进程内存代码的函数、调用系统函数Memcpy来读取内存代码的函数。
7.如权利要求1所述的方法,其特征在于,所述方法还包括:
调用所述多个读取函数和多个哈希函数进行随机组合,进而对所述多线程本身的代码进行校验。
8.一种内存代码的校验装置,其特征在于,包括:
封装模块,用于将多个读取函数和多个哈希函数进行随机组合封装为对应的独立任务;其中,所述多个读取函数用于分别读取所述内存代码,所述哈希函数用于分别计算所述内存代码的哈希值;
投入模块,用于将组合封装得到的所有独立任务随机投入到多线程对应的任务线程队列中;
调用模块,用于通过所述多线程中的各个线程调用各自对应的线程函数分别从各自对应的任务线程队列中获取到对应的独立任务;
校验模块,用于通过所述多线程同时执行所述独立任务对所述内存代码进行校验,然后将得到的所有校验结果发送给服务器进行验证。
9.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现权利要求1-7任一项所述方法的步骤。
10.一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现权利要求1-7任一项所述方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710527519.9A CN109214180B (zh) | 2017-06-30 | 2017-06-30 | 一种内存代码的校验方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710527519.9A CN109214180B (zh) | 2017-06-30 | 2017-06-30 | 一种内存代码的校验方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109214180A CN109214180A (zh) | 2019-01-15 |
CN109214180B true CN109214180B (zh) | 2021-04-27 |
Family
ID=64991701
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710527519.9A Active CN109214180B (zh) | 2017-06-30 | 2017-06-30 | 一种内存代码的校验方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109214180B (zh) |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110134500A (zh) * | 2019-04-15 | 2019-08-16 | 平安普惠企业管理有限公司 | 基于多线程的数据同步方法、装置、设备和存储介质 |
CN113360858B (zh) * | 2020-03-04 | 2022-09-09 | 武汉斗鱼网络科技有限公司 | 一种功能开关数据处理的方法及系统 |
CN111506301B (zh) * | 2020-04-24 | 2022-11-11 | 同盾(广州)科技有限公司 | 绕过系统限制反射调用的方法及相关设备 |
CN112650645B (zh) * | 2020-12-24 | 2023-05-30 | 大连市共进科技有限公司 | 堆内存使用情况监测方法、装置和5g基站设备 |
CN114840847A (zh) * | 2021-02-02 | 2022-08-02 | 武汉斗鱼鱼乐网络科技有限公司 | 在目标进程中安全创建线程的方法、装置、介质及设备 |
CN113238711B (zh) * | 2021-04-17 | 2024-02-02 | 西安电子科技大学 | 一种电子数据取证领域中高效的哈希计算方法 |
CN114510495B (zh) * | 2022-04-21 | 2022-07-08 | 北京安华金和科技有限公司 | 一种数据库业务数据一致性处理方法和系统 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103279712A (zh) * | 2013-05-28 | 2013-09-04 | 华为技术有限公司 | 增强系统安全性的方法、校验装置及安全系统 |
CN103593617A (zh) * | 2013-10-27 | 2014-02-19 | 西安电子科技大学 | 基于vmm的软件完整性校验系统及其方法 |
CN106055933A (zh) * | 2016-06-24 | 2016-10-26 | 武汉斗鱼网络科技有限公司 | 一种客户端软件代码校验的方法及系统 |
CN107277030A (zh) * | 2017-06-30 | 2017-10-20 | 武汉斗鱼网络科技有限公司 | 一种利用多线程来处理鉴权的方法及装置 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101882189B (zh) * | 2010-06-30 | 2012-05-30 | 华南理工大学 | 一种保证程序完整性的嵌入式系统及其实现方法 |
US9152793B2 (en) * | 2012-09-28 | 2015-10-06 | Intel Corporation | Methods, systems and apparatus to self authorize platform code |
CN106325980A (zh) * | 2015-06-30 | 2017-01-11 | 中国石油化工股份有限公司 | 一种多线程并发系统 |
-
2017
- 2017-06-30 CN CN201710527519.9A patent/CN109214180B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103279712A (zh) * | 2013-05-28 | 2013-09-04 | 华为技术有限公司 | 增强系统安全性的方法、校验装置及安全系统 |
CN103593617A (zh) * | 2013-10-27 | 2014-02-19 | 西安电子科技大学 | 基于vmm的软件完整性校验系统及其方法 |
CN106055933A (zh) * | 2016-06-24 | 2016-10-26 | 武汉斗鱼网络科技有限公司 | 一种客户端软件代码校验的方法及系统 |
CN107277030A (zh) * | 2017-06-30 | 2017-10-20 | 武汉斗鱼网络科技有限公司 | 一种利用多线程来处理鉴权的方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN109214180A (zh) | 2019-01-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109214180B (zh) | 一种内存代码的校验方法及装置 | |
WO2019169759A1 (zh) | 模拟接口的创建装置、方法及计算机可读存储介质 | |
JP2009529720A5 (zh) | ||
CN107169324A (zh) | 一种基于动态加解密的Android应用加固方法 | |
US20160203087A1 (en) | Method for providing security for common intermediate language-based program | |
US9454666B2 (en) | Method for protecting data | |
CN104461641B (zh) | 一种数据烧写方法、系统、烧写设备以及目标设备 | |
WO2019113495A1 (en) | Systems and methods for cryptographic provision of synchronized clocks in distributed systems | |
CN103294485B (zh) | 用于ABINIT并行计算系统的Web服务封装方法以及系统 | |
CN109117201B (zh) | 一种程序退出的方法及相关设备 | |
CN111240831A (zh) | 区块链中交易并行执行方法、装置、电子设备、存储介质 | |
WO2016202157A2 (zh) | 一种随机测试程序生成方法及装置、设备、存储介质 | |
US9047448B2 (en) | Branch auditing in a computer program | |
Attiya et al. | Putting strong linearizability in context: Preserving hyperproperties in programs that use concurrent objects | |
CN103116715A (zh) | Windows平台可执行文件API延迟导入保护方法 | |
Schlich et al. | Application of static analyses for state-space reduction to the microcontroller binary code | |
CN107239698A (zh) | 一种基于信号处理机制的反调试方法和装置 | |
Albert et al. | aPET: a test case generation tool for concurrent objects | |
Vörtler et al. | Formal verification of software for the Contiki operating system considering interrupts | |
Zhao et al. | Cascade: A test generation tool for combinatorial testing | |
CN112134905B (zh) | 基于安卓系统的签名方法、装置以及设备 | |
CN113656229A (zh) | 计算机系统密码模块的检测方法、装置及存储介质 | |
CN111241594A (zh) | 交易信息的加签方法、装置、计算机设备和存储介质 | |
CN107122661B (zh) | 一种安全加载Flash文件的方法及装置 | |
US9430196B2 (en) | Message inlining |
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 | ||
TR01 | Transfer of patent right | ||
TR01 | Transfer of patent right |
Effective date of registration: 20230919 Address after: Room 202, No. 54-58 Huacui Street, Tianhe District, Guangzhou City, Guangdong Province, 510000 (location: 202) (cannot be used as a factory building) Patentee after: Guangzhou Wentian Information Technology Co.,Ltd. Address before: 430000 East Lake Development Zone, Wuhan City, Hubei Province, No. 1 Software Park East Road 4.1 Phase B1 Building 11 Building Patentee before: WUHAN DOUYU NETWORK TECHNOLOGY Co.,Ltd. |