CN111475168B - 一种代码编译方法及装置 - Google Patents

一种代码编译方法及装置 Download PDF

Info

Publication number
CN111475168B
CN111475168B CN202010289966.7A CN202010289966A CN111475168B CN 111475168 B CN111475168 B CN 111475168B CN 202010289966 A CN202010289966 A CN 202010289966A CN 111475168 B CN111475168 B CN 111475168B
Authority
CN
China
Prior art keywords
code
function
source code
assembly
modifying
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
CN202010289966.7A
Other languages
English (en)
Other versions
CN111475168A (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.)
Information Engineering University of PLA Strategic Support Force
Network Communication and Security Zijinshan Laboratory
Original Assignee
Information Engineering University of PLA Strategic Support Force
Network Communication and Security Zijinshan Laboratory
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 Information Engineering University of PLA Strategic Support Force , Network Communication and Security Zijinshan Laboratory filed Critical Information Engineering University of PLA Strategic Support Force
Priority to CN202010289966.7A priority Critical patent/CN111475168B/zh
Publication of CN111475168A publication Critical patent/CN111475168A/zh
Application granted granted Critical
Publication of CN111475168B publication Critical patent/CN111475168B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Abstract

本发明提供一种代码编译方法及装置,通过将获取的第一源代码进行信息替换得到第二源代码;对第二源代码进行词法分析、语法分析和语义分析,生成汇编代码;通过修改汇编代码中的数据段、修改汇编代码中数据运算的运算过程和修改汇编代码中函数的函数结构三种修改方式中的至少一种修改方式对汇编代码进行修改;将修改后的汇编代码转化为机器码程序,将机器码程序与库函数进行链接,得到可执行文件。本发明通过第一源代码的信息替换和对汇编代码的修改的方式,改变了现有的代码编译机制,使得反编译后的代码变得难以理解,攻击者难以根据反编译后的代码找到可执行文件的漏洞进行攻击,提高了对可执行文件的逆向防御能力和安全系数。

Description

一种代码编译方法及装置
技术领域
本发明涉及软件安全技术领域,具体涉及一种代码编译方法及装置。
背景技术
现有的信息处理终端(例如电脑和手机登)的使用都离不开软件,所以软件安全是一个备受关注的问题。攻击者能够采用逆向工程技术通过对程序代码编译完成的执行文件进行反汇编,以恢复程序代码中的高级语义信息,从而帮助攻击者发现软件漏洞进行攻击,导致各种软件的安全性较低。现有的代码编译方法得到的软件存在防逆向分析能力弱,安全系数低的问题。
发明内容
有鉴于此,本发明实施例提供一种代码编译方法及装置,解决了现有的编译方法得到的软件存在防逆向分析能力弱,安全系数低的问题。
为实现上述目的,本发明实施例提供如下技术方案:一种代码编译方法,包括:
将获取的第一源代码进行信息替换得到第二源代码;
对所述第二源代码进行词法分析、语法分析和语义分析,生成汇编代码;
通过修改所述汇编代码中的数据段、修改所述汇编代码中数据运算的运算过程和修改所述汇编代码中函数的函数结构三种修改方式中的至少一种修改方式对所述汇编代码进行修改;
将修改后的汇编代码转化为机器码程序,将所述机器码程序与库函数进行链接,得到可执行文件。
进一步的,所述修改所述汇编代码中函数的函数结构,包括:
将获取到的所述汇编代码中的函数拆分成至少两个函数体;其中,所述函数体为所述汇编代码的函数中的部分函数;
从所述至少两个函数体中确定至少一个函数体作为样本函数体,扩展得到与所述样本函数体的函数结构相同但功能不同的扩展函数体;其中,所述扩展函数体之间可相互跳转,且所述扩展函数体可跳转至所述样本函数体;
在所述扩展函数体内插入改变所述扩展函数体的运算过程的指令,实现函数混淆。
进一步的,所述修改所述汇编代码中的数据段,包括:
读取所述汇编代码中的数据段;
随机转移所述数据段的数据地址,并记录所述数据地址的偏移量;
根据所述偏移量修改所述汇编代码的数据段的数据指针,使得所述数据段的数据指针指向转移后的数据地址。
进一步的,所述修改所述汇编代码中的数据段,还包括:
若所述数据段为读写数据段,在获取所述读写数据段的数据后,插入用于设置文件锁的汇编指令;其中所述文件锁用于锁定所述读写数据段的数据不被读取。
进一步的,所述修改所述汇编代码中数据运算的运算过程,包括:
获取所述汇编代码中的运算指令和递归语句;
生成一个随机数,根据预先设定的随机数与运算指令的对应关系,确定与所述随机数对应的运算指令;
将所述汇编代码中的运算指令替换为所述随机数对应的运算指令,其中所述随机数对应的运算指令和所述汇编代码中的运算指令对相同数值的运算结果相同;
将所述递归语句替换为与所述递归语句实现相同功能的循环语句。
进一步的,所述将获取的第一源代码进行信息替换得到第二源代码,包括:
在获取的第一源代码初始化后,将所述第一源代码进行函数名替换、变量名替换和宏定义替换中的至少一种,得到第二源代码;其中,
所述函数名替换包括:获取所述第一源代码中的函数名,将所述函数名替换为与所述函数名对应的第一字符串;其中,所述第一字符串与被替换的所述函数名的含义不相同;
所述变量名替换包括:获取所述第一源代码中的变量名,将所述变量名替换为与所述变量名对应的第二字符串;其中,所述第二字符串没有在所述第一源代码中被用作为变量名或宏定义;
所述宏定义替换包括:获取所述第一源代码中的宏定义,将所述宏定义替换为与所述宏定义对应的第三字符串;所述第三字符串没有在所述第一源代码中被用作为变量名或宏定义。
进一步的,代码编译方法在获取所述第一源代码之前还包括:
获取加密的第一源代码包;
对所述第一源代码包中文件大小不超过预设值的源代码包进行解密,得到第二源代码包;
对所述第二源代码包进行解包,得到初始源代码;
对所述初始源代码进行特征检测,以判断所述初始源代码是否为恶意软件的源代码;
若所述初始源代码不是恶意软件的源代码,将所述初始源代码作为所述第一源代码;
若所述初始源代码是恶意软件的源代码,删除所述初始源代码,并输出警告信息。
进一步的,代码编译方法还包括:
对所述可执行文件进行模糊测试;
若所述可执行文件通过所述模糊测试,则判断通过所述模糊测试的可执行文件的数量是否达到预设数量;
若通过所述模糊测试的可执行文件数量达到所述预设数量,则将所有可执行文件加密后发送;
若所述可执行文件没有通过所述模糊测试或通过所述模糊测试的可执行文件数量没有达到所述预设数量,则返回执行将获取的第一源代码进行信息替换得到第二源代码,以重新得到可执行文件。
本发明另一实施例提供如下技术方案:一种代码编译装置,包括:信息替换单元、分析单元、修改单元和转化及链接单元;
所述信息替换单元,用于将获取的第一源代码进行信息替换得到第二源代码;
所述分析单元,用于对所述第二源代码进行词法分析、语法分析和语义分析,生成汇编代码;
所述修改单元,用于对所述汇编代码进行修改;所述修改单元包括数据修改子单元、运算修改子单元和函数修改子单元中的至少一个子单元;其中,所述数据修改子单元用于修改所述汇编代码中的数据段;
所述运算修改子单元用于修改所述汇编代码中数据运算的运算过程;
所述函数修改子单元用于修改所述汇编代码中函数的函数结构;
所述转化及链接单元,用于将所述修改单元修改后的汇编代码转化为机器码程序,将所述机器码程序与库函数进行链接,得到可执行文件。
进一步的,所述函数修改子单元,具体用于:
将获取到的所述汇编代码中的函数拆分成至少两个函数体;其中,所述函数体为所述汇编代码的函数中的部分函数;从所述至少两个函数体中确定至少一个函数体作为样本函数体,扩展得到与所述样本函数体的函数结构相同但功能不同的扩展函数体;其中,所述扩展函数体之间可相互跳转,且所述扩展函数体可跳转至所述样本函数体;在所述扩展函数体内插入改变所述扩展函数体的运算过程的指令,实现函数混淆;
或者
所述数据修改单元,具体用于:
读取所述汇编代码中的数据段;随机转移所述数据段的数据地址,并记录所述数据地址的偏移量;根据所述偏移量修改所述汇编代码的数据段的数据指针,使得所述数据段的数据指针指向转移后的数据地址;若所述数据段为读写数据段,在获取所述读写数据段的数据后,插入用于设置文件锁的汇编指令;其中所述文件锁用于锁定所述读写数据段的数据不被读取;
或者
所述运算修改子单元具体用于:
获取所述汇编代码中的运算指令和递归语句;生成一个随机数,根据预先设定的随机数与运算指令的对应关系,确定与所述随机数对应的运算指令;将所述汇编代码中的运算指令替换为所述随机数对应的运算指令,其中所述随机数对应的运算指令和所述汇编代码中的运算指令对相同数值的运算结果相同;将所述递归语句替换为与所述递归语句实现相同功能的循环语句。
进一步的,所述信息替换单元,包括:函数名替换子单元、变量名替换子单元和宏定义替换制子单元中的至少一个子单元;其中,
所述函数名替换单元,用于获取所述第一源代码中的函数名,将所述函数名替换为与所述函数名对应的第一字符串;其中,所述第一字符串与被替换的所述函数名的含义不相同;
所述变量名替换单元,用于获取所述第一源代码中的变量名,将所述变量名替换为与所述变量名对应的第二字符串;其中,所述第二字符串没有在所述第一源代码中被用作为变量名或宏定义;
所述宏定义替换单元,用于获取所述第一源代码中的宏定义,将所述宏定义替换为与所述宏定义对应的第三字符串;所述第三字符串没有在所述第一源代码中被用作为变量名或宏定义。
进一步的,装置还包括:获取单元、解密单元、解包单元和检测单元;
所述获取单元,用于获取加密的第一源代码包;
所述解密单元,用于对所述第一源代码包中文件大小不超过预设值的源代码包进行解密,得到第二源代码包;
所述解包单元,用于对所述第二源代码包进行解包,得到初始源代码;
所述检测单元,用于对所述初始源代码进行特征检测,以判断所述初始源代码是否为恶意软件的源代码;若所述初始源代码不是恶意软件的源代码,将所述初始源代码作为所述第一源代码发送至所述信息替换单元;若所述初始源代码是恶意软件的源代码,删除所述初始源代码,并输出警告信息。
进一步的,装置还包括:测试单元和加密与输出单元;
所述测试单元,用于对所述转化及链接单元得到的可执行文件进行模糊测试;若所述可执行文件通过所述模糊测试,则将所述可执行文件发送至加密与输出单元;若所述可执行文件没有通过所述模糊测试,则通知所述信息替换单元、分析单元、修改单元和转化及链接单元重新工作,以重新得到可执行文件;
所述加密与输出单元,用于判断从所述测试单元接收的可执行文件的数量是否达到预设数量;若从所述测试单元接收的可执行文件数量达到所述预设数量,则将所有可执行文件加密后发送;若从所述测试单元接收的可执行文件数量没有达到所述预设数量,则通知所述信息替换单元、分析单元、修改单元和转化及链接单元重新工作,以重新得到可执行文件。
上述方案提供的一种代码编译方法,通过将获取的第一源代码进行信息替换得到第二源代码;对第二源代码进行词法分析、语法分析和语义分析,生成汇编代码;通过修改汇编代码中的数据段、修改汇编代码中数据运算的运算过程和修改汇编代码中函数的函数结构三种修改方式中的至少一种修改方式对汇编代码进行修改;将修改后的汇编代码转化为机器码程序,将机器码程序与库函数进行链接,得到可执行文件。相比于现有技术,通过第一源代码的信息替换和对汇编代码的修改的方式,改变了现有的代码编译机制,使得代码(或是称为反编译后的代码)变得难以理解,攻击者难以根据反编译后的代码找到可执行文件的漏洞进行攻击,提高了对可执行文件的逆向防御能力和安全系数,增大与可执行文件相对应软件的破解难度。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本发明实施例提供的一种编译的方法的流程示意图;
图2为函数混淆的一种实现流程图;
图3为完成函数混淆后的函数的函数结构示意图;
图4为修改汇编代码中的数据段的一种实现流程图;
图5为修改汇编代码中的数据段的另一种实现流程图;
图6为修改汇编代码中数据运算的运算过程一种实现方式的流程图;
图7为本发明另一实施例提供的一种代码编译方法的流程示意图;
图8为本发明另一实施例提供的一种代码编译方法的流程示意图;
图9为本发明又一实施例提供的一种代码编译方法的流程示意图;
图10为本发明又一实施例提供的一种代码编译装置的结构示意图;
图11为本发明又一实施例提供的一种代码编译装置的结构示意图;
图12为本发明又一实施例提供的一种代码编译装置的结构示意图;
图13为本发明又一实施例提供的一种代码编译装置的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
在本申请中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
请参阅图1,其示出本发明实施例提供的一种代码编译方法的流程示意图,适用于能够进行代码编译的装置中,主要用于对需要进行保护的源代码进行编译,以避免编译出的可执行文件被轻易的反汇编,造成安全漏洞。
在本实施例中,该方法可以包括以下步骤:
S101,将获取的第一源代码进行信息替换得到第二源代码。
本实施例中,信息替换是在不改变第一源代码的功能条件下,替换第一源代码中的字符串,通过将其替换成无意义的字符串增加了替换后的第二源代码的理解难度。
信息替换的一种实现方式为:在获取的第一源代码初始化后,将所述第一源代码进行函数名替换、变量名替换和宏定义替换中的至少一种,得到第二源代码。第一源代码初始化时将第一源代码的头文件以及宏定义中的字符串替换成其代表的值或内容,例如变量名替换成与该变量名对应的值。
需要说明的是,当第一源代码进行两种以上的信息的替换操作时,不对替换信息的先后顺序进行限定。例如当对第一源代码进行函数名替换和变量名替换,第一源代码可以先进行函数名替换再进行变量名替换;或先进行变量名替换再进行函数名替换;或者第一源代码进行函数名替换的同时也进行变量名替换。下面介绍不同信息的替换过程:
函数名替换的一种实现方式包括以下步骤:获取第一源代码中的函数名,将函数名替换为与函数名对应的第一字符串;其中,第一字符串与被替换的函数名的含义不相同。因为替换后的第一字符串的含义(也可能是无含义的字符串)与被替换函数名的函数的功能不相关,使得攻击者无法通过第一字符串推出函数的功能。例如,用于执行汇总功能的函数,替换前它的函数名为sum,信息替换后,函数名sum被替换为没有功能特征的字符串sun,使得攻击者难以通过替换后的函数名sun得到函数执行的功能。
变量名替换的一种实现方式包括以下步骤:获取第一源代码中的变量名,将变量名替换为与变量名对应的第二字符串;其中,第二字符串没有在第一源代码中被用作为变量名或宏定义。类似上述的第一字符串,此处第二字符串没有变量含义,同时与被替换变量名的含义不相关。例如,将变量名price(价格)替换为prince(王子)。
宏定义替换的一种实现方式包括以下步骤:获取第一源代码中的宏定义,将宏定义替换为与宏定义对应的第三字符串;第三字符串没有在第一源代码中被用作为变量名或宏定义,类似上述的第一字符串,此处第三字符串没有变量含义,同时与被替换宏定义的含义不相关。
需要说明的是,信息替换中的信息不限于上述的函数名、变量名和宏定义,可以根据不同源代码的情况替换其他类的信息,在此不做具体的限定;另外,确定替换的字符串的方式有很多,预设需替换信息和字符串的替换规则表或随机替换等,在此不做具体的限定。
S102,对第二源代码进行词法分析、语法分析和语义分析,生成汇编代码。
S103,通过修改汇编代码中的数据段、修改汇编代码中数据运算的运算过程和修改汇编代码中函数的函数结构三种修改方式中的至少一种修改方式对汇编代码进行修改。
本步骤是在不改变汇编代码实现的功能的前提下,对汇编代码进行修改实现了代码混淆,增加了汇编代码的反汇编的理解难度,即反汇编后的代码的理解难度。需要说明的是,当采用上述两种以上的修改方式完成对汇编代码的修改时,在此不对修改方式的先后顺序进行限定。例如,通过修改汇编代码中的数据段和修改汇编代码中函数的函数结构两种方式对汇编代码进行修改时,可以先修改汇编代码中的数据段再修改汇编代码中函数的函数结构;或先修改汇编代码中函数的函数结构再修改汇编代码中的数据段;或者在修改汇编代码中的数据段的同时也修改汇编代码中函数的函数结构。下面分别介绍上述三种修改方式:
(1)修改汇编代码中函数的函数结构的一种实现方式为函数混淆,需要说明的是,在此不对汇编代码中修改了函数结构的函数个数进行限定。
请参阅图2,其示出了函数混淆的一种实现流程图,包括以下步骤:
S201,将获取到的汇编代码中的函数拆分成至少两个函数体。
其中,函数体为汇编代码的函数中的部分函数,汇编代码中的函数拆分成的函数体,该函数体按照特定的顺序跳转实现汇编代码中的函数的功能。例如将一个函数拆分成三个函数体:第一部分函数体、第二部分函数体和第三部分函数体。第一部分函数体可以跳转至第二部分函数体,第二部分函数体可以跳转至第三部分函数体。需要说明的是,在此不对一个函数拆分成的函数体的数量进行限定。
S202,从至少两个函数体中确定至少一个函数体作为样本函数体,扩展得到与样本函数体的函数结构相同但功能不同的扩展函数体。
其中,扩展函数体之间可以相互跳转,也可以跳转至样本函数体,同时因为扩展函数体是根据样本函数体扩展出来的,所以扩展函数体保持了样本函数体的跳转路径,也可以与汇编代码的函数拆分的其他函数体相连接,因此汇编代码的函数进行拆分和扩展后,函数结构变得复杂。以上述的将一个函数拆分成三个函数体为例,如果以第二部分函数体作为样本函数体进行扩展,得到4个扩展函数体,图3示出了该函数完成函数混淆后的函数结构。样本函数体的个数可以根据需要和函数拆分出的函数体总数来选择,在此不做具体限定。扩展出的扩展函数体的个数也可根据需要更改,在此也不做具体的限定。
S203,在扩展函数体内插入改变扩展函数体的运算过程的指令,实现函数混淆。
其中,改变扩展函数体的运算过程会使得扩展函数体的控制流改变。如果扩展函数体有多个,不同扩展函数体插入的改变扩展函数体的运算过程的指令可以不同,那么会得到多个不同控制流的扩展函数体,使得函数结构变得复杂。函数经过函数混淆后函数结构的改变,使得函数有多条执行路径,但在编译成软件运行时,在正常使用该函数情况下只是执行多条执行路径中的一条函数真实路径。正常使用该函数情况也就是函数输入的变量值在正常的范围比如说某个变量是金额,如果金额值为合理的范围就会执行函数真实路径。
(2)修改汇编代码中的数据段增加了逆向的攻击者获取数据的难度,可以通过修改数据段的数据地址,和/或锁定数据段中的读写数据等操作实现。下面分别介绍修改汇编代码中的数据段的多种实现方式:
一种实现方式,修改汇编代码中数据段的数据地址。请参阅图4,其示出了修改汇编代码中的数据段的一种实现流程图,包括以下步骤:
S301,读取汇编代码中的数据段。
本实施方式中,数据段可以为bss(Block Started by Symbol)段,用来存放程序中未初始化的或者初始化为0的全局变量和静态变量的一块内存区域。
S302,随机转移数据段的数据地址,并记录数据地址的偏移量。
其中,记录的数据地址偏移量与随机转移的数据段的数据相对应。
S303,根据偏移量修改汇编代码的数据段的数据指针,使得数据段的数据指针指向转移后的数据地址。
修改汇编代码中数据段的数据地址,可以防止rop(Return-orientedProgramming/面向返回的编程)攻击可执行文件时获取数据段的一些关键数据;也降低产生缓冲区溢出以后溢出的数据覆盖在合法数据上的威胁性。
另一实现方式,锁定汇编代码中的数据段中的读写数据:读取汇编代码中的数据段,若数据段为读写数据段,在获取读写数据段的数据后,插入用于设置文件锁的汇编指令。
其中文件锁用于锁定读写数据段的数据不被读取。读取该读写数据段的数据后,设置文件锁的汇编指令插入汇编指令在程序的控制流里,将文件锁置为1,下次读取前进行判断,如果为1则禁止读取,例如、禁止\bin\sh,等涉及获取系统权限的数据从其中取出。
另一种实现方式,修改汇编代码中数据段的数据地址,同时锁定汇编代码中的数据段中的读写数据。请参阅图5,其示出了修改汇编代码中的数据段的另一种实现流程图,相比于图4,还包括以下步骤:
S304,若数据段为读写数据段,在获取读写数据段的数据后,插入用于设置文件锁的汇编指令。
(3)修改汇编代码中数据运算的运算过程,在不改变汇编代码中数据运算的运算结果的前提下,将数据运算的运算过程替换成更复杂的运算过程以增加汇编代码的逆向难度。汇编代码的数据运算的运算过程是通过指令表达出来的,修改运算过程就是修改实现运算的指令序列。实现运算的指令序列包括但不限于递归语句、循环语句和二进制运算指令。修改汇编代码中数据运算的运算过程可以通过获取实现运算的指令或指令序列,并使用更复杂的但功能等价的指令或指令序列进行替换,例如,将3*2替换为3+12/3-1。需要说明的是,同一汇编代码中的多个实现相同运算过程的指令可以替换成不同的指令。
请参阅图6,其示出了修改汇编代码中数据运算的运算过程一种实现方式的流程图,包括以下步骤:
S401,获取汇编代码中的运算指令和递归语句。
其中,运算指令和递归语句是描述数据运算过程的常用指令,运算指令包括实现算术运算(比如加减乘除运算)、位运算和逻辑运算等等的运算指令。获取运算指令和递归语句可以通过识别关键字符进行获取。
S402,生成一个随机数,根据预先设定的随机数与运算指令的对应关系,确定与随机数对应的运算指令。
此步骤中,一种运算指令存在多种可以替换的等价运算指令,预先设定了用于替换的等价运算指令和数字之间的对应关系。在其他确定用于替换的等价运算指令实现方式中,可以根据对应数字的大小顺序确定用于替换的等价运算指令。例如,按照从小到大的顺序确定一个数字,确定与该数字对应的运算指令作为用于替换的等价运算指令。在此不对从多个运算指令中确定一种用于替换的等价运算指令的实现方法进行限定。
在其他实现方式中,每种运算指令可用于替换的等价运算指令只有一个,在此不对用于替换的等价运算指令的数量进行限定。
S403,将汇编代码中的运算指令替换为与随机数对应的运算指令,其中与随机数对应的运算指令和汇编代码中的运算指令的运算结果相同但运算过程不同。
S404,将递归语句替换为与递归语句实现相同功能的循环语句。
其中,循环语句相比于递归语句,对于逆向的攻击者来说更难以理解。在其他实现方式中,也可以将递归语句替换为其他的实现相同运算过程的指令,在此不做具体限定。
S104,将修改后的汇编代码转化为机器码程序,将机器码程序与库函数进行链接,得到可执行文件。
在一种实现方式中,为了进一步软件安全性,链接时使用的库函数是经过字符替换处理的库函数,使得库函数中的函数代码混淆。字符替换处理可以有多种实现方式,通过将库函数中函数的函数名修改为无意义的字符串;和/或对库函数中的函数进行函数混淆修改函数结构,在此不做具体的限定。
本实施例通过第一源代码的信息替换和对汇编代码进行修改的方式,改变了现有的代码编译机制,使得代码(或是称为反编译后的代码)变得难以理解,攻击者难以根据反编译后的代码找到可执行文件的漏洞进行攻击,提高了对可执行文件的逆向防御能力和安全系数,增大与可执行文件相对应软件的破解难度。
为了防止进行代码编译的装置的安全,要对获取的源代码进行预处理。请参阅图7,本发明另一实施例提供的一种代码编译方法的流程示意图,相较于图1,本实施例在步骤S101之前还包括以下步骤:
S001,获取加密的第一源代码包。
其中,第一源代码包可以是用户通过客户端发送过来的源代码包,也可以从保存有源代码包的数据库中取出的源代码包。第一源代码包是经过加密的文件,对文件进行的加密的方式较多(如公钥加密,非对称加密等),在此不对第一源代码包的加密方法进行限定。在这里需要说明的一点是:客户端是研发并提供第一源代码包的用户的客户端,例如可以是一个提供第一源代码包的软件平台。
S002,对第一源代码包中文件大小不超过预设值的源代码包进行解密,得到第二源代码包。
其中,预设值是进行代码编译的装置的最大存储容量,若第一源代码包的文件大小的超过预设值,那么该第一源代码包会占用大量存储空间,影响装置的运行效率。因此本步骤只对文件大小不超过预设值的源代码包进行解密,舍弃超过预设值的源代码包。
S003,对第二源代码包进行解包,得到初始源代码。
S004,对初始源代码进行特征检测,判断初始源代码是否为恶意软件的源代码。
S005,若初始源代码不是恶意软件的源代码,将初始源代码作为第一源代码。
S006,若初始源代码是恶意软件的源代码,删除初始源代码,并输出警告信息,其中警告信息用于指示初始源代码为恶意软件的源代码,从而可以记录与恶意软件的源代码的相关信息,例如恶意软件的源代码的特征信息,这样在解包得到初始源代码之后,可通过与恶意软件的源代码的特征信息的比对来判断当前获得的初始源代码是否为恶意软件的源代码。
本实施方式通过对获取的第一源代码包进行预处理,删除了恶意的文件,避免了对异常文件进行编译,也防止执行代码编译的装置被攻击,提高了编译环境的安全。
为了确保编译得到的可执行文件的可靠性,本发明另一实施例在链接库函数后还对其进行了测试,请参阅图8,其示出了本发明另一实施例提供的一种代码编译方法的流程示意图,相较于图1,还包括以下步骤:
S105,对可执行文件进行模糊测试,判断可执行文件是否通过模糊测试。若可执行文件通过模糊测试,则执行步骤S106;若可执行文件没有通过模糊测试,则返回执行步骤S101,将获取的第一源代码进行信息替换得到第二源代码,以重新得到可执行文件。
其中,模糊测试(fuzzing test)通过自动或半自动的生成随机数据输入到可执行文件生成的程序中,并监视程序运行是否出现异常,如崩溃,断言(assertion)失败,以得到可执行文件生成的程序是否可靠的结果。模糊测试可以在安全沙箱中进行。
S106,判断通过模糊测试的可执行文件的数量是否达到预设数量。若通过模糊测试的可执行文件数量达到预设数量,则执行步骤S107;若通过模糊测试的可执行文件数量没有达到预设数量,则返回执行步骤S101,将获取的第一源代码进行信息替换得到第二源代码,以重新得到可执行文件。
其中,预设数量是可以是获取到的用户输入的需要的软件数目的个数,也可以是默认设置的生成的可执行文件数量。
S107,将所有可执行文件加密后发送。
本实施例的方法可以得到多个功能相同但控制流不同的可执行文件,即使其中一个可执行文件被攻击者逆向攻破,因为其他可执行文件的控制流不同,增加了攻击者的找到其他可执行文件的漏洞的难度。同时,本实施例在链接库函数得到的可执行文件后还对其进行了模糊测试,将通过测试的可执行文件作为最终的编译结果,提高了可执行文件的可靠性。
请参阅图9,其示出了本发明又一实施例提供的一种代码编译方法的流程图,相较于较于图7中的方法,本实施例方法还包括以下步骤:
S105,对可执行文件进行模糊测试。若可执行文件通过模糊测试,则执行步骤S106;若可执行文件没有通过模糊测试,则返回执行步骤S101,将获取的第一源代码进行信息替换得到第二源代码,以重新得到可执行文件。
S106,则判断通过模糊测试的可执行文件的数量是否达到预设数量。若通过模糊测试的可执行文件数量达到预设数量,则执行步骤S107;若通过模糊测试的可执行文件数量没有达到预设数量,则返回执行步骤S101,将获取的第一源代码进行信息替换得到第二源代码,以重新得到可执行文件。
S107,将所有可执行文件加密后发送。
本实施例增加的步骤说明请参见上述实施例中关于步骤S105-S107的说明,在此不再赘述。
下面介绍与方法相对应的代码编译装置实施例。请参阅10,其示出了本发明又一实施例提供一种代码编译装置的结构示意图,包括:信息替换单元101、分析单元102、修改单元103和转化及链接单元104;
信息替换单元101,用于将获取的第一源代码进行信息替换得到第二源代码。
信息替换单元101在不改变第一源代码的功能条件下,替换第一源代码中的字符串,通过将其替换成无意义的字符串增加了替换后的第二源代码的理解难度。信息替换单元101包括:函数名替换子单元、变量名替换子单元和宏定义替换子单元中的至少一个子单元。需要说明的是,当信息替换单元101包括两个以上的替换子单元时,不对替换子单元执行的先后顺序进行限定。
其中,函数名替换子单元,用于获取第一源代码中的函数名,将函数名替换为与函数名对应的第一字符串。其中,第一字符串与被替换的函数名的含义不相同。
变量名替换子单元,用于获取第一源代码中的变量名,将变量名替换为与变量名对应的第二字符串;其中,第二字符串没有在第一源代码中被用作为变量名或宏定义。
宏定义替换子单元,用于获取第一源代码中的宏定义,将宏定义替换为与宏定义对应的第三字符串;第三字符串没有在第一源代码中被用作为变量名或宏定义。
信息替换单元101的具体工作过程说明及相关的名词解释请参见上述方法实施例的步骤S101,在此不再赘述。
分析单元102,用于对第二源代码进行词法分析、语法分析和语义分析,生成汇编代码。
修改单元103,用于对汇编代码进行修改。修改单元103在不改变汇编代码实现的功能的前提下,对汇编代码进行修改实现了代码混淆,增加了汇编代码的反汇编的理解难度,即反汇编后的代码的理解难度,包括数据修改子单元、运算修改子单元和函数修改子单元中的至少一个子单元。需要说明的是,当修改单元103包括两个以上的修改子单元时,不对修改子单元执行的先后顺序进行限定。下面分别介绍上述三种修改子单元:
函数修改子单元用于修改汇编代码中函数的函数结构,一种实现方式为函数混淆。
函数修改子单元执行函数混淆的过程为:将获取到的汇编代码中的函数拆分成至少两个函数体;其中,函数体为汇编代码的函数中的部分函数;从至少两个函数体中确定至少一个函数体作为样本函数体,扩展得到与样本函数体的函数结构相同但功能不同的扩展函数体;其中,扩展函数体之间可相互跳转,且扩展函数体可跳转至样本函数体;在扩展函数体内插入改变扩展函数体的运算过程的指令,实现函数混淆。关于函数修改子单元的工作过程进一步的解释说明请参见上述方法实施例的步骤S201-S203,在此不再赘述。
数据修改子单元用于修改汇编代码中的数据段。
数据修改子单元可执行修改数据段的数据地址,和/或锁定数据段中的读写数据等操作,具体执行过程:读取汇编代码中的数据段;随机转移数据段的数据地址,并记录数据地址的偏移量;根据偏移量修改汇编代码的数据段的数据指针,使得数据段的数据指针指向转移后的数据地址;若数据段为读写数据段,在获取读写数据段的数据后,插入用于设置文件锁的汇编指令;其中文件锁用于锁定读写数据段的数据不被读取。关于数据修改子单元的工作过程进一步的解释说明请参见上述方法实施例的步骤S301-S304,在此不再赘述。
运算修改子单元用于修改汇编代码中数据运算的运算过程。
运算修改子单元在不改变汇编代码中数据运算的运算结果的前提下,将数据运算的运算过程替换成更复杂的运算过程以增加汇编代码的逆向难度。运算修改子单元具体用于:获取汇编代码中的运算指令和递归语句;生成一个随机数,根据预先设定的随机数与运算指令的对应关系,确定与随机数对应的运算指令;将汇编代码中的运算指令替换为随机数对应的运算指令,其中随机数对应的运算指令和汇编代码中的运算指令对相同数值的运算结果相同;将递归语句替换为与递归语句实现相同功能的循环语句。关于运算修改子单元的工作过程进一步的解释说明请参见上述方法实施例的步骤S401-S404,在此不再赘述。
修改单元103的具体工作过程说明及相关的名词解释请参见上述方法实施例的步骤S103,在此不再赘述。
转化及链接单元104,用于将修改单元修改后的汇编代码转化为机器码程序,将机器码程序与库函数进行链接,得到可执行文件。转化及链接单元104的具体工作过程说明及相关的名词解释请参见上述方法实施例的步骤S104,在此不再赘述。
本实施例通过信息替换单元101和修改单元103分别完成第一源代码的信息替换和对汇编代码的修改,改变了现有的代码编译机制,使得代码(或是称为反编译后的代码)变得难以理解,攻击者难以根据反编译后的代码找到可执行文件的漏洞进行攻击,提高了对可执行文件的逆向防御能力和安全系数,增大与可执行文件相对应软件的破解难度。
为了防止进行代码编译的装置的安全,在图10装置的基础上增加了对获取的源代码进行预处理的单元。请参阅11,其示出了本发明又一实施例提供一种代码编译装置的结构示意图,相比于图10装置还包括:获取单元201、解密单元202、解包单元203和检测单元204。
获取单元201,用于获取加密的第一源代码包。获取单元201的具体工作过程说明及相关的名词解释请参见上述方法实施例的步骤S001,在此不再赘述。
解密单元202,用于对第一源代码包中文件大小不超过预设值的源代码包进行解密,得到第二源代码包。解密单元202的具体工作过程说明及相关的名词解释请参见上述方法实施例的步骤S002,在此不再赘述。
解包单元203,用于对第二源代码包进行解包,得到初始源代码。
检测单元204,用于对初始源代码进行特征检测,以判断初始源代码是否为恶意软件的源代码;若初始源代码不是恶意软件的源代码,将初始源代码作为第一源代码发送至信息替换单元;若初始源代码是恶意软件的源代码,删除初始源代码,并输出警告信息。检测单元204的具体工作过程说明及相关的名词解释请参见上述方法实施例的步骤S004-S006,在此不再赘述。
本实施方式通过获取单元201、解密单元202、解包单元203和检测单元204对获取的第一源代码包进行预处理,删除了恶意的文件,避免了对异常文件进行编译,也防止执行代码编译的装置被攻击,提高了编译环境的安全。
为了确保编译得到的可执行文件的可靠性,在图10的基础上增加了测试可执行文件可靠性的单元。请参阅12,其示出了本发明又一实施例提供一种代码编译装置的结构示意图,相比于图10装置还包括:测试单元301和加密与输出单元302。
测试单元301,用于对转化及链接单元104得到的可执行文件进行模糊测试;若可执行文件通过模糊测试,则将可执行文件发送至加密与输出单元302;若可执行文件没有通过模糊测试,则通知信息替换单元101、分析单元102、修改单元103和转化及链接单元104重新工作,以重新得到可执行文件。测试单元301的具体工作过程说明及相关的名词解释请参见上述方法实施例的步骤S105,在此不再赘述。
加密与输出单元302,用于判断从测试单元301接收的可执行文件的数量是否达到预设数量;若从测试单元301接收的可执行文件数量达到预设数量,则将所有可执行文件加密后发送;若从测试单元301接收的可执行文件数量没有达到预设数量,则通知信息替换单元101、分析单元102、修改单元103和转化及链接单元104重新工作,以重新得到可执行文件。加密与输出单元302的具体工作过程说明及相关的名词解释请参见上述方法实施例的步骤S106-S107,在此不再赘述。
本实施例的装置可以得到多个功能相同但控制流不同的可执行文件,即使其中一个可执行文件被攻击者逆向攻破,因为其他可执行文件的控制流不同,增加了攻击者的找到其他可执行文件的漏洞的难度。同时,本实施例在链接库函数得到的可执行文件后还通过测试单元301对其进行了模糊测试,将通过测试的可执行文件作为最终的编译结果,提高了可执行文件的可靠性。
请参阅13,其示出了本发明又一实施例提供一种代码编译装置的结构示意图,相比于图11装置还包括:测试单元301和加密与输出单元302。各个单元的工作过程说明请参见上述实施例,在此不再赘述。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统或系统实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的系统及系统实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。

Claims (9)

1.一种代码编译方法,其特征在于,包括:
将获取的第一源代码进行信息替换得到第二源代码;
对所述第二源代码进行词法分析、语法分析和语义分析,生成汇编代码;
通过修改所述汇编代码中的数据段、修改所述汇编代码中数据运算的运算过程和修改所述汇编代码中函数的函数结构三种修改方式中的至少一种修改方式对所述汇编代码进行修改;
将修改后的汇编代码转化为机器码程序,将所述机器码程序与库函数进行链接,得到可执行文件;
所述修改所述汇编代码中函数的函数结构,包括:
将获取到的所述汇编代码中的函数拆分成至少两个函数体;其中,所述函数体为所述汇编代码的函数中的部分函数;
从所述至少两个函数体中确定至少一个函数体作为样本函数体,扩展得到与所述样本函数体的函数结构相同但功能不同的扩展函数体;其中,所述扩展函数体之间可相互跳转,且所述扩展函数体可跳转至所述样本函数体;
在所述扩展函数体内插入改变所述扩展函数体的运算过程的指令,实现函数混淆。
2.如权利要求1所述的方法,其特征在于,所述修改所述汇编代码中的数据段,包括:
读取所述汇编代码中的数据段;
随机转移所述数据段的数据地址,并记录所述数据地址的偏移量;
根据所述偏移量修改所述汇编代码的数据段的数据指针,使得所述数据段的数据指针指向转移后的数据地址。
3.如权利要求2所述的方法,其特征在于,所述修改所述汇编代码中的数据段,还包括:
若所述数据段为读写数据段,在获取所述读写数据段的数据后,插入用于设置文件锁的汇编指令;其中所述文件锁用于锁定所述读写数据段的数据不被读取。
4.如权利要求1所述的方法,其特征在于,所述修改所述汇编代码中数据运算的运算过程,包括:
获取所述汇编代码中的运算指令和递归语句;
生成一个随机数,根据预先设定的随机数与运算指令的对应关系,确定与所述随机数对应的运算指令;
将所述汇编代码中的运算指令替换为所述随机数对应的运算指令,其中所述随机数对应的运算指令和所述汇编代码中的运算指令对相同数值的运算结果相同;
将所述递归语句替换为与所述递归语句实现相同功能的循环语句。
5.如权利要求1所述的方法,其特征在于,所述将获取的第一源代码进行信息替换得到第二源代码,包括:
在获取的第一源代码初始化后,将所述第一源代码进行函数名替换、变量名替换和宏定义替换中的至少一种,得到第二源代码;其中,
所述函数名替换包括:获取所述第一源代码中的函数名,将所述函数名替换为与所述函数名对应的第一字符串;其中,所述第一字符串与被替换的所述函数名的含义不相同;
所述变量名替换包括:获取所述第一源代码中的变量名,将所述变量名替换为与所述变量名对应的第二字符串;其中,所述第二字符串没有在所述第一源代码中被用作为变量名或宏定义;
所述宏定义替换包括:获取所述第一源代码中的宏定义,将所述宏定义替换为与所述宏定义对应的第三字符串;所述第三字符串没有在所述第一源代码中被用作为变量名或宏定义。
6.如权利要求1所述的方法,其特征在于,在获取所述第一源代码之前还包括:
获取加密的第一源代码包;
对所述第一源代码包中文件大小不超过预设值的源代码包进行解密,得到第二源代码包;
对所述第二源代码包进行解包,得到初始源代码;
对所述初始源代码进行特征检测,以判断所述初始源代码是否为恶意软件的源代码;
若所述初始源代码不是恶意软件的源代码,将所述初始源代码作为所述第一源代码;
若所述初始源代码是恶意软件的源代码,删除所述初始源代码,并输出警告信息。
7.如权利要求1所述的方法,其特征在于,还包括:
对所述可执行文件进行模糊测试;
若所述可执行文件通过所述模糊测试,则判断通过所述模糊测试的可执行文件的数量是否达到预设数量;
若通过所述模糊测试的可执行文件数量达到所述预设数量,则将所有可执行文件加密后发送;
若所述可执行文件没有通过所述模糊测试或通过所述模糊测试的可执行文件数量没有达到所述预设数量,则返回执行将获取的第一源代码进行信息替换得到第二源代码,以重新得到可执行文件。
8.一种代码编译装置,其特征在于,包括:信息替换单元、分析单元、修改单元和转化及链接单元;
所述信息替换单元,用于将获取的第一源代码进行信息替换得到第二源代码;
所述分析单元,用于对所述第二源代码进行词法分析、语法分析和语义分析,生成汇编代码;
所述修改单元,用于对所述汇编代码进行修改;所述修改单元包括数据修改子单元、运算修改子单元和函数修改子单元中的至少一个子单元;其中,所述数据修改子单元用于修改所述汇编代码中的数据段;
所述运算修改子单元用于修改所述汇编代码中数据运算的运算过程;
所述函数修改子单元用于修改所述汇编代码中函数的函数结构;
所述转化及链接单元,用于将所述修改单元修改后的汇编代码转化为机器码程序,将所述机器码程序与库函数进行链接,得到可执行文件;
所述函数修改子单元,具体用于:
将获取到的所述汇编代码中的函数拆分成至少两个函数体;其中,所述函数体为所述汇编代码的函数中的部分函数;从所述至少两个函数体中确定至少一个函数体作为样本函数体,扩展得到与所述样本函数体的函数结构相同但功能不同的扩展函数体;其中,所述扩展函数体之间可相互跳转,且所述扩展函数体可跳转至所述样本函数体;在所述扩展函数体内插入改变所述扩展函数体的运算过程的指令,实现函数混淆。
9.如权利要求8所述的装置,其特征在于,所述数据修改子单元,具体用于:
读取所述汇编代码中的数据段;随机转移所述数据段的数据地址,并记录所述数据地址的偏移量;根据所述偏移量修改所述汇编代码的数据段的数据指针,使得所述数据段的数据指针指向转移后的数据地址;若所述数据段为读写数据段,在获取所述读写数据段的数据后,插入用于设置文件锁的汇编指令;其中所述文件锁用于锁定所述读写数据段的数据不被读取;
或者
所述运算修改子单元具体用于:
获取所述汇编代码中的运算指令和递归语句;生成一个随机数,根据预先设定的随机数与运算指令的对应关系,确定与所述随机数对应的运算指令;将所述汇编代码中的运算指令替换为所述随机数对应的运算指令,其中所述随机数对应的运算指令和所述汇编代码中的运算指令对相同数值的运算结果相同;将所述递归语句替换为与所述递归语句实现相同功能的循环语句。
CN202010289966.7A 2020-04-14 2020-04-14 一种代码编译方法及装置 Active CN111475168B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010289966.7A CN111475168B (zh) 2020-04-14 2020-04-14 一种代码编译方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010289966.7A CN111475168B (zh) 2020-04-14 2020-04-14 一种代码编译方法及装置

Publications (2)

Publication Number Publication Date
CN111475168A CN111475168A (zh) 2020-07-31
CN111475168B true CN111475168B (zh) 2023-05-05

Family

ID=71751861

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010289966.7A Active CN111475168B (zh) 2020-04-14 2020-04-14 一种代码编译方法及装置

Country Status (1)

Country Link
CN (1) CN111475168B (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113391817B (zh) * 2021-06-16 2022-08-26 中国海洋大学 基于antlr4的头文件替换方法及装置
CN116627429B (zh) * 2023-07-20 2023-10-20 无锡沐创集成电路设计有限公司 一种汇编代码生成方法、装置及电子设备和存储介质

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105354449A (zh) * 2015-11-04 2016-02-24 北京鼎源科技有限公司 一种面向Lua语言的加扰混淆方法和解密方法
CN106529224A (zh) * 2016-10-27 2017-03-22 南京大学 基于rop攻击特点的二进制混淆方法
CN110210190A (zh) * 2019-05-30 2019-09-06 中国科学院信息工程研究所 一种基于二次汇编的代码混淆方法
CN110825386A (zh) * 2019-11-01 2020-02-21 腾讯科技(深圳)有限公司 代码的编译方法和装置、存储介质

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
DE602006008166D1 (de) * 2006-12-21 2009-09-10 Ericsson Telefon Ab L M Verschleierung von Computerprogrammcodes
EP2159732A1 (en) * 2008-08-21 2010-03-03 Thomson Licensing Method and device for code obfuscation
US9116712B2 (en) * 2013-02-28 2015-08-25 Microsoft Technology Licensing, Llc Compile based obfuscation

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105354449A (zh) * 2015-11-04 2016-02-24 北京鼎源科技有限公司 一种面向Lua语言的加扰混淆方法和解密方法
CN106529224A (zh) * 2016-10-27 2017-03-22 南京大学 基于rop攻击特点的二进制混淆方法
CN110210190A (zh) * 2019-05-30 2019-09-06 中国科学院信息工程研究所 一种基于二次汇编的代码混淆方法
CN110825386A (zh) * 2019-11-01 2020-02-21 腾讯科技(深圳)有限公司 代码的编译方法和装置、存储介质

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
反汇编结果代码结构分析算法研究;蒋烈辉等;《小型微型计算机系统》;20070615(第06期);全文 *
基于分支函数的混淆技术研究;曹淑琴等;《计算机与现代化》;20120215(第02期);全文 *

Also Published As

Publication number Publication date
CN111475168A (zh) 2020-07-31

Similar Documents

Publication Publication Date Title
US8402541B2 (en) Proactive exploit detection
US8689201B2 (en) Automated diversity using return oriented programming
US10354064B2 (en) Computer implemented method and a system for controlling dynamically the execution of a code
CN105787305B (zh) 一种抵抗符号执行和污点分析的软件保护方法
US20120011371A1 (en) Method and apparatus for securing indirect function calls by using program counter encoding
Zhang et al. Combining static and dynamic analysis to discover software vulnerabilities
CN111475168B (zh) 一种代码编译方法及装置
JP2010092174A (ja) 不正検知方法、不正検知装置、不正検知プログラムおよび情報処理システム
Zhang et al. Static program analysis assisted dynamic taint tracking for software vulnerability discovery
CN105550581A (zh) 一种恶意代码检测方法及装置
EP3029595B1 (en) Apparatuses, mobile devices, methods and computer programs for evaluating runtime information of an extracted set of instructions based on at least a part of a computer program
Cicala et al. Analysis of encryption key generation in modern crypto ransomware
Bouffard et al. Reversing the operating system of a Java based smart card
Hamadouche et al. Virus in a smart card: Myth or reality?
CN110717181B (zh) 基于新型程序依赖图的非控制数据攻击检测方法及装置
Omar Static Analysis of Malware
US10200401B1 (en) Evaluating results of multiple virtual machines that use application randomization mechanism
Kalogranis Antivirus software evasion: an evaluation of the av evasion tools
Wang et al. NativeSpeaker: Identifying crypto misuses in Android native code libraries
Zhang Polymorphic and metamorphic malware detection
CN105574409A (zh) 一种注入代码提取方法及装置
Schaub Formal methods for the analysis of cache-timing leaks and key generation in cryptographic implementations
Kumar et al. A thorough investigation of code obfuscation techniques for software protection
Brand Forensic analysis avoidance techniques of malware
Forte Automatic Binary Analysis and Instrumentation of Embedded Firmware for a Control-Flow Integrity Solution

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