CN108880785A - 一种检测C++虚表被hook的方法、装置、终端及可读介质 - Google Patents
一种检测C++虚表被hook的方法、装置、终端及可读介质 Download PDFInfo
- Publication number
- CN108880785A CN108880785A CN201810530628.0A CN201810530628A CN108880785A CN 108880785 A CN108880785 A CN 108880785A CN 201810530628 A CN201810530628 A CN 201810530628A CN 108880785 A CN108880785 A CN 108880785A
- Authority
- CN
- China
- Prior art keywords
- rdata
- sections
- client
- hash
- server
- 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
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L9/00—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
- H04L9/06—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols the encryption apparatus using shift registers or memories for block-wise or stream coding, e.g. DES systems or RC4; Hash functions; Pseudorandom sequence generators
- H04L9/0643—Hash functions, e.g. MD5, SHA, HMAC or f9 MAC
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L63/00—Network architectures or network communication protocols for network security
- H04L63/06—Network architectures or network communication protocols for network security for supporting key management in a packet data network
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L63/00—Network architectures or network communication protocols for network security
- H04L63/12—Applying verification of the received information
- H04L63/123—Applying verification of the received information received data contents, e.g. message integrity
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L9/00—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
- H04L9/06—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols the encryption apparatus using shift registers or memories for block-wise or stream coding, e.g. DES systems or RC4; Hash functions; Pseudorandom sequence generators
- H04L9/0618—Block ciphers, i.e. encrypting groups of characters of a plain text message using fixed encryption transformation
- H04L9/0625—Block ciphers, i.e. encrypting groups of characters of a plain text message using fixed encryption transformation with splitting of the data block into left and right halves, e.g. Feistel based algorithms, DES, FEAL, IDEA or KASUMI
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L9/00—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
- H04L9/08—Key distribution or management, e.g. generation, sharing or updating, of cryptographic keys or passwords
- H04L9/0816—Key establishment, i.e. cryptographic processes or cryptographic protocols whereby a shared secret becomes available to two or more parties, for subsequent use
- H04L9/0838—Key agreement, i.e. key establishment technique in which a shared key is derived by parties as a function of information contributed by, or associated with, each of these
Landscapes
- Engineering & Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Computer Hardware Design (AREA)
- Computing Systems (AREA)
- General Engineering & Computer Science (AREA)
- Power Engineering (AREA)
- Storage Device Security (AREA)
Abstract
本发明实施例公开了一种检测C++虚表被hook的方法、装置、终端及可读介质,其中该方法包括:客户端获取只读数据rdata段,其中C++虚表存储于所述rdata段中;客户端利用预设的共享密钥,将rdata段进行加密,并发送至服务器;服务器根据加密结果检测所述C++虚表是否被hook,并将检测结果反馈至所述客户端。本发明实施例提供的一种检测C++虚表被hook的方法、装置、终端及可读介质,通过对rdata段的数据进行完整性校验,检测C++虚表是否被hook,从而保证了C++程序的安全性。
Description
技术领域
本发明实施例涉及计算机技术,尤其涉及一种检测C++虚表被hook的方法、装置、终端及可读介质。
背景技术
C++语言是一种面向对象的语言,易于处理大规模程序的问题,已广泛应用于程序开发中。C++语言可以通过提取虚表(Virtual Table,V-Table)中各虚函数(VirtualFunction)的地址调用虚函数,从而实现多态性。其中多态性可以理解为实现以共同的方法,但因个体差异,而采用不同的策略,具体可以通过父类指针调用其指向的子类成员函数。
现如今,黑客可以通过修改虚表中的虚函数地址实现了对虚表的hook,从而可以任意伪造某些函数的执行逻辑,例如可以实现在游戏中设置外挂,使病毒绕过安全检测等。因此,为保障C++程序的正确执行,对C++虚表进行检测尤为必要。
发明内容
有鉴于此,本发明实施例提供了一种检测C++虚表被hook的方法、装置、终端及可读介质,可以检测C++虚表是否被hook,从而保证了C++程序的安全性。
第一方面,本发明实施例提供了一种检测C++虚表被hook的方法,包括:
客户端获取只读数据rdata段,其中C++虚表存储于所述rdata段中;
所述客户端利用预设的共享密钥,将所述rdata段进行加密,并发送至服务器;
所述服务器根据加密结果检测所述C++虚表是否被hook,并将检测结果反馈至所述客户端。
可选的,所述客户端获取只读数据rdata段,包括:
获取模块定义文件,并根据模块定义文件对应的格式解析所述模块定义文件,得到各节点头信息;
遍历各节点头信息,并依据各节点头信息中的节点属性判断是否为rdata段;
若是,则获取rdata段的起始地址和内存大小,根据所述rdata段的起始地址和内存大小获取rdata段。
可选的,在所述客户端利用预设的共享密钥,将所述rdata段进行加密之前,还包括:
客户端按预设计算规则对所述rdata段进行哈希hash计算,得到hash结果;
相应的,所述将所述rdata段进行加密,包括:将所述rdata段的所述hash结果进行加密。
可选的,所述服务器根据加密结果检测所述C++虚表是否被hook,包括:
服务器对所述加密结果进行解密,得到解密结果,并判断所述解密结果与标准数据是否相匹配;
若否,则检测到所述C++虚表已被hook;
其中,所述标准数据为服务器按所述预设计算规则,对服务器内预先存储的所述rdata段进行hash计算得到的。
可选的,所述客户端按预设计算规则对所述rdata段进行哈希hash计算,得到hash结果,包括:
获取用户的信用值,并根据所述信用值选取加密等级;
根据所述加密等级选取对应数量的hash算法;
根据选取的对应数量的hash算法,分别对所述rdata段进行hash计算,并将各计算结果拼接为hash结果。
可选的,在所述根据所述加密等级选取对应数量的hash算法之后,还包括:
对所述rdata段进行分片,根据所述加密等级选取对应数量及位置的分片;
相应的,客户端根据选取的对应数量的hash算法,分别对选取的对应数量及位置的分片进行hash计算,并将各计算结果拼接为hash结果。
可选的,在所述客户端获取只读数据rdata段之前,还包括:
客户端生成第一公钥和第一私钥,并将所述第一公钥发送至所述服务器;
服务器生成第二公钥和第二私钥,并将所述第二公钥发送至所述客户端;
客户端根据所述第一私钥以及所述第二公钥生成第一共享密钥;
服务器根据所述第二私钥以及所述第一公钥生成第二共享密钥;
其中第一共享密钥的数值与第二共享密钥的数值一致,分别作为客户端与服务器的预设的共享密钥。
第二方面,本发明实施例提供了一种检测C++虚表被hook的装置,包括:
数据获取模块,配置于客户端,用于获取只读数据rdata段,其中C++虚表存储于所述rdata段中;
加密模块,配置于所述客户端,用于利用预设的共享密钥,将所述rdata段进行加密,并发送至服务器;
检测模块,配置于所述服务器,用于根据加密结果检测所述C++虚表是否被hook,并将检测结果反馈至所述客户端。
第三方面,本发明实施例提供了一种终端,包括:
一个或多个处理器;
存储器,用于存储一个或多个程序;
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如本发明任一实施例所述的检测C++虚表被hook的方法。
第四方面,本发明实施例提供了一种可读介质,其上存储有计算机程序,该程序被处理器执行时实现如本发明任一实施例所述的检测C++虚表被hook的方法。
本发明实施例提供的一种检测C++虚表被hook的方法、装置、终端及可读介质,客户端利用预设的共享密钥将获取的rdata段加密,并发送至服务器;服务器根据加密结果检测C++虚表是否被hook。通过对rdata段的数据进行完整性校验,检测C++虚表是否被hook,从而保证了C++程序的安全性。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图做一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例一提供的一种检测C++虚表被hook的方法流程图;
图2是本发明实施例二提供的一种检测C++虚表被hook的装置结构示意图;
图3是本发明实施例三提供的一种终端的结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,以下将参照本发明实施例中的附图,通过实施方式清楚、完整地描述本发明的技术方案,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
为更清楚的理解本发明实施例提供的一种检测C++虚表被hook的方法、装置、终端及可读介质,首先通过举例简单描述一下C++虚表hook的实现过程,具体如下:
1.编写一个父类。
父类名称是CParent,其中编写了一个虚函数PrintData,用来打印一条日志。
2.编写一个子类。
编写的子类名称是CChild,其重载了父类的PrintData,那么对于CChild的对象,在调用PrintData则都会调用到子类的对象。
3.具体使用。
创建一个子类的实例pBase,然后调用实例的PrintData函数,如下:
Base*pBase=new Child();
pBase->PrintData();
那么最终则会打印Child::PrintData的数据。
4.编写虚表的hook代码。
1)若将函数PrintData的代码执行逻辑替换成hook代码,则首先需要编写一个替换Child的虚表的类,实现伪造函数。
其中编写了一个CHOOK类,并且编写了一个和Child一样的函数PrintData,而其中的实现逻辑则是打印CHook::PrintData。
定义一个pBase的实例,然后获取pBase的虚表指针:
Base*pBase=new Child();
uint32_t*pTable=(uint32_t*)*(uint32_t*)pBase;
2)获取CHOOK类的PrintData的函数地址。
char buf[32]={0};
sprintf(buf,"%u",&CHook::PrintData);
uint32_t CHOOKPrintDataAddr=atoi(buf);
其中获取的CHOOK类的PrintData的函数地址存储在变量CHOOKPrintDataAddr中。
3)将rdata段的只读属性修改为可读写。
首先获取Child类的PrintData函数的地址:
uint32_t ChildPrintDataAddr=(uint32_t)&pTable[0];
然后修改该地址的内存只读属性为可以读写属性。
具体则通过调用***函数VirtualProtect,并且将属性修改成PAGE_READWRITE,则表示修改成可以读写的属性。
DWORD dwOldProtect=0;
::VirtualProtect((LPVOID)ChildPrintDataAddr,sizeof(uint32_t),PAGE_READWRITE,&dwOldProtect);
接下来则修改Child类的PrintData函数的地址为CHOOK类的PrintData的函数地址,从而实现了虚表hook的功能。
*(uint32_t*)ChildPrintDataAddr=CHOOKPrintDataAddr;
通过上述修改,如果程序中再去使用pBase实例来调用PrintData函数时,则会具体调用到CHOOK类的PrintData,从而实现了C++虚表的hook。
实施例一
图1是本发明实施例一提供的一种检测C++虚表被hook的方法流程图,本实施例可适用于检测C++虚表是否被hook的情况,该方法可以由终端实现,具体可通过终端中的软件和/或硬件来实施。
参见图1,该检测C++虚表被hook的方法包括如下步骤:
S110、客户端获取只读数据rdata段,其中C++虚表存储于rdata段中。
在C++代码中,每类虚函数都会存在一份虚表与之对应,用以存储该类虚函数的地址。一般情况下,程序编译器会将所有的虚表存储到程序的只读数据rdata段。客户端通过获取rdata段,并对rdata段的完整性进行校验,则可以检测出C++虚表是否被hook。
可选的,客户端获取只读数据rdata段,包括:
获取模块定义文件,并根据模块定义文件对应的格式解析模块定义文件,得到各节点头信息;遍历各节点头信息,并依据各节点头信息中的节点属性判断是否为rdata段;若是,则获取rdata段的起始地址和内存大小,根据rdata段的起始地址和内存大小获取rdata段。
其中,不同操作***相对应的模块定义文件不同,例如对Windows操作***来说模块定义文件是一个DLL文件,对于linux操作***来说模块定义文件则是一个SO文件。不同的模块定义文件,其格式不同,则解析方式也有所差异。
通过解析模块定义文件,可以获取各节点头信息;通过遍历各节点头信息,可判断节点属性判断是否为rdata段;若是,则获取rdata段的起始地址和内存大小,进而可获取到rdata段的数据;通过对rdata段的数据进行的完整性校验,则可以检测出C++虚表是否被hook。
示例性的,当操作***为Windows操作***时,其模块定义文件的DLL文件,通过解析DLL文件获取rdata段的具体步骤如下:
1.获取对应的DLL模块所在的内存起始地址。
DWORD dwStart=GetModuleHanlde(dll的名称);
通过调用***函数GetModuleHanlde并传入该DLL的名称则可以得到该DLL在内存的起始地址。
2.获取个节点头信息。
1)首先得到dos头。
pstDosHeader PIMAGE_DOS_HEADER pstDosHeader=(PIMAGE_DOS_HEADER)dwStart;
2)通过dos头来得到NT头。
PIMAGE_NT_HEADERS pstNtHeaders=(PIMAGE_NT_HEADERS)(dwStart+pstDosHeader->e_lfanew);
3)获取各节点的头信息。
PIMAGE_SECTION_HEADER pstSectionHeader=IMAGE_FIRST_SECTION(pstNtHeaders);
3.遍历每个节点信息,判断是否为rdata段。
for(int i=0;i<pstNtHeaders->FileHeader.NumberOfSections;i++,pstSectionHeader++)#其中,pstNtHeaders->FileHeader.NumberOfSections是节点的数目
{
if((IMAGE_SCN_MEM_READ|IMAGE_SCN_CNT_INITIALIZED_DATA)==pstSectionHeader->Characteristics)#依据节点属性判断是不是rdata节点
{
rdataStartLen=pstSectionHeader->Misc.VirtualSize;
rdataStartAddress=dwStart+pstSectionHeader->VirtualAddress;
break;
}#如果是则得到rdata段的起始地址和内存大小
}
其中得到rdata内存起始地址则是rdataStartAddress,其中得到rdata的内存大小则是rdataStartLen,通过rdata段的起始地址和内存大小获取rdata段则可获取到rdata段数据。
S120、客户端利用预设的共享密钥,将rdata段进行加密,并发送至服务器。
其中,为保证数据在网络传输中的安全性,需要对rdata段进行加密传输。其中,当rdata段的数据比较少时,可以利用预设的共享密钥对原始rdata段的数据进行加密,并将加密后的rdata段的数据上报至服务器。其中,加密算法可以是高级加密标准(AdvancedEncryption Standard,AES)、数据加密标准(Data Encryption Standard,DES)、三重数据加密标准(Triple DES,3DES)或国际数据加密算法(International Data EncryptionAlgorithm,IDEA)等,在此不做限定。
S130、服务器根据加密结果检测C++虚表是否被hook,并将检测结果反馈至客户端。
其中,服务器利用相同的预设的共享密钥以及客户端加密方法对应的解密算法对加密结果进行解密。其中,服务器将解密出的原始rdata段的数据与服务器预先存储的没有被修改过的rdata段的数据进行比对,若比对结果一致,则说明述C++虚表没有被hook;否比对结果不一致,则说明C++虚表已经被hook。
可选的,在客户端利用预设的共享密钥,将rdata段进行加密之前,还包括:
客户端按预设计算规则对rdata段进行哈希hash计算,得到hash结果;相应的,将rdata段进行加密,包括:将rdata段的hash结果进行加密。
相应的,服务器根据加密结果检测C++虚表是否被hook,包括:
服务器对加密结果进行解密,得到解密结果,并判断解密结果与标准数据是否相匹配;若否,则检测到C++虚表已被hook;其中,标准数据为服务器按预设计算规则,对服务器内预先存储的rdata段进行hash计算得到的。
其中,客户端除可将原始rdata段的加密数据发送至服务器外,还可以将原始rdata段的加密按预设规则进行hash计算,用于对rdata段的数据进行完整性校验。服务器可以根据同样的预设规则对已存储的rdata段的数据进行hash计算,并将计算结果与解密结果进行匹配,若匹配结果一致,则说明述C++虚表没有被hook;否比对结果不一致,则说明C++虚表已经被hook。
可选的,客户端按预设计算规则对rdata段进行哈希hash计算,得到hash结果,包括:
获取用户的信用值,并根据信用值选取加密等级;根据加密等级选取对应数量的hash算法;根据选取的对应数量的hash算法,分别对rdata段进行hash计算,并将各计算结果拼接为hash结果。
其中,为防止一种hash计算结果被黑客所绕过,可以使用多种hash算法对rdata段数据分别进行校验,从而得到多种hash算法的结果,将多种hash算法的结果进行拼接,生成hash结果,从而提高了rdata段的数据完整性的校验准确度,从而提高了检测C++虚表是否被hook的检测精度。
其中,预设规则可以是根据客户端登陆的用户信用值,对该客户端的rdata段的数据采取不同的hash计算方式;其中,预设规则可以以文档、表格或全局变量的形式进行存储;其中,预设规则中可以包括,用户信用值、加密等级、至少一种hash加密算法、用户信用值与加密等级的关系和加密等级对应的hash加密算法的数量和种类关系等。其中,预设规则不仅存储于客户端内,还存储于服务器内,当客户端登陆到服务器时,服务器可以获取用户的信用值,并将信用值反馈至客户端,以使客户端和服务器进行相同的hash计算方式,为后续服务器对客户端发送的加密数据进行校验奠定基础。
当客户端登陆的用户信用值高时,说明该用户没有hook C++虚表的不良记录,则加密等级可以为低等级,低等级对应的hash算法的数量少;当客户端登陆的用户信用值低时,说明该用户存在hook C++虚表的不良记录,则加密等级可以为高等级,高等级对应的hash算法的数量多。其中,科研人员可根据实际情况对用户的信用值、加密等级划分以及选取hash算法的数量和种类进行确定。其中,hash算法可以是安全散列算法(Secure HashAlgorithm,SHA)家族的五个算法,分别是SHA-1、SHA-224、SHA-256、SHA-384和SHA-512,也可以是其他算法,例如可以是MD5算法或CRC32算法等。
示例性的,当用户信用值高,加密等级为低等级,低等级对应的hash算法的数量可以是1个种类为SHA-1的hash计算:
Sha1Result=SHA1.Create(rdataStartAddress,rdataStartLen),则hash结果为Sha1Result。
当用户信用值低,加密等级为高等级,高等级对应的hash算法的数量可以是3个种类的hash计算,可以分别是SHA-256、MD5算法和CRC32算法:
sharesult=SHA-256.Create(rdataStartAddress,rdataStartLen);
md5result=Md5.Create(rdataStartAddress,rdataStartLen);
Crc32result=Crc32.Create(rdataStartAddress,rdataStartLen);
则hash结果为sharesult、md5result和Crc32result的拼接结果。
通过针对不同用户的信用值,采取不同的hash算法,实现了多样化的rdata段的数据完整性校验方案,不仅可以针对高信用值的用户缩短校验时间,提高校验效率,还可以保证低信用值的用户校验准确度,提高检测C++虚表是否被hook的检测精度。
可选的,在根据加密等级选取对应数量的hash算法之后,还包括:
对rdata段进行分片,根据加密等级选取对应数量及位置的分片;相应的,客户端根据选取的对应数量的hash算法,分别对选取的对应数量及位置的分片进行hash计算,并将各计算结果拼接为hash结果。
其中,每个分片大小可以由研发人员根据实际情况确定,例如可以是每1024*10个字节作为一个分片。其中,通过对rdata段数据进行分片,可以根据加密等级选取对应数量及位置的分片进行hash计算,并发送至服务器。服务器将已存储的rdata段的数据选取对应的数量及位置的分片进行校验,只有当每个分片的校验结果正确,才确定C++虚表没有被hook。通过对rdata段数据进行分片,不仅可以减少传输过程中的数据量,提升检测速度,还可以进一步增加检测的安全性以及准确性。
可选的,在客户端获取只读数据rdata段之前,还包括:
客户端生成第一公钥和第一私钥,并将所述第一公钥发送至所述服务器;
服务器生成第二公钥和第二私钥,并将所述第二公钥发送至所述客户端;
客户端根据所述第一私钥以及所述第二公钥生成第一共享密钥;
服务器根据所述第二私钥以及所述第一公钥生成第二共享密钥;
其中第一共享密钥的数值与第二共享密钥的数值一致,分别作为客户端与服务器的预设的共享密钥。
其中,当客户端登录到服务器时,服务器会为此客户端生成一对公钥私钥信息,即第二公钥和第二私钥;同时客户端也会自己生成一对公钥私钥信息,即第一公钥和第一私钥;客户端和服务器互换各自的公钥信息,即客户端将第一公钥发送至服务器,服务器将第二公钥发送至客户端,客户端根据第一私钥和第二公钥生成共享密钥,服务器根据第二私钥和第一公钥生成共享密钥,且两个共享密钥的数值一致。
其中,客户端可以使用随机数据和时间戳来生成第一私钥,利用第一私钥求取第一公钥,从而尽可能保障不同客户端对应不同的私钥和公钥,提高了破解的门槛。其中,客户端生成第一公钥的步骤可具体如下:
1.生成随机数据。
Randdata=rand();
通过调用***函数rand来生成一段随机数据Randdata。
2.时间戳和随机数生成其Md5值做为第一私钥。
ServerPrivatekey=Md5.Create(Randdata+timestamp)
通过调用Md5函数的接口Md5.Create来对随机数据和当前时间戳信息拼接到一起计算其Md5值,从而得到了第一私钥数据。
3.计算第一公钥。
ServerPublickey=RSA.CreatePair(ServerPrivatekey);
第一公钥则调用RSA的生成配对密钥接口RSA.CreatePair来生成。其中,除调用RSA外,还可以采用其他非对称算法,例如可以是Elgamal算法、背包算法或椭圆曲线加密算法(Elliptic curve cryptography,ECC)等。
其中,服务器在检测客户端登录时,可以使用客户端的用户信息、随机数据以及时间戳生成第二私钥,利用第二私钥求取第二公钥,从而尽可能保障不同客户端对应不同的私钥和公钥,提高了破解的门槛。其中,服务器生成第二公钥的步骤具体如下:
1.生成随机数据
Randdata=rand();
通过调用***函数rand来生成一段随机数据Randdata。
2.依据随机数生成其Md5值做为第二私钥。
ClientPrivatekey=Md5.Create(UserId+TimeStamp+randdata)
通过调用Md5函数的接口Md5.Create来对用户ID和随机数据和当前时间戳信息以及随机数拼接到一起计算其Md5值,从而得到了第二私钥数据。
3.计算第二公钥。
ClientPublickey=RSA.CreatePair(ClientPrivatekey);
第二公钥则调用RSA的生成配对钥匙接口RSA.CreatePair来生成。其中,除调用RSA外,还可以采用其他非对称算法,例如可以是Elgamal算法、背包算法或椭圆曲线加密算法(Elliptic curve cryptography,ECC)等。
其中,客户端和服务器分别根据第一公钥和第二公钥生成共享密钥,具体步骤如下:
1.互换公钥。
服务器将第二公钥ServerPublickey发送给客户端。
客户端将第一公钥ClientPublickey发送给服务器。
2.服务器生成共享密钥。
ShareKey=RSA.CreateShareKey(ClientPublickey,serverPrivatekey);
3.客户端生成共享密钥。
ShareKey=RSA.CreateShareKey(ServerPublickey,ClientPrivatekey);
其中,服务器生成的共享密钥和客户端生成的共享密钥2个ShareKey的值是一致的。通过共享密钥设置,可以保障数据传输的安全性。
本实施例提供的检测C++虚表被hook的方法,客户端利用预设的共享密钥将获取的rdata段加密,并发送至服务器;服务器根据加密结果检测C++虚表是否被hook。通过对rdata段的数据进行完整性校验,检测C++虚表是否被hook,从而保证了C++程序的安全性。
实施例二
图2是本发明实施例二提供的一种检测C++虚表被hook的装置结构示意图,本实施例可适用于检测C++虚表是否被hook的情况。
参见图2,本实施例中检测C++虚表被hook的装置,包括:
数据获取模块210,配置于客户端,用于获取只读数据rdata段,其中C++虚表存储于rdata段中;
加密模块220,配置于客户端,用于利用预设的共享密钥,将rdata段进行加密,并发送至服务器;
检测模块230,配置于服务器,用于根据加密结果检测C++虚表是否被hook,并将检测结果反馈至客户端。
可选的,数据获取模块210,具体用于:
获取模块定义文件,并根据模块定义文件对应的格式解析模块定义文件,得到各节点头信息;遍历各节点头信息,并依据各节点头信息中的节点属性判断是否为rdata段;若是,则获取rdata段的起始地址和内存大小,根据rdata段的起始地址和内存大小获取rdata段。
可选的,检测C++虚表被hook的装置,还包括:
哈希计算模块,配置于客户端,用于按预设计算规则对rdata段进行哈希hash计算,得到hash结果;相应的,加密模块220将rdata段的hash结果进行加密,并发送至服务器。
相应的,检测模块230,具体用于:
对加密结果进行解密,得到解密结果,并判断解密结果与标准数据是否相匹配;若否,则检测到C++虚表已被hook;其中,标准数据为服务器按预设计算规则,对服务器内预先存储的rdata段进行hash计算得到的。
可选的,哈希计算模块,具体用于:
获取用户的信用值,并根据信用值选取加密等级;根据加密等级选取对应数量的hash算法;根据选取的对应数量的hash算法,分别对rdata段进行hash计算,并将各计算结果拼接为hash结果。
可选的,哈希计算模块,还具体用于:
在根据加密等级选取对应数量的hash算法之后,对rdata段进行分片,根据加密等级选取对应数量及位置的分片;根据选取的对应数量的hash算法,分别对选取的对应数量及位置的分片进行hash计算,并将各计算结果拼接为hash结果。
可选的,检测C++虚表被hook的装置,还包括:
第一公钥对生成模块,配置于客户端,用于生成第一公钥和第一私钥,并将所述第一公钥发送至所述服务器;
第二公钥对生成模块,配置于服务器,用于生成第二公钥和第二私钥,并将所述第二公钥发送至所述客户端;
第一共享密钥生成模块,配置于客户端,用于根据所述第一私钥以及所述第二公钥生成第一共享密钥;
第二共享密钥生成模块,配置于服务器,用于根据所述第二私钥以及所述第一公钥生成第二共享密钥;
其中,第一共享密钥的数值与第二共享密钥的数值一致,分别作为客户端与服务器的预设的共享密钥。
本实施例提供的检测C++虚表被hook的装置,与实施例一提出的检测C++虚表被hook的方法属于同一发明构思,未在本实施例中详尽描述的技术细节可参见实施例一,并且本实施例与实施例一具有相同的有益效果。
实施例三
本实施例提供了一种终端,可以用于检测C++虚表是否被hook的情况。图3是本发明实施例三提供的一种终端的结构示意图。参见图3,该终端包括:
一个或多个处理器310;
存储器320,用于存储一个或多个程序;
当所述一个或多个程序被所述一个或多个处理器310执行,使得所述一个或多个处理器310实现如实施例一提出的检测C++虚表被hook的方法。
图3中以一个处理器310为例;处理器310和存储器320可以通过总线或其他方式连接,图3中以通过总线连接为例。
存储器320作为一种计算机可读存储介质,可用于存储软件程序、计算机可执行程序以及模块,如本发明实施例中的检测C++虚表被hook的方法对应的程序指令/模块。处理器310通过运行存储在存储器320中的软件程序、指令以及模块,从而执行终端的各种功能应用以及数据处理,即实现上述的检测C++虚表被hook的方法。
存储器320可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作***、至少一个功能所需的应用程序;存储数据区可存储根据终端的使用所创建的数据等。此外,存储器320可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实例中,存储器320可进一步包括相对于处理器310远程设置的存储器,这些远程存储器可以通过网络连接至终端。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
本实施例提出的终端与实施例一提出的检测C++虚表被hook的方法属于同一发明构思,未在本实施例中详尽描述的技术细节可参见实施例一,并且本实施例与实施例一具有相同的有益效果。
实施例四
本实施例提供一种可读介质,其上存储有计算机程序,该程序被处理器执行时实现如实施例一提出的检测C++虚表被hook的方法。
本实施例提出的可读介质与实施例一提出的检测C++虚表被hook的方法属于同一发明构思,未在本实施例中详尽描述的技术细节可参见实施例一,并且本实施例与实施例一具有相同的有益效果。
通过以上关于实施方式的描述,所属领域的技术人员可以清楚地了解到,本发明可借助软件及必需的通用硬件来实现,当然也可以通过硬件实现,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如计算机的软盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(RandomAccess Memory,RAM)、闪存(FLASH)、硬盘或光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。
Claims (10)
1.一种检测C++虚表被hook的方法,其特征在于,包括:
客户端获取只读数据rdata段,其中C++虚表存储于所述rdata段中;
所述客户端利用预设的共享密钥,将所述rdata段进行加密,并发送至服务器;
所述服务器根据加密结果检测所述C++虚表是否被hook,并将检测结果反馈至所述客户端。
2.根据权利要求1所述的方法,其特征在于,所述客户端获取只读数据rdata段,包括:
获取模块定义文件,并根据模块定义文件对应的格式解析所述模块定义文件,得到各节点头信息;
遍历各节点头信息,并依据各节点头信息中的节点属性判断是否为rdata段;
若是,则获取rdata段的起始地址和内存大小,根据所述rdata段的起始地址和内存大小获取rdata段。
3.根据权利要求1所述的方法,其特征在于,在所述客户端利用预设的共享密钥,将所述rdata段进行加密之前,还包括:
客户端按预设计算规则对所述rdata段进行哈希hash计算,得到hash结果;
相应的,所述将所述rdata段进行加密,包括:将所述rdata段的所述hash结果进行加密。
4.根据权利要求3所述的方法,其特征在于,所述服务器根据加密结果检测所述C++虚表是否被hook,包括:
服务器对所述加密结果进行解密,得到解密结果,并判断所述解密结果与标准数据是否相匹配;
若否,则检测到所述C++虚表已被hook;
其中,所述标准数据为服务器按所述预设计算规则,对服务器内预先存储的所述rdata段进行hash计算得到的。
5.根据权利要求3所述的方法,其特征在于,所述客户端按预设计算规则对所述rdata段进行哈希hash计算,得到hash结果,包括:
获取用户的信用值,并根据所述信用值选取加密等级;
根据所述加密等级选取对应数量的hash算法;
根据选取的对应数量的hash算法,分别对所述rdata段进行hash计算,并将各计算结果拼接为hash结果。
6.根据权利要求5所述的方法,其特征在于,在所述根据所述加密等级选取对应数量的hash算法之后,还包括:
对所述rdata段进行分片,根据所述加密等级选取对应数量及位置的分片;
相应的,客户端根据选取的对应数量的hash算法,分别对选取的对应数量及位置的分片进行hash计算,并将各计算结果拼接为hash结果。
7.根据权利要求1所述的方法,其特征在于,在所述客户端获取只读数据rdata段之前,还包括:
客户端生成第一公钥和第一私钥,并将所述第一公钥发送至所述服务器;
服务器生成第二公钥和第二私钥,并将所述第二公钥发送至所述客户端;
客户端根据所述第一私钥以及所述第二公钥生成第一共享密钥;
服务器根据所述第二私钥以及所述第一公钥生成第二共享密钥;
其中第一共享密钥的数值与第二共享密钥的数值一致,分别作为客户端与服务器的预设的共享密钥。
8.一种检测C++虚表被hook的装置,其特征在于,包括:
数据获取模块,配置于客户端,用于获取只读数据rdata段,其中C++虚表存储于所述rdata段中;
加密模块,配置于所述客户端,用于利用预设的共享密钥,将所述rdata段进行加密,并发送至服务器;
检测模块,配置于所述服务器,用于根据加密结果检测所述C++虚表是否被hook,并将检测结果反馈至所述客户端。
9.一种终端,其特征在于,所述终端包括:
一个或多个处理器;
存储器,用于存储一个或多个程序;
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如权利要求1-7中任一所述的检测C++虚表被hook的方法。
10.一种可读介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求1-7中任一所述的检测C++虚表被hook的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810530628.0A CN108880785B (zh) | 2018-05-25 | 2018-05-25 | 一种检测C++虚表被hook的方法、装置、终端及可读介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810530628.0A CN108880785B (zh) | 2018-05-25 | 2018-05-25 | 一种检测C++虚表被hook的方法、装置、终端及可读介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108880785A true CN108880785A (zh) | 2018-11-23 |
CN108880785B CN108880785B (zh) | 2021-07-23 |
Family
ID=64335562
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810530628.0A Active CN108880785B (zh) | 2018-05-25 | 2018-05-25 | 一种检测C++虚表被hook的方法、装置、终端及可读介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108880785B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116318686A (zh) * | 2023-05-17 | 2023-06-23 | 成都赛力斯科技有限公司 | 一种数据加密传输方法、装置、电子设备及存储介质 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7784034B1 (en) * | 2005-12-21 | 2010-08-24 | Mcafee, Inc. | System, method and computer program product for hooking a COM interface |
US20130080673A1 (en) * | 2011-09-26 | 2013-03-28 | Oracle International Corporation | Validating message-signaled interrupts |
CN105808251A (zh) * | 2016-03-03 | 2016-07-27 | 武汉斗鱼网络科技有限公司 | 一种基于虚函数表劫持绕过安全检测的方法与*** |
CN105868641A (zh) * | 2016-04-01 | 2016-08-17 | 北京理工大学 | 基于虚函数表劫持的防御方法 |
CN107194250A (zh) * | 2017-03-31 | 2017-09-22 | 武汉斗鱼网络科技有限公司 | 内存代码的完整性校验方法及装置 |
CN107480068A (zh) * | 2017-08-22 | 2017-12-15 | 武汉斗鱼网络科技有限公司 | 代码完整性检测方法、装置、电子终端及可读存储介质 |
CN107948212A (zh) * | 2018-01-10 | 2018-04-20 | 武汉斗鱼网络科技有限公司 | 一种日志的处理方法及装置 |
-
2018
- 2018-05-25 CN CN201810530628.0A patent/CN108880785B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7784034B1 (en) * | 2005-12-21 | 2010-08-24 | Mcafee, Inc. | System, method and computer program product for hooking a COM interface |
US20130080673A1 (en) * | 2011-09-26 | 2013-03-28 | Oracle International Corporation | Validating message-signaled interrupts |
CN105808251A (zh) * | 2016-03-03 | 2016-07-27 | 武汉斗鱼网络科技有限公司 | 一种基于虚函数表劫持绕过安全检测的方法与*** |
CN105868641A (zh) * | 2016-04-01 | 2016-08-17 | 北京理工大学 | 基于虚函数表劫持的防御方法 |
CN107194250A (zh) * | 2017-03-31 | 2017-09-22 | 武汉斗鱼网络科技有限公司 | 内存代码的完整性校验方法及装置 |
CN107480068A (zh) * | 2017-08-22 | 2017-12-15 | 武汉斗鱼网络科技有限公司 | 代码完整性检测方法、装置、电子终端及可读存储介质 |
CN107948212A (zh) * | 2018-01-10 | 2018-04-20 | 武汉斗鱼网络科技有限公司 | 一种日志的处理方法及装置 |
Non-Patent Citations (1)
Title |
---|
罗雨青: "《启动型恶意代码分析与检测综述》", 《计算机应用与软件》 * |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116318686A (zh) * | 2023-05-17 | 2023-06-23 | 成都赛力斯科技有限公司 | 一种数据加密传输方法、装置、电子设备及存储介质 |
CN116318686B (zh) * | 2023-05-17 | 2023-09-05 | 成都赛力斯科技有限公司 | 一种数据加密传输方法、装置、电子设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN108880785B (zh) | 2021-07-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110493202B (zh) | 登录令牌的生成及验证方法、装置和服务器 | |
CN110400221B (zh) | 数据处理方法、***、存储介质及计算机设备 | |
CN109643285B (zh) | 加密的用户数据传输及储存 | |
EP3356988B1 (en) | Method and system for verifiable searchable symmetric encryption | |
Millen et al. | Constraint solving for bounded-process cryptographic protocol analysis | |
CN107770159B (zh) | 车辆事故数据记录方法及相关装置、可读存储介质 | |
Bessani et al. | DepSpace: a Byzantine fault-tolerant coordination service | |
KR20190052631A (ko) | 물리적으로 복제 불가능한 기능의 원격 재등록 | |
US10073980B1 (en) | System for assuring security of sensitive data on a host | |
CN111125781B (zh) | 一种文件签名方法、装置和文件签名验证方法、装置 | |
CN110096894B (zh) | 一种基于区块链的数据匿名共享***及方法 | |
CN113542253A (zh) | 一种网络流量检测方法、装置、设备及介质 | |
Poston | Mapping the OWASP top ten to blockchain | |
Bhargavan et al. | Verified implementations of the information card federated identity-management protocol | |
CN115001715B (zh) | 基于区块链的加密智能合约检测方法及终端 | |
CN110008719A (zh) | 一种文件处理、文件检测方法及装置 | |
CN109614789A (zh) | 一种终端设备的验证方法及设备 | |
CN115473703A (zh) | 认证的基于身份的密文等值测试方法、装置、***及介质 | |
Zhang et al. | Formal analysis of QUIC handshake protocol using ProVerif | |
CN111475690B (zh) | 字符串的匹配方法和装置、数据检测方法、服务器 | |
CN115550060B (zh) | 基于区块链的可信证书验证方法、装置、设备和介质 | |
CN113296737A (zh) | 随机数的生成***、方法、装置和云端服务器 | |
CN108880785A (zh) | 一种检测C++虚表被hook的方法、装置、终端及可读介质 | |
Cheval | Automatic verification of cryptographic protocols: privacy-type properties | |
CN115225365A (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 |