CN113010855B - 一种获取数据的方法、装置、介质及计算机设备 - Google Patents

一种获取数据的方法、装置、介质及计算机设备 Download PDF

Info

Publication number
CN113010855B
CN113010855B CN201911305446.4A CN201911305446A CN113010855B CN 113010855 B CN113010855 B CN 113010855B CN 201911305446 A CN201911305446 A CN 201911305446A CN 113010855 B CN113010855 B CN 113010855B
Authority
CN
China
Prior art keywords
code
creating
address
data
assembly
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
Application number
CN201911305446.4A
Other languages
English (en)
Other versions
CN113010855A (zh
Inventor
周志刚
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Wuhan Douyu Network Technology Co Ltd
Original Assignee
Wuhan Douyu Network Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Wuhan Douyu Network Technology Co Ltd filed Critical Wuhan Douyu Network Technology Co Ltd
Priority to CN201911305446.4A priority Critical patent/CN113010855B/zh
Publication of CN113010855A publication Critical patent/CN113010855A/zh
Application granted granted Critical
Publication of CN113010855B publication Critical patent/CN113010855B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/14Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/72Code refactoring

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Multimedia (AREA)
  • Technology Law (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • Storage Device Security (AREA)

Abstract

本发明实施例提供了一种获取数据的方法、装置、介质及计算机设备,方法包括:根据预设的创建策略创建汇编代码;将汇编代码存储在被调用程序模块中的代码节中;根据预设的传输规则创建汇编代码包括:创建汇编代码的起始代码;创建原始代码;创建浮点运算的运算指令;创建特征代码;创建存储器容器地址的地址代码;创建随机代码生成指令,随机代码生成指令用于使得每次创建的所述特征代码不同;创建汇编代码的结束代码;将待调用数据的存储地址隐藏在创建的汇编代码中,提高了存储地址的隐蔽性,并且因汇编代码中每次创建的特征代码是不同的,进而提高了非正常应用的破解难度,确保了数据的安全性。

Description

一种获取数据的方法、装置、介质及计算机设备
技术领域
本发明涉及数据传输技术领域,尤其涉及一种获取数据的方法、装置、介质及计算机设备。
背景技术
目前在软件开发中,对于有些应用程序来说,需要在多个程序模块中进行数据传输,但这些数据又是安全相关的数据,不希望被其他人或者病毒程序获取到。
现有技术中,是通过在被调用程序模块中增加一个接口,外部模块可以通过该接口调用被调用程序模块中的数据。但是该接口也极容易被第三方获取,进而对该接口进行逆向分析,获取到数据。这样就导致数据被非法获取,导致数据的安全性得不到保证。
发明内容
针对现有技术存在的问题,本发明实施例提供了一种获取数据的方法、装置、介质及计算机设备,用于解决现有技术中程序模块在传输数据时,数据容易被第三方获取,导致数据安全性得不到确保的技术问题。
本发明实施例提供一种获取数据的方法,应用在被调用程序模块中,所述方法包括:
根据预设的创建策略创建汇编代码,所述汇编代码用于隐藏待调用数据的存储地址;
将所述汇编代码存储在被调用程序模块中的代码节中;其中,所述根据预设的创建策略创建汇编代码,包括:
创建所述汇编代码的起始代码;
创建原始代码,所述原始代码包括:目标函数的代码;
创建浮点运算的运算指令;
创建特征代码,所述特征代码用于确定所述汇编代码在被调用程序模块代码节中的起始地址;
创建存储器容器地址的地址代码,所述存储容器用于存储待调用数据,所述地址代码用于指示所述存储容器地址;
创建随机代码生成指令,所述随机代码生成指令用于使得每次创建的所述特征代码不同;
创建所述汇编代码的结束代码。
可选地,所述根据预设的创建策略创建汇编代码之前,包括:
利用预设的加密算法所述待调用数据进行加密;
将加密后的所述待调用数据存储在存储容器中,所述存储容器是以键值对的方式对所述待调用数据进行存储的map容器。
可选地,所述创建所述汇编代码的起始代码时,包括:
将所述被调用程序模块中的通用寄存器及符号寄存器压入堆栈中。
可选地,所述创建浮点运算的运算指令后,包括:
将所述浮点运算的运算指令存储至预设的第一寄存器中,所述第一寄存器中的代码为所述汇编代码的分支代码;
将所述第一寄存器的值赋值为预设的标识值,所述预设的标识值用于标识所述第一寄存器中的所述分支代码为无需被执行运算的代码。
可选地,所述创建特征代码,包括:
接收调用程序模块发送的特征字符串;
将所述特征字符串复制到第一寄存器中;
将所述第一寄存器压入堆栈中,以能将所述特征字符串转换为所述特征代码;
提取所述第一寄存器中的所述特征代码。
可选地,所述创建存储器容器地址的地址代码,包括:
加密所述存储器容器地址;
将预设的第二寄存器的原始数据压入堆栈中;
利用所述第二寄存器存储所述加密后的存储器容器地址。
可选地,所述创建随机代码生成指令后,包括:
将所述随机代码生成指令存储在第一寄存器中,所述第一寄存器中的代码为所述汇编代码的分支代码;
将所述第一寄存器的值赋值为预设的标识值,所述预设的标识值用于标识所述第一寄存器中的所述分支代码为无需被执行运算的代码。
本发明还提供一种获取数据的装置,应用在被调用程序模块中,所述装置包括:
创建单元,用于根据预设的创建策略创建汇编代码,所述汇编代码用于隐藏待调用数据的存储地址;
存储单元,用于将所述汇编代码存储在被调用程序模块中的代码节中;其中,所述创建单元具体用于:
创建所述汇编代码的起始代码;
创建原始代码,所述原始代码包括:目标函数的代码;
创建浮点运算的运算指令;
创建特征代码,所述特征代码用于确定所述汇编代码在被调用程序模块代码节中的起始地址;
创建存储器容器地址的地址代码,所述存储容器用于存储待调用数据,所述地址代码用于指示所述存储容器地址;
创建随机代码生成指令,所述随机代码生成指令用于使得每次创建的所述特征代码不同;
创建所述汇编代码的结束代码。
本发明还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述任一项所述的方法。
本发明还提供一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现上述任一项所述的方法。
本发明实施例提供了一种获取数据的方法、装置、介质及计算机设备,方法包括:根据预设的创建策略创建汇编代码,所述汇编代码用于隐藏待调用数据的存储地址;将所述汇编代码存储在被调用程序模块中的代码节中;其中,所述根据预设的创建策略创建汇编代码,包括:创建所述汇编代码的起始代码;创建原始代码,所述原始代码包括:目标函数的代码;创建浮点运算的运算指令;创建特征代码,所述特征代码用于确定所述汇编代码在被调用程序模块代码节中的起始地址;创建存储器容器地址的地址代码,所述存储容器用于存储待调用数据,所述地址代码用于指示所述存储容器地址;创建随机代码生成指令,所述随机代码生成指令用于使得每次创建的所述特征代码不同;创建所述汇编代码的结束代码;如此,将待调用数据的存储地址隐藏在创建的汇编代码中,提高了存储地址的隐蔽性,并且因汇编代码中每次创建的特征代码是不同的,进而提高了非正常应用的破解难度,避免在通过接口调用数据时,接口容易被非正常应用破解,确保了数据的安全性。
附图说明
图1为本发明实施例一提供的获取数据的方法流程示意图;
图2为本发明实施例二提供的获取数据的装置结果示意图;
图3为本发明实施例提供的获取数据的计算机设备结构示意图;
图4为本发明实施例提供的获取数据的计算机介质结构示意图。
具体实施方式
为了解决现有技术中程序模块在传输数据时,数据容易被第三方获取,导致数据安全性得不到确保的技术问题,本发明提供了一种获取数据的方法、装置、介质及计算机设备,方法包括:根据预设的创建策略创建汇编代码,所述汇编代码用于隐藏待调用数据的存储地址;将所述汇编代码存储在被调用程序模块中的代码节中;其中,所述根据预设的创建策略创建汇编代码,包括:创建所述汇编代码的起始代码;创建原始代码,所述原始代码包括:目标函数的代码;创建浮点运算的运算指令;创建特征代码,所述特征代码用于确定所述汇编代码在被调用程序模块代码节中的起始地址;创建存储器容器地址的地址代码,所述存储容器用于存储待调用数据,所述地址代码用于指示所述存储容器地址;创建随机代码生成指令,所述随机代码生成指令用于使得每次创建的所述特征代码不同;创建所述汇编代码的结束代码。
下面通过附图及具体实施例对本发明的技术方案做进一步的详细说明。
实施例一
本实施例提供一种获取数据的方法,如图1所示,方法包括:
S110,根据预设的创建策略创建汇编代码,所述汇编代码用于隐藏待调用数据的存储地址;
一般来说,调用程序模块在调用被调用程序模块中的数据时,均是通过相关的数据接口进行调用,那么非正常应用在破解时的常规思维是对数据接口进行逆向分析,获取数据。因此本申请为了避免对数据接口进行破解,在数据调用时,并不会为被调用程序模块设置数据接口,而是根据预设的创建策略创建汇编代码,将待调用数据的存储地址设置在汇编代码中,利用汇编代码隐藏待调用数据的存储地址。
那么根据预设的创建策略创建汇编代码之前,包括:
利用预设的加密算法对待调用数据的指针进行加密,以能提高逆向分析的难度,提高数据的安全性。其中,加密算法可以包括:RAS加密算法、DES加密算法及哈希加密算法等,具体的加密方法不做限制,具体实现方式为Encrypt(data,4,secret);data为待调用数据的指针,secret为密码。
然后将加密后的将待调用数据存储在存储容器中,本实施例为了提高数据破解难度,提高数据的安全性,是利用树结构的存储容器,比如map容器,map容器是以键值对的方式对数据进行存储的。
map容器的结构为:Map<int,char>mapdata;其中,int为键值序号,char为键值内容,即为存储的数据,Mapdata为存储器地址指针。具体存储方式可以为:mapdata[0]=‘h’;mapdata[1]=‘e’;mapdata[2]=‘l’。
这里,因创建的汇编代码与程序模块中正常的代码是有区别的,所以需要预先定义汇编代码的协议接口类,使得创建的汇编代码与正常的代码不会产生冲突。协议接口类如下:
Virtual void CreateStart(string&code){}=0;编写代码的开头。
Virtual void CopyCode(string&code,string othercode){}=0;编写一个拷贝原始代码的功能。
Virtual void CreateFloatCode(string&code,int len){}=0;编写一个生成浮点指令的代码功能。
Virtual void CreateAsmCode(string&code,string str,int len){}=0;编写一个生成正常特征代码指令的功能。
Virtual void CreateAddressCode(string&code,Map<int,char>*mapdata){}=0;编写一个存储数据地址的代码。
Virtual void CreateRandCode(string&code,int len){}=0;编写一个生成随机代码指令的功能。
Virtual void CreateEnd(string&code){}=0;编写代码的结尾。
需要说明的是,防止使用者因为漏调接口或者因为调用接口的顺序错误导致最终生成的特征代码出现问题,还需创建代码的总入口,总入口用于调用各个分入口,实现如下:
Virtual void CreateCode(string&code,string othercode,int len2,stringstr,int len3,Map<int,char>*mapdata,int len4)。
那么按照上述创建策略,根据预设的创建策略创建汇编代码,具体包括:
S10,创建所述汇编代码的起始代码;
S11,创建原始代码,所述原始代码包括:目标函数的代码;
S12,创建浮点运算的运算指令;
S13,创建特征代码,所述特征代码用于确定所述汇编代码在被调用程序模块代码节中的起始地址;
S14,创建存储器容器地址的地址代码,所述存储容器用于存储待调用数据,所述地址代码用于指示所述存储容器地址;
S15,创建随机代码生成指令,所述随机代码生成指令用于使得每次创建的所述特征代码不同;
S16,创建所述汇编代码的结束代码;
具体的程序实现如下:
CreateStart(code);首先创建汇编代码的开头代码。
CopyCode(code,othercode);拷贝原始代码。
CreateFloatCode(code,len2);创建浮点运算的汇编代码。
CreateAsmCode(code,str,len3);创建汇编特征代码。
CreateRandCode(code,len4);创建随机代码。
CreateAddressCode(code,mapdata);创建存储容器地址的汇编代码。
CreateEnd(code);创建汇编代码的结尾代码。
}
}
汇编代码创建完成之后,那么待调用数据的存储地址及特种代码是隐藏在创建的汇编代码的结束位置中的,提高了存储地址的隐蔽性。调用程序模块在获取待调用数据时,只需根据代码节的节名称确定代码节的起始地址和大小,解析被调用程序模块的代码节,从代码节开始搜索所有的代码,根据特征代码标识来定位上述创建的特征代码,再根据特征代码从代码节中找到整段汇编代码的起始地址,就可以在汇编代码的结束位置找到带调用数据的存储地址,进而获取到带调用数据。
可以看出,这种获取数据的方式完全避开了数据接口,避免现有技术在通过接口调用数据时,接口容易被非正常应用破解,确保了数据的安全性。
这里,因汇编代码没有经过编译器优化,会原封不动的通过CPU来执行,所以必须保证汇编代码的逻辑正确,并且确保不会对现有正常代码造成影响。因此,所述创建汇编代码的起始代码时,包括:将所述被调用程序模块中原有的通用寄存器及符号寄存器压入堆栈中。将被调用程序模块中的通用寄存器及符号寄存器压入堆栈中后,在执行汇编代码时,通用寄存器及符号寄存器就不会被执行,因此可以确保被调用程序模块中正常代码的功能,具体的程序实现如下:
class CAsmCode{
Virtual void CreateStart(string&code){
Code.push_back(“asm{”);标示内嵌汇编,后续的代码都是汇编代码。
Code.push_back(“pushad”);将通用寄存器都压入堆栈中。
Code.push_back(“Pushfd”);将符号寄存器都压入堆栈中。
}
为了使得汇编代码具有真有的上下文代码特征,避免汇编代码与其他正常代码不同,提高隐蔽效果,因此在创建汇编代码的起始代码后,还需创建原始代码,原始代码可以包括目标函数的代码。也就是说可以将其他任意函数的代码当做原始代码拷贝至当前创建的汇编代码中,程序实现如下:
Virtual void CopyCode(string&code,string othercode){
Std::strcpy(code,othercode);
}
原始代码创建好之后,为了提高汇编代码的复杂度,提高破解难度,还需创建浮点运算的运算指令。这里因浮点运算指令比正常的整数运算指令复杂很多,而且其不易于逆向分析,因此在汇编代码中添加浮点运算指令可以增加汇编代码的复杂度。
但是为了保证正常代码的功能,浮点运算指令并不需要被执行,因此作为一种可选的实施例,所述创建浮点运算的运算指令后,包括:
将所述浮点运算的运算指令存储至预设的第一寄存器中,所述第一寄存器中的代码为所述汇编代码的分支代码;
将所述第一寄存器的值赋值为预设的标识值,所述预设的标识值用于标识所述第一寄存器为无需被执行运算的寄存器。这样,浮点运算的运算指令就不会被执行,进而不会影响正常代码的功能。其中,第一寄存器可以为eax,预设的标识值可以为1。程序实现如下:
Code.push_back(“Push eax”);
Code.push_back(“move eax,1”);将eax赋值为1
创建浮点运算指令的程序实现如下:
Code.push_back(“Pop eax”);
For(int i=0;i<len;i++){
Code.push_back(“fild data”);
Code.push_back(“fild data2”);
Code.push_back(“fmul”);
Code.push_back(“fmul”);
Code.push_back(“fdivp”);
Code.push_back(“fid data3”);
Code.push_back(“fcomp data4”);
}
}
浮点运算指令创建好之后,创建特征代码,所述特征代码用于确定所述汇编代码在被调用程序模块代码节中的起始地址,以能使得调用程序模块可以根据起始地址查找到该汇报代码。
为了提高破解难度及隐蔽性,本实施例中每次创建的特征代码均是不同的,作为一种可选的实施例,所述创建特征代码,包括:
接收调用程序模块发送的特征字符串,这里因特征字符串是调用程序模块发送的,而每个调用程序模块可以发送不同的特征字符串,这样每次生成的特征代码就处于一个动态的变化中,因此可以提高破解难度;
将所述特征字符串复制到第一寄存器中,将所述第一寄存器压入堆栈中,以能将所述特征字符串转换为所述特征代码,这样被调用程序模块生成的特征代码每次都可以是不同的;
提取第一寄存器中提的所述特征代码,得到不同的特征代码。
这里,在将所述特征字符串复制到第一寄存器中之前,为了不影响第一寄存器中原始数据的功能,需要将第一寄存器中的原始数据压入到堆栈中。其中,创建特征代码的程序实现如下:
Virtual void CreateAsmCode(string&code,string str,int len){
Code.push_back(“push eax”);
For(int i=0;i<len;i++){编写一个循环来对将特征字符串转换为特征代码。
Code.push_back(“move eax,str[i]”);首先将特征字符串复制到eax寄存器中。
Code.push_back(“push eax”);然后我们将eax寄存器压入堆栈中。
}
完成之后,由于堆栈中多压入了一段特征代码,因此为了确保堆栈的平衡,需要提取出堆栈中的特征代码,提取之后,并将第一寄存器中的原始数据进行还原。程序实现如下:
For(int i=0;i<len;i++){
Code.push_back(“pop eax”);将特征代码从堆栈中还原。
}
Code.push_back(“pop eax”);还原eax寄存器的值。
}
特征代码创建好之后,为了可以使得调用程序模块可以得知待调用数据的存储地址,在特征代码中将待调用数据的存储地址进行引用,为了确保数据的安全性,还需对存储地址进行加密,那么作为一种可选的实施例,创建存储器容器地址的地址代码,包括:
加密所述存储器容器地址,以提高数据的破解难度,提高数据的安全性;
将预设的第二寄存器的原始数据压入堆栈中,避免影响第二寄存器中原始数据的功能;
利用所述第二寄存器存储所述加密后的存储器容器地址,以能生成对应的地址代码;
生成地址代码之后,还原所述第二寄存器的原始数据,确保第二寄存器的原始数据可以被执行。
这里,加密所述存储器容器地址的加密算法与加密待调用数据的加密算法相同。并且因通常的esp寄存器是用于保存函数的调用堆栈的起始地址,用户执行函数的返回,通常编译器不会使用esp寄存器,所以本文使用的第二寄存器可以为esp寄存器,当然也可以为其他寄存器,在此不做限定。
创建存储器容器地址的地址代码的程序实现如下:
Virtual void CreateAddressCode(string&code,Map<int,char>*mapdata){
Decrypt(mapdata,4,secret);其中密钥则是之前加密使用的密钥。
Code.push_back(“push esp”);先将esp寄存器的原始数据压入堆栈。
Code.push_back(“move esp,mapdata”);然后使用esp寄存器来转存mapdata地址,mapdata为数据存储容器的地址。
Code.push_back(“pop esp”);还原esp寄存器的值。
}
进一步地,如上文所述,为了使得每次创建的特征代码处于变化中,提高破译的难度,在创建存储器容器地址的地址代码后,还需创建随机代码生成指令,以能根据随机代码生成指令将每次创建的特征代码是不同的。
同样的原因,为了确保被调用程序模块中的正常代码不受影响,随机代码生成指令也是不允许执行的,因此创建随机代码生成指令后,包括:将所述随机代码生成指令存储在第一寄存器中。
这里,随机代码生成指令可以通过汇编指令集来确定。
具体的程序实现如下:
Virtual void CreateRandCode(string&code,int len){创建随机代码生成指令。
Code.push_back(“Push eax”);
Code.push_back(“move eax,1”);将eax赋值为1
Code.push_back(“cmp eax,0”);当判断eax为0时,再执行后续代码
For(int i=0;i<len;i++){
Code.push_back(“randcode”);其中随机代码生成指令通过汇编指令集来随机挑选。
}
}
随机代码生成指令创建完毕之后,创建所述汇编代码的结束代码,并且,需要从堆栈中恢复通用寄存器及符号寄存器,确保正常代码的功能执行,具体的程序实现如下:
Virtual void CreateEnd(string&code){编写结尾的汇编代码
Code.push_back(“popfd”);从堆栈中寄存器中恢复通用寄存器。
Code.push_back(“Popad”);从堆栈中寄存器中恢复符号寄存器。
Code.push_back(“}”);标示内嵌汇编,后续的代码都是汇编代码。
}
S111,将所述汇编代码存储在被调用程序模块中的代码节中。
一般来说,程序模块是有固定格式的,每个程序模块包括很多节,比如:有代码节,数据节,重定位节,调试信息节,只读数据节等。每个节都有其特定含义和用途,代码节用于存储特定的代码;而数据节则用于存储数据。
那么通常会将数据存储到数据节,而存储数据的存储器容器地址mapdata则是获取数据的关键。为了可以使得调用程序模块获取到存储器容器地址,将创建的汇编代码存储在被调用程序模块中的代码节中。这样调用程序模块可以通过特征代码定位整段汇编代码的起始位置,而在汇编代码的结束位置则存储了对应的存储器容器地址mapdata指针,此指针存储了被调用程序模块待调用给外部的数据。
具体地,当调用程序模块需要调用或者访问被调用程序模块中的待调用数据时,首先根据被调用程序模块名称获取被调用程序模块的内存地址,根据代码节的节名称确定代码节的起始地址和大小,解析被调用程序模块的代码节,从代码节开始搜索所有的代码,根据特征代码标识来定位上述创建的特征代码,再根据特征代码从代码节中找到整段汇编代码的起始地址。
而最终利用move esp,mapdata指令得到加密后的待调用数据data指针,解密则得到原始的指针,根据该指针获取待调用数据。具体实现如下:
HMODULE hModule=GetModuleHandle("模块名称");
其中hModule则是模块的内存地址。
PIMAGE_DOS_HEADER dwFileAddr=hModule;首先是模块的dos头指针。
PIMAGE_NT_HEADERS NtHeader=dwFileAddr+DosHeader->e_lfanew;
获取模块的NT头信息。
PIMAGE_SECTION_HEADER pSection=IMAGE_FIRST_SECTION32(NtHeader);
获取模块的节信息pSection。
for(int i=0;i<NtHeader->FileHeader.NumberOfSections;++i){
遍历节信息,根据代码节的节名称来查找到对应的代码节。
If(Section[i].Name==“code”){如果节名称是code则是找到了代码节。
得到代码节的起始地址和大小。
Section[i].VirtualAddress;代码节的起始地址。
Section[i].VirtualSize;代码节的大小。
从代码节的起始地址开始到代码节的结束来查找编写的特征代码在代码节中的位置。找到特征代码的位置后,可以定位汇编代码在代码节中的起始地址,在汇编代码的结束位置存储了对应的存储容器mapdata的指令move esp,mapdata,然后根据move esp,mapdata指令取出存储容器的指针mapdata。
通过解密Decrypt(mapdata,4,secret)可以得到存储容器的地址,从而根据存储容器的地址获取待调用数据data。
}
}
这样就完全摒弃了利用数据接口去传输、调用、获取收据,并可以提高逆向分析的难度,提高数据的安全性。
基于同样的发明构思,本申请还提供了一种获取数据的装置,详见实施例二。
实施例二
本实施例提供一种获取数据的装置,如图2所示,装置包括:创建单元21、存储单元22及加密单元23;
一般来说,调用程序模块在调用被调用程序模块中的数据时,均是通过相关的数据接口进行调用,那么非正常应用在破解时的常规思维是对数据接口进行逆向分析,获取数据。因此本申请为了避免对数据接口进行破解,在数据调用时,并不会为被调用程序模块设置数据接口,而是根据预设的创建策略创建汇编代码,将待调用数据的存储地址设置在汇编代码中,利用汇编代码隐藏待调用数据的存储地址。
那么根据预设的创建策略创建汇编代码之前,加密单元23用于:
利用预设的加密算法对待调用数据的指针进行加密,以能提高逆向分析的难度,提高数据的安全性。其中,加密算法可以包括:RAS加密算法、DES加密算法及哈希加密算法等,具体的加密方法不做限制,具体实现方式为Encrypt(data,4,secret);data为待调用数据的指针,secret为密码。
然后将加密后的将待调用数据存储在存储容器中,本实施例为了提高数据破解难度,提高数据的安全性,是利用树结构的存储容器,比如map容器,map容器是以键值对的方式对数据进行存储的。
map容器的结构为:Map<int,char>mapdata;其中,int为键值序号,char为键值内容,为存储的数据,Mapdata为存储器地址指针。具体存储方式可以为:mapdata[0]=‘h’;mapdata[1]=‘e’;mapdata[2]=‘l’。
这里,因创建的汇编代码与程序模块中正常的代码是有区别的,所以需要预先定义汇编代码的协议接口类,使得创建的汇编代码与正常的代码不会产生冲突。协议接口类如下:
Virtual void CreateStart(string&code){}=0;编写代码的开头。
Virtual void CopyCode(string&code,string othercode){}=0;编写一个拷贝原始代码的功能。
Virtual void CreateFloatCode(string&code,int len){}=0;编写一个生成浮点指令的代码功能。
Virtual void CreateAsmCode(string&code,string str,int len){}=0;编写一个生成正常特征代码指令的功能。
Virtual void CreateAddressCode(string&code,Map<int,char>*mapdata){}=0;编写一个存储数据地址的代码。
Virtual void CreateRandCode(string&code,int len){}=0;编写一个生成随机代码指令的功能。
Virtual void CreateEnd(string&code){}=0;编写代码的结尾。
需要说明的是,防止使用者因为漏调接口或者因为调用接口的顺序错误导致最终生成的特征代码出现问题,还需创建代码的总入口,总入口用于调用各个分入口,实现如下:
Virtual void CreateCode(string&code,string othercode,int len2,stringstr,int len3,Map<int,char>*mapdata,int len4)。
那么按照上述创建策略,创建单元21根据预设的创建策略创建汇编代码,具体包括:
创建所述汇编代码的起始代码;
创建原始代码,所述原始代码包括:目标函数的代码;
创建浮点运算的运算指令;
创建特征代码,所述特征代码用于确定所述汇编代码在被调用程序模块代码节中的起始地址;
创建存储器容器地址的地址代码,所述存储容器用于存储待调用数据,所述地址代码用于指示所述存储容器地址;
创建随机代码生成指令,所述随机代码生成指令用于使得每次创建的所述特征代码不同;
创建所述汇编代码的结束代码;
具体的程序实现如下:
CreateStart(code);首先创建汇编代码的开头代码。
CopyCode(code,othercode);拷贝原始代码。
CreateFloatCode(code,len2);创建浮点运算的汇编代码。
CreateAsmCode(code,str,len3);创建汇编特征代码。
CreateRandCode(code,len4);创建随机代码。
CreateAddressCode(code,mapdata);创建存储容器地址的汇编代码。
CreateEnd(code);创建汇编代码的结尾代码。
}
}
汇编代码创建完成之后,那么待调用数据的存储地址及特种代码是隐藏在创建的汇编代码的结束位置中的,提高了存储地址的隐蔽性。调用程序模块在获取待调用数据时,只需根据代码节的节名称确定代码节的起始地址和大小,解析被调用程序模块的代码节,从代码节开始搜索所有的代码,根据特征代码标识来定位上述创建的特征代码,再根据特征代码从代码节中找到整段汇编代码的起始地址,就可以在汇编代码的结束位置找到带调用数据的存储地址,进而获取到带调用数据。
可以看出,这种获取数据的方式完全避开了数据接口,避免现有技术在通过接口调用数据时,接口容易被非正常应用破解,确保了数据的安全性。
这里,因汇编代码没有经过编译器优化,会原封不动的通过CPU来执行,所以必须保证汇编代码的逻辑正确,并且确保不会对现有正常代码造成影响。因此,所述创建汇编代码的起始代码时,包括:将所述被调用程序模块中原有的通用寄存器及符号寄存器压入堆栈中。将被调用程序模块中的通用寄存器及符号寄存器压入堆栈中后,在执行汇编代码时,通用寄存器及符号寄存器就不会被执行,因此可以确保被调用程序模块中正常代码的功能,具体的程序实现如下:
class CAsmCode{
Virtual void CreateStart(string&code){
Code.push_back(“asm{”);标示内嵌汇编,后续的代码都是汇编代码。
Code.push_back(“pushad”);将通用寄存器都压入堆栈中。
Code.push_back(“Pushfd”);将符号寄存器都压入堆栈中。
}
为了使得汇编代码具有真有的上下文代码特征,避免汇编代码与其他正常代码不同,提高隐蔽效果,因此在创建汇编代码的起始代码后,还需创建原始代码,原始代码可以包括目标函数的代码。也就是说可以将其他任意函数的代码当做原始代码拷贝至当前创建的汇编代码中,程序实现如下:
Virtual void CopyCode(string&code,string othercode){
Std::strcpy(code,othercode);
}
原始代码创建好之后,为了提高汇编代码的复杂度,提高破解难度,还需创建浮点运算的运算指令。这里因浮点运算指令比正常的整数运算指令复杂很多,而且其不易于逆向分析,因此在汇编代码中添加浮点运算指令可以增加汇编代码的复杂度。
但是为了保证正常代码的功能,浮点运算指令并不需要被执行,因此作为一种可选的实施例,所述创建浮点运算的运算指令后,包括:
将所述浮点运算的运算指令存储至预设的第一寄存器中,所述第一寄存器中的代码为所述汇编代码的分支代码;
将所述第一寄存器的值赋值为预设的标识值,所述预设的标识值用于标识所述第一寄存器为无需被执行运算的寄存器。这样,浮点运算的运算指令就不会被执行,进而不会影响正常代码的功能。其中,第一寄存器可以为eax,预设的标识值可以为1。程序实现如下:
Code.push_back(“Push eax”);
Code.push_back(“move eax,1”);将eax赋值为1
创建浮点运算指令的程序实现如下:
Code.push_back(“Pop eax”);
For(int i=0;i<len;i++){
Code.push_back(“fild data”);
Code.push_back(“fild data2”);
Code.push_back(“fmul”);
Code.push_back(“fmul”);
Code.push_back(“fdivp”);
Code.push_back(“fid data3”);
Code.push_back(“fcomp data4”);
}
}
浮点运算指令创建好之后,创建特征代码,所述特征代码用于确定所述汇编代码在被调用程序模块代码节中的起始地址,以能使得调用程序模块可以根据起始地址查找到该汇报代码。
为了提高破解难度及隐蔽性,本实施例中每次创建的特征代码均是不同的,作为一种可选的实施例,所述创建单元21创建特征代码,包括:
接收调用程序模块发送的特征字符串,这里因特征字符串是调用程序模块发送的,而每个调用程序模块可以发送不同的特征字符串,这样每次生成的特征代码就处于一个动态的变化中,因此可以提高破解难度;
将所述特征字符串复制到第一寄存器中,将所述第一寄存器压入堆栈中,以能将所述特征字符串转换为所述特征代码,这样被调用程序模块生成的特征代码每次都可以是不同的;
提取所述第一寄存器中的所述特征代码,得到不同的特征代码。
这里,在将所述特征字符串复制到第一寄存器中之前,为了不影响第一寄存器中原始数据的功能,需要将第一寄存器中的原始数据压入到堆栈中。其中,创建特征代码的程序实现如下:
Virtual void CreateAsmCode(string&code,string str,int len){
Code.push_back(“push eax”);
For(int i=0;i<len;i++){编写一个循环来对将特征字符串转换为特征代码。
Code.push_back(“move eax,str[i]”);首先将特征字符串复制到eax寄存器中。
Code.push_back(“push eax”);然后我们将eax寄存器压入堆栈中。
}
完成之后,由于堆栈中多压入了一段特征代码,因此为了确保堆栈的平衡,需要提取出堆栈中的特征代码,提取之后,并将第一寄存器中的原始数据进行还原。程序实现如下:
For(int i=0;i<len;i++){
Code.push_back(“pop eax”);将特征代码从堆栈中还原。
}
Code.push_back(“pop eax”);还原eax寄存器的值。
}
特征代码创建好之后,为了可以使得调用程序模块可以得知待调用数据的存储地址,在特征代码中将待调用数据的存储地址进行引用,为了确保数据的安全性,还需对存储地址进行加密,那么作为一种可选的实施例,创建存储器容器地址的地址代码,包括:
加密所述存储器容器地址,以提高数据的破解难度,提高数据的安全性;
将预设的第二寄存器的原始数据压入堆栈中,避免影响第二寄存器中原始数据的功能;
利用所述第二寄存器存储所述加密后的存储器容器地址,以能生成对应的地址代码;
生成地址代码之后,还原所述第二寄存器的原始数据,确保第二寄存器的原始数据可以被执行。
这里,加密所述存储器容器地址的加密算法与加密待调用数据的加密算法相同。并且因通常的esp寄存器是用于保存函数的调用堆栈的起始地址,用户执行函数的返回,通常编译器不会使用esp寄存器,所以本文使用的第二寄存器可以为esp寄存器,当然也可以为其他寄存器。
创建存储器容器地址的地址代码的程序实现如下:
Virtual void CreateAddressCode(string&code,Map<int,char>*mapdata){
Decrypt(mapdata,4,secret);其中密钥则是之前加密使用的密钥。
Code.push_back(“push esp”);先将esp寄存器的原始数据压入堆栈。
Code.push_back(“move esp,mapdata”);然后使用esp寄存器来转存mapdata地址,mapdata为数据存储容器的地址。
Code.push_back(“pop esp”);还原esp寄存器的值。
}
进一步地,如上文所述,为了使得每次创建的特征代码处于变化中,提高破译的难度,在创建存储器容器地址的地址代码后,还需创建随机代码生成指令,以能根据随机代码生成指令将每次创建的特征代码是不同的。
同样的原因,为了确保被调用程序模块中的正常代码不受影响,随机代码生成指令也是不允许执行的,因此创建随机代码生成指令后,包括:将所述随机代码生成指令存储在第一寄存器中。
这里,随机代码生成指令可以通过汇编指令集来确定。
具体的程序实现如下:
Virtual void CreateRandCode(string&code,int len){创建随机代码生成指令。
Code.push_back(“Push eax”);
Code.push_back(“move eax,1”);将eax赋值为1
Code.push_back(“cmp eax,0”);当判断eax为0时,再执行后续代码
For(int i=0;i<len;i++){
Code.push_back(“randcode”);其中随机代码生成指令通过汇编指令集来随机挑选。
}
}
随机代码生成指令创建完毕之后,创建所述汇编代码的结束代码,并且,需要从堆栈中恢复通用寄存器及符号寄存器,确保正常代码的功能执行,具体的程序实现如下:
Virtual void CreateEnd(string&code){编写结尾的汇编代码
Code.push_back(“popfd”);从堆栈中寄存器中恢复通用寄存器。
Code.push_back(“Popad”);从堆栈中寄存器中恢复符号寄存器。
Code.push_back(“}”);标示内嵌汇编,后续的代码都是汇编代码。
}
一般来说,程序模块是有固定格式的,每个程序模块包括很多节,比如:有代码节,数据节,重定位节,调试信息节,只读数据节等。每个节都有其特定含义和用途,代码节用于存储特定的代码;而数据节则用于存储数据。
那么通常会将数据存储到数据节,而存储数据的存储器容器地址mapdata则是获取数据的关键。为了可以使得调用程序模块获取到存储器容器地址,存储单元22将创建的汇编代码存储在被调用程序模块中的代码节中。这样调用程序模块可以通过特征代码定位整段汇编代码的起始位置,而在汇编代码的结束位置则存储了对应的存储器容器地址mapdata指针,此指针存储了被调用程序模块待调用给外部的数据。
具体地,当调用程序模块需要调用或者访问被调用程序模块中的待调用数据时,首先根据被调用程序模块名称获取被调用程序模块的内存地址,根据代码节的节名称确定代码节的起始地址和大小,解析被调用程序模块的代码节,从代码节开始搜索所有的代码,根据特征代码标识来定位上述创建的特征代码,再根据特征代码从代码节中找到整段汇编代码的起始地址。
而最终利用move esp,mapdata指令得到加密后的待调用数据data指针,解密则得到原始的指针,根据该指针获取待调用数据。具体实现如下:
HMODULE hModule=GetModuleHandle("模块名称");
其中hModule则是模块的内存地址。
PIMAGE_DOS_HEADER dwFileAddr=hModule;首先是模块的dos头指针。
PIMAGE_NT_HEADERS NtHeader=dwFileAddr+DosHeader->e_lfanew;
获取模块的NT头信息。
PIMAGE_SECTION_HEADER pSection=IMAGE_FIRST_SECTION32(NtHeader);
获取模块的节信息pSection。
for(int i=0;i<NtHeader->FileHeader.NumberOfSections;++i){
遍历节信息,根据代码节的节名称来查找到对应的代码节。
If(Section[i].Name==“code”){如果节名称是code则是找到了代码节。
得到代码节的起始地址和大小。
Section[i].VirtualAddress;代码节的起始地址。
Section[i].VirtualSize;代码节的大小。
从代码节的起始地址开始到代码节的结束来查找编写的特征代码在代码节中的位置。找到特征代码的位置后,可以定位汇编代码在代码节中的起始地址,在汇编代码的结束位置存储了对应的存储容器mapdata的指令move esp,mapdata,然后根据move esp,mapdata指令取出存储容器的指针mapdata。
通过解密Decrypt(mapdata,4,secret)可以得到存储容器的地址,从而根据存储容器的地址获取待调用数据data。
}
}
这样就完全摒弃了利用数据接口去传输、调用、获取收据,并可以提高逆向分析的难度,提高数据的安全性。
本发明实施例提供的获取数据的方法、装置、介质及计算机设备能带来的有益效果至少是:
本发明实施例提供了一种获取数据的方法、装置、介质及计算机设备,方法包括:根据预设的创建策略创建汇编代码,所述汇编代码用于隐藏待调用数据的存储地址;将所述汇编代码存储在被调用程序模块中的代码节中;其中,所述根据预设的传输规则创建汇编代码,包括:创建所述汇编代码的起始代码;创建原始代码,所述原始代码包括:目标函数的代码;创建浮点运算的运算指令;创建特征代码,所述特征代码用于确定所述汇编代码在被调用程序模块代码节中的起始地址;创建存储器容器地址的地址代码,所述存储容器用于存储待调用数据,所述地址代码用于指示所述存储容器地址;创建随机代码生成指令,所述随机代码生成指令用于使得每次创建的所述特征代码不同;创建所述汇编代码的结束代码;如此,将待调用数据的存储地址隐藏在创建的汇编代码中,提高了存储地址的隐蔽性,并且因汇编代码中每次创建的特征代码是不同的,进而提高了非正常应用的破解难度,避免在通过接口调用数据时,接口容易被非正常应用破解,确保了数据的安全性。
实施例三
本实施例提供一种计算机设备,如图3所示,包括存储器310、处理器320及存储在存储器310上并可在处理器320上运行的计算机程序311,处理器320执行计算机程序311时实现以下步骤:
根据预设的创建策略创建汇编代码,所述汇编代码用于隐藏待调用数据的存储地址;将所述汇编代码存储在被调用程序模块中的代码节中;其中,所述根据预设的传输规则创建汇编代码,包括:创建所述汇编代码的起始代码;创建原始代码,所述原始代码包括:目标函数的代码;创建浮点运算的运算指令;创建特征代码,所述特征代码用于确定所述汇编代码在被调用程序模块代码节中的起始地址;创建存储器容器地址的地址代码,所述存储容器用于存储待调用数据,所述地址代码用于指示所述存储容器地址;创建随机代码生成指令,所述随机代码生成指令用于使得每次创建的所述特征代码不同;创建所述汇编代码的结束代码;
在具体实施过程中,处理器320执行计算机程序311时,可以实现实施例一中任一实施方式。
由于本实施例所介绍的计算机设备为实施本申请实施例一中一种获取数据的方法所采用的设备,故而基于本申请实施例一中所介绍的方法,本领域所属技术人员能够了解本实施例的计算机设备的具体实施方式以及其各种变化形式,所以在此对于该服务器如何实现本申请实施例中的方法不再详细介绍。只要本领域所属技术人员实施本申请实施例中的方法所采用的设备,都属于本申请所欲保护的范围。
基于同一发明构思,本申请提供了实施例一对应的存储介质,详见实施例四。
实施例四
本实施例提供一种计算机可读存储介质400,如图4所示,其上存储有计算机程序411,该计算机程序411被处理器执行时实现以下步骤:
根据预设的创建策略创建汇编代码,所述汇编代码用于隐藏待调用数据的存储地址;将所述汇编代码存储在被调用程序模块中的代码节中;其中,所述根据预设的传输规则创建汇编代码,包括:创建所述汇编代码的起始代码;创建原始代码,所述原始代码包括:目标函数的代码;创建浮点运算的运算指令;创建特征代码,所述特征代码用于确定所述汇编代码在被调用程序模块代码节中的起始地址;创建存储器容器地址的地址代码,所述存储容器用于存储待调用数据,所述地址代码用于指示所述存储容器地址;创建随机代码生成指令,所述随机代码生成指令用于使得每次创建的所述特征代码不同;创建所述汇编代码的结束代码;
在具体实施过程中,该计算机程序411被处理器执行时,可以实现实施例一中任一实施方式。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

Claims (10)

1.一种获取数据的方法,其特征在于,应用在被调用程序模块中,所述方法包括:
根据预设的创建策略创建汇编代码,所述汇编代码用于隐藏待调用数据的存储地址;
将所述汇编代码存储在被调用程序模块中的代码节中;其中,所述根据预设的创建策略创建汇编代码,包括:
创建所述汇编代码的起始代码;
创建原始代码,所述原始代码包括:目标函数的代码;
创建浮点运算的运算指令;
创建特征代码,所述特征代码用于确定所述汇编代码在被调用程序模块代码节中的起始地址;
创建存储器容器地址的地址代码,所述存储容器用于存储待调用数据,所述地址代码用于指示所述存储容器地址;
创建随机代码生成指令,所述随机代码生成指令用于使得每次创建的所述特征代码不同;
创建所述汇编代码的结束代码。
2.如权利要求1所述的方法,其特征在于,所述根据预设的创建策略创建汇编代码之前,包括:
利用预设的加密算法所述待调用数据进行加密;
将加密后的所述待调用数据存储在存储容器中,所述存储容器是以键值对的方式对所述待调用数据进行存储的map容器。
3.如权利要求1所述的方法,其特征在于,所述创建所述汇编代码的起始代码时,包括:
将所述被调用程序模块中的通用寄存器及符号寄存器压入堆栈中。
4.如权利要求1所述的方法,其特征在于,所述创建浮点运算的运算指令后,包括:
将所述浮点运算的运算指令存储至预设的第一寄存器中,所述第一寄存器中的代码为所述汇编代码的分支代码;
将所述第一寄存器的值赋值为预设的标识值,所述预设的标识值用于标识所述第一寄存器中的所述分支代码为无需被执行运算的代码。
5.如权利要求1所述的方法,其特征在于,所述创建特征代码,包括:
接收调用程序模块发送的特征字符串;
将所述特征字符串复制到第一寄存器中;
将所述第一寄存器压入堆栈中,以能将所述特征字符串转换为所述特征代码;
提取所述第一寄存器中的所述特征代码。
6.如权利要求1所述的方法,其特征在于,所述创建存储器容器地址的地址代码,包括:
加密所述存储器容器地址;
将预设的第二寄存器的原始数据压入堆栈中;
利用所述第二寄存器存储所述加密后的存储器容器地址。
7.如权利要求1所述的方法,其特征在于,所述创建随机代码生成指令后,包括:
将所述随机代码生成指令存储在第一寄存器中,所述第一寄存器中的代码为所述汇编代码的分支代码;
将所述第一寄存器的值赋值为预设的标识值,所述预设的标识值用于标识所述第一寄存器中的所述分支代码为无需被执行运算的代码。
8.一种获取数据的装置,其特征在于,应用在被调用程序模块中,所述装置包括:
创建单元,用于根据预设的创建策略创建汇编代码,所述汇编代码用于隐藏待调用数据的存储地址;
存储单元,用于将所述汇编代码存储在被调用程序模块中的代码节中;其中,所述创建单元具体用于:
创建所述汇编代码的起始代码;
创建原始代码,所述原始代码包括:目标函数的代码;
创建浮点运算的运算指令;
创建特征代码,所述特征代码用于确定所述汇编代码在被调用程序模块代码节中的起始地址;
创建存储器容器地址的地址代码,所述存储容器用于存储待调用数据,所述地址代码用于指示所述存储容器地址;
创建随机代码生成指令,所述随机代码生成指令用于使得每次创建的所述特征代码不同;
创建所述汇编代码的结束代码。
9.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现权利要求1至7任一项所述的方法。
10.一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现权利要求1至7任一项所述的方法。
CN201911305446.4A 2019-12-18 2019-12-18 一种获取数据的方法、装置、介质及计算机设备 Active CN113010855B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201911305446.4A CN113010855B (zh) 2019-12-18 2019-12-18 一种获取数据的方法、装置、介质及计算机设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201911305446.4A CN113010855B (zh) 2019-12-18 2019-12-18 一种获取数据的方法、装置、介质及计算机设备

Publications (2)

Publication Number Publication Date
CN113010855A CN113010855A (zh) 2021-06-22
CN113010855B true CN113010855B (zh) 2022-05-10

Family

ID=76381165

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201911305446.4A Active CN113010855B (zh) 2019-12-18 2019-12-18 一种获取数据的方法、装置、介质及计算机设备

Country Status (1)

Country Link
CN (1) CN113010855B (zh)

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103324481A (zh) * 2013-06-26 2013-09-25 网宿科技股份有限公司 通过汇编实现代码混淆的编译方法和系统
CN104298932A (zh) * 2014-10-27 2015-01-21 中国建设银行股份有限公司 一种so文件的调用方法及装置
CN105808256A (zh) * 2016-03-08 2016-07-27 武汉斗鱼网络科技有限公司 一种构造合法堆栈返回值绕过函数调用检测的方法与系统
CN109740303A (zh) * 2018-09-07 2019-05-10 天翼电子商务有限公司 一种使用外部sdk时提升安全性的方法

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP3206148A1 (en) * 2016-02-12 2017-08-16 ABB Schweiz AG Secure code optimization method and system
KR101688814B1 (ko) * 2016-07-11 2016-12-22 (주)케이사인 주 기억 장치 내부의 코드 수정을 통한 애플리케이션 코드 은닉 장치 및 이를 이용한 애플리케이션 코드 은닉 방법

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103324481A (zh) * 2013-06-26 2013-09-25 网宿科技股份有限公司 通过汇编实现代码混淆的编译方法和系统
CN104298932A (zh) * 2014-10-27 2015-01-21 中国建设银行股份有限公司 一种so文件的调用方法及装置
CN105808256A (zh) * 2016-03-08 2016-07-27 武汉斗鱼网络科技有限公司 一种构造合法堆栈返回值绕过函数调用检测的方法与系统
CN109740303A (zh) * 2018-09-07 2019-05-10 天翼电子商务有限公司 一种使用外部sdk时提升安全性的方法

Also Published As

Publication number Publication date
CN113010855A (zh) 2021-06-22

Similar Documents

Publication Publication Date Title
US20120317421A1 (en) Fingerprinting Executable Code
US9350547B2 (en) Systems and methods for watermarking software and other media
KR101798672B1 (ko) 코드 불변식을 이용한 스테가노그래픽 메시징 시스템
Li et al. K-Hunt: Pinpointing insecure cryptographic keys from execution traces
US9659181B2 (en) System, apparatus and method for license key permutation
CN106059762B (zh) 数据安全处理方法及装置
WO2011134207A1 (zh) 软件保护方法
CN109117201B (zh) 一种程序退出的方法及相关设备
CN108804913B (zh) 应用程序的运行方法和装置
US20090113553A1 (en) Method and system for hiding information in the instruction processing pipeline
US9047448B2 (en) Branch auditing in a computer program
US8656182B2 (en) Security mechanism for developmental operating systems
CN113010855B (zh) 一种获取数据的方法、装置、介质及计算机设备
CN107133539B (zh) 智能卡个人化方法及相关装置与系统
CN104639313A (zh) 一种密码算法的检测方法
CN112685698A (zh) 一种基于USB Key的软件授权方法及系统
CN116611032A (zh) 一种jar包中嵌入和提取软件水印的方法、系统和存储介质
CN110147655A (zh) 应用程序的安全防护系统及方法
CN107085681B (zh) 鲁棒的计算设备标识框架
CN117009931A (zh) 水印添加和水印应用方法、装置、设备及存储介质
Chen et al. Forensic analysis of android steganography apps
JP6752347B1 (ja) 情報処理装置、コンピュータプログラム及び情報処理方法
CN115296821B (zh) 一种用于数字藏品管理的数据处理系统
Kwon et al. P2C: Understanding Output Data Files via On-the-Fly Transformation from Producer to Consumer Executions.
CN117077180B (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