CN101887500B - 基于标签的程序控制流深度混淆方法 - Google Patents
基于标签的程序控制流深度混淆方法 Download PDFInfo
- Publication number
- CN101887500B CN101887500B CN2010101979603A CN201010197960A CN101887500B CN 101887500 B CN101887500 B CN 101887500B CN 2010101979603 A CN2010101979603 A CN 2010101979603A CN 201010197960 A CN201010197960 A CN 201010197960A CN 101887500 B CN101887500 B CN 101887500B
- Authority
- CN
- China
- Prior art keywords
- program
- control flow
- labels
- method based
- program control
- 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.)
- Expired - Fee Related
Links
Images
Landscapes
- Storage Device Security (AREA)
Abstract
本发明属于计算机软件安全及知识产权保护技术领域,具体为一种基于标签的程序控制流深度混淆方法。本发明首先是秘密生成标记数据;并使这些标记就随着程序的执行而传播。在程序的执行过程中,也可以动态的删除这些标记和增加标记。这些标记隐藏在程序的执行过程中,改变程序的实际执行过程。混淆器还可自动插入一些新的指针来改变和传播这些标记,使得分析这些标记的执行流变的异常的困难。本发明还可在不会真正执行到的路径上插入会引起控制流改变的代码。本发明实现了低性能开销下的程序控制流深度混淆,大大提高了程序的安全性和私密性。
Description
技术领域
本发明属于计算机软件安全及知识产权保护技术领域,具体涉及一种程序控制流深度混淆方法。
背景技术
随着软件的诞生,软件的逆向工程也随着诞生。这里,逆向工程是相对于正常的程序开发流程而言的。正常的程序开发流程是指从程序的高级表现形式(源代码)向低级表现形式(可执行文件)进行转换的过程,即是平时我们所常提到的程序编译的过程。图1左半部分列出了这种转换的具体步聚:首先,程序从源代码的形式由预编译器转换成抽象语法树的形式,接着再由编译器将抽象语法树转换成程序控制流图,控制流图在很大程度上能反应程序的具体逻辑和算法,是比较高级的表现形式,再接着编译器将程序控制流图进行指令化,生成体系结构相关的汇编指令,最后,汇编器将汇编指令翻译成机器可识别的可执行指令。可执行指令是一堆指令的集合,已经不再能反应程序的具体逻辑和算法,属于程序最低级的表现形式。总而言之,正常的程序开发流程是从源代码到可执行文件的转换过程。图1右半部分给出了逆向工程的具体步骤:逆向工程与正常的程序开发过程刚好相反,是从可执行文件到源代码的转换过程,通过对可执行文件的分析,反编译出汇编代码,再通过对反编译出的汇编代码进行分析,重建上层的语义,从而反推出源代码。其中重构程序控制流图是逆向工程中最为关键的一步,是程序从低级表现形式向高级表现形式转换的核心步骤。
逆向工程之所以随着软件的发展而得到了长足的发展,其主要原因在于实用性。逆向工程可以被用来找出已经不存在源代码的可执行程序的核心算法,同时可以对可执行程序进行更加深入的分析,从而找出其安全漏洞。这些应用促使逆向工程技术的发展。但我们应该看到,逆向工程技术的发展,带来了方便的同时,也带来了软件的安全与产权问题。一个公司可以通过逆向工程其竞争对手的程序从而得到其核心算法,并且逆向工程所花的时间与精力与开发一个新的程序相比要小得多,从而使得盗版软件横行。同时,一个黑客可以通过逆向工程分析可执行程序,从而找出漏洞并通过漏洞攻击服务器,造成大量的经济损失,一个典型的例子是CodeRed蠕虫病毒,此病毒是在逆向工程的帮助下,深入分析互联网信息服务系统(IIS)并找出其漏洞后编写而成的,给美国经济造成了巨大的损失。
逆向工程不可能被完全防止,但可以通过增大逆向工程的难度,使得逆向工程的成本大于其期望的收益,从而防止其使用逆向工程技术。程序控制流混淆则是这样一个技术。程序控制流混淆的基本思想是通过改变程序的控制流,使得其逆向工程难度大大增加,但保持程序的语义不变,即程序的行为不变。一个简单的示例请参照图2,程序的语义还是无条件的执行“程序代码”里面的代码,因为以上判断是一个恒等式,而else语句里的代码永远也不会得到执行。但从逆向工程的角度讲,分析的程序逻辑明显的变复杂了,因为要先分析出恒等式成立,才能知道其真正的语义,而恒等式可以非常复杂,远不止图2里这么简单,从而增加逆向工程的难度。
图2只是列举了最简单的一种程序控制流混淆技术,现实中的技术要复杂许多。我们可以看到,在程序控制流混淆技术的研究里,仍然存在以下普遍问题,即如何更加有效的转换原程序从而使转换后的程序在逆向工程的分析中更加难以构造出其真正的上层语义。
程序控制流混淆技术在广泛的研究中,产生了各种不同的方法,但以往的技术,主要针对构造图2中所述的恒等式进行研究,有的基于控制流的平向展开,有的基于函数指针的关联性,有的基于函数的跳转,还有的基于信号。这些方法都能够一定程度上混淆程序的控制流,但其性能上的开销是不容忽视的。这里以其中性能最好的基于控制流平向展开的程序控制流混淆技术为例,如果将程序的80%控制流都进行混淆的话,将带来5倍以上的性能开销,即混淆后的程序只有原程序1/5不到的性能。除了混淆后程序的性能比原程序差了很多这个问题外,以上这些技术并不能做到深度的程序混淆,因为他们都是“控制流不敏感”的,这里所说的控制流不敏感,主要是指这些技术在进行程序的控制流混淆时并不需要依靠其本身的程序控制流,一个具体的表现就是这些技术可以单独的混淆程序中的任何一个函数而不混淆其它的函数。这种控制流不敏感的混淆技术有一个很显著的问题,因为在逆向工程时,一般只需要发现原程序中最有用的算法或者只是找到其中的一个漏洞进行攻击,而这种控制流不敏感的混淆使得逆向工程时可以针对其核心算法进行分析,从而大大降低了逆向工程的成本,故本文认为这些技术不能真正做到深度的程序控制流分析。
发明内容
本发明的目的在于提出一种控制流敏感的、混淆效果好的程序控制流深度混淆方法。
本发明提出的程序控制流深度混淆方法,是一种基于标记的程序控制流混淆方法。第一步就是秘密的生成标记数据。秘密生成标记数据的方法很多,如可以通过人为的插入程序漏洞生成,可以通过复杂的计算式生成,也可以利用不同体系结构上的自身特性生成等等。
在秘密的生成好了这些标记后,这些标记就后随着程序的执行而传播。当然,在程序的执行过程中,也可以动态的删除这些标记和增加标记。这些标记隐藏在程序的执行过程中,改变程序的实际执行过程。具体的讲,就是带有标记的数据在使用时和没有标记的数据不一样,比如有标记的数据在作为内存地址进行内存读取时,将产生异常,这种异常可以被程序所捕捉到,从而利用来改变程序的控制流,实现程序的执行过程改变。
为了更进一步的增加程序控制流的混淆程度,除了程序本身的逻辑会使用这些标记并传播这些标记外,混淆器还会自动插入一些新的指针来改变和传播这些标记,使得分析这些标记的执行流变的异常的困难。同时,本发明也沿用了以前技术中的花指令(bogus code)技术,即在不会真正执行到的路径上插入会引起控制流改变的代码,更进一步的进行程序控制流的混淆。
本发明方法与以前方法最大的不同在于,在程序本身的执行过程中,标记的信息会随着程序的执行而传播,使得这种混淆技术是程序控制流敏感的,从而能达到非常好的混淆效果。逆向工程时,必需要对整个程序的控制流进行分析,而不能单独分析某个函数,从而实现深度的程序控制流混淆。同时,由于标记的传播随着程序的运行而存在,使得其传播与程序本身的运行并行,分摊了运行的开销,从而性能上的开销非常的小,是以前的技术所不能比拟的。即实现了低性能开销下的程序控制流的深度混淆。
本发明的有益效果是,实现了低性能开销下的程序控制流深度混淆,大大提高了程序的安全性和私密性,而只带来很小的性能开销。本发明的程序控制流混淆技术是基于标记的,故用户需要重新编译源代码生成可执行程序,但对源代码是透明的,用户并不需要改动源代码。
附图说明
图1为编译与反编译的流程示意图。
图2为基于恒等式的程序控制流混淆技术原理的示意图。
图3为本发明的程序控制流混淆技术原理示意图。
具体实施方式
下面结合附图和实施例对本发明进一步说明。
如图3所示,一条无条件跳转指令被混淆成了右边的程序指令。原程序的语义是将处理器的PC值跳转到L1的地址。混淆后的程序指令实际上完成了相同的功能,我们来具体分析其执行过程。
首先,程序在执行过程中,有一个带有标记的数据被赋值给了寄存器R5,这时R5随着程序的执行将标记传播给了R3。我们可以看到,R3同样也是一个带有标记的寄存器。接着,正如前面在发明内容中提到的,带有标记的数据和不带标记的数据在CPU处理上是会有区别的,R3这个带有标记的数据被用作内存地址进行读取,将会产生异常的,这时候因为异常,程序会自动将控制流转入事先定义好的一个异常处理函数中,而这时处函数根据当前的PC值,可以计算出抛出异常的点,而这个异常点所对应的异常处理函数正是将PC值设置为L1的地址。自此,我们可以看到,这个内存读取指令实际上是完成了无条件跳转指令跳转到L1地址这件事,但其本身并不是一个控制流指令,从而很好的隐藏了真实的控制流,实现了混淆。最后,因为此内存读取指令实际是一个无条件跳转指令,其后面的指令是不会执行到的,故混淆器可以插入花指令来更进一步的实现控制流的混淆。
Claims (4)
1.一种基于标签的程序控制流深度混淆方法,其特征在于:第一步就是秘密生成标记数据,这些标记随着程序的执行而传播:首先,程序在执行过程中,有一个带有标记的数据被赋值给了寄存器R5,这时寄存器R5随着程序的执行将标记传播给寄存器R3;接着,带有标记的数据和不带标记的数据在CPU处理上会有区别,寄存器R3这个带有标记的数据被用作内存地址进行读取,将会产生异常,因为异常,程序自动将控制流转入事先定义好的一个异常处理函数中,这时异常处理函数根据当前的PC值,计算出抛出异常的点,这个异常点所对应的异常处理函数正是将PC值设置为L1的地址;
所述秘密生成标记数据的方法为:通过人为的插入程序漏洞生成,或者通过复杂的计算式生成,或者利用不同体系结构上的自身特性生成。
2.根据权利要求1所述的基于标签的程序控制流深度混淆方法,其特征在于在程序的执行过程中,动态的删除所述标记数据或增加标记数据。
3.根据权利要求1或2所述的基于标签的程序控制流深度混淆方法,其特征在于混淆器还自动插入新的指针来改变和传播所述标记数据。
4.根据权利要求1或2所述的基于标签的程序控制流深度混淆方法,其特征在于除了增加标记数据之外,在不会真正执行到的路径上插入会引起控制流改变的代码。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2010101979603A CN101887500B (zh) | 2010-06-10 | 2010-06-10 | 基于标签的程序控制流深度混淆方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2010101979603A CN101887500B (zh) | 2010-06-10 | 2010-06-10 | 基于标签的程序控制流深度混淆方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101887500A CN101887500A (zh) | 2010-11-17 |
CN101887500B true CN101887500B (zh) | 2013-01-02 |
Family
ID=43073417
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2010101979603A Expired - Fee Related CN101887500B (zh) | 2010-06-10 | 2010-06-10 | 基于标签的程序控制流深度混淆方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101887500B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9330028B2 (en) * | 2014-03-27 | 2016-05-03 | Intel Corporation | Instruction and logic for a binary translation mechanism for control-flow security |
CN106845168B (zh) * | 2016-12-20 | 2019-05-03 | 西安电子科技大学 | 一种面向远程计算的控制流隐藏方法 |
CN108846265B (zh) * | 2018-04-18 | 2021-07-30 | 北京奇虎科技有限公司 | 一种程序加固方法及装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1574727A (zh) * | 2003-05-20 | 2005-02-02 | 三星电子株式会社 | 防止程序篡改的方法、升级混淆程序的方法及装置 |
CN101031859A (zh) * | 2004-09-30 | 2007-09-05 | Ttpcom有限公司 | 程序源代码保护 |
CN101271397A (zh) * | 2007-03-23 | 2008-09-24 | 北京大学 | 一种嵌套循环结构的识别方法 |
-
2010
- 2010-06-10 CN CN2010101979603A patent/CN101887500B/zh not_active Expired - Fee Related
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1574727A (zh) * | 2003-05-20 | 2005-02-02 | 三星电子株式会社 | 防止程序篡改的方法、升级混淆程序的方法及装置 |
CN101031859A (zh) * | 2004-09-30 | 2007-09-05 | Ttpcom有限公司 | 程序源代码保护 |
CN101271397A (zh) * | 2007-03-23 | 2008-09-24 | 北京大学 | 一种嵌套循环结构的识别方法 |
Also Published As
Publication number | Publication date |
---|---|
CN101887500A (zh) | 2010-11-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Trippel et al. | Checkmate: Automated synthesis of hardware exploits and security litmus tests | |
Sharif et al. | Automatic reverse engineering of malware emulators | |
CN108614960B (zh) | 一种基于前端字节码技术的JavaScript虚拟化保护方法 | |
CN103544414B (zh) | 一种Android系统应用的深度代码混淆方法 | |
Kim et al. | ScanDal: Static analyzer for detecting privacy leaks in android applications | |
US9336370B2 (en) | Method and apparatus for dynamic obfuscation of static data | |
CN106096338B (zh) | 一种具有数据流混淆的虚拟化软件保护方法 | |
Yin et al. | Temu: Binary code analysis via whole-system layered annotative execution | |
Tian et al. | Software plagiarism detection with birthmarks based on dynamic key instruction sequences | |
Böhm et al. | Generalized just-in-time trace compilation using a parallel task farm in a dynamic binary translator | |
US8589897B2 (en) | System and method for branch extraction obfuscation | |
CN108733988A (zh) | 安卓平台上可执行程序的保护方法 | |
Yadegari et al. | Bit-level taint analysis | |
Gao et al. | Android testing via synthetic symbolic execution | |
US9721120B2 (en) | Preventing unauthorized calls to a protected function | |
Choi et al. | A static API birthmark for Windows binary executables | |
CN109344612A (zh) | 针对程序代码静态分析逆向攻击的主动防御方法及系统 | |
Liu et al. | Binary code analysis | |
CN107577925B (zh) | 基于双重ARM指令虚拟的Android应用程序保护方法 | |
CN105718765A (zh) | 一种利用有限自动机实现代码混淆的方法 | |
CN101887500B (zh) | 基于标签的程序控制流深度混淆方法 | |
Kuang et al. | Exploiting dynamic scheduling for VM-based code obfuscation | |
Duan et al. | TEEFuzzer: A fuzzing framework for trusted execution environments with heuristic seed mutation | |
Arasteh et al. | Forensic memory analysis: From stack and code to execution history | |
Borzacchiello et al. | SENinja: A symbolic execution plugin for Binary Ninja |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20130102 Termination date: 20180610 |