CN104573427B - 一种可执行应用的混淆方法和装置 - Google Patents

一种可执行应用的混淆方法和装置 Download PDF

Info

Publication number
CN104573427B
CN104573427B CN201510005064.5A CN201510005064A CN104573427B CN 104573427 B CN104573427 B CN 104573427B CN 201510005064 A CN201510005064 A CN 201510005064A CN 104573427 B CN104573427 B CN 104573427B
Authority
CN
China
Prior art keywords
instruction
obscure
command sequence
executable application
code
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
CN201510005064.5A
Other languages
English (en)
Other versions
CN104573427A (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.)
Beijing University of Posts and Telecommunications
Original Assignee
Beijing University of Posts and Telecommunications
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 Beijing University of Posts and Telecommunications filed Critical Beijing University of Posts and Telecommunications
Priority to CN201510005064.5A priority Critical patent/CN104573427B/zh
Publication of CN104573427A publication Critical patent/CN104573427A/zh
Application granted granted Critical
Publication of CN104573427B publication Critical patent/CN104573427B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

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

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Multimedia (AREA)
  • Technology Law (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本发明提供了一种可执行应用的混淆方法和装置,其中的方法包括:A、对需混淆的可执行代码进行逆向分析,得到逆向分析后的指令序列;B、对所述逆向分析后的指令序列进行指令抽象和统计分析,根据统计分析结果进行编码,生成Huffman编码树;C、将需混淆的可执行代码的二进制流根据所述Huffman编码树进行重新编码,生成混淆后的指令序列;D、将所述混淆后的指令序列进行封装,并打包生成混淆后的可执行应用。应用本发明可以降低自动化工具对混淆方法的识别能力,增加攻击者阅读代码和破解应用的难度。

Description

一种可执行应用的混淆方法和装置
技术领域
本发明涉及信息安全技术领域,尤其涉及一种可执行应用的混淆方法和装置。
背景技术
在信息安全技术领域,为了对可执行应用或代码进行保护,一般都会使用混淆技术对发布出去的可执行应用进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,但混淆后的代码却很难被反编译,即使反编译成功也将难以阅读,很难得出程序的真正语义。
在现有技术中,国内外已经在混淆技术领域做了大量的研究,也提出了一些可行的技术方法,并且构造了相应的混淆工具。目前,主要的混淆方法主要包括数据混淆、控制流混淆和切片混淆等。
数据混淆的原理是通过对常量、变量和数据结构这些程序的基本组成元素进行修改的方式,增大攻击者进行逆向工程的难度。数据混淆方法包括:变量存储和编码混淆、变量聚合混淆、顺序调整混淆、词法混淆以及移除注释和调试信息混淆。
关于控制流混淆,程序的控制转换过程的信息是追踪定位程序状态的重要线索,如何保护这部分信息也是软件保护中很重要的一个环节。控制流图(Control Flow Graph,CFG)是程序可能执行流程的图形化表示,它可以用来描述程序的控制转换。一个程序可以被分成由一系列无分支的代码组成的基本代码块,这些基本块作为控制流图的结点,而图的边即为各个基本块之间可能的跳转关系。控制流混淆的目的就是改变或复杂化程序的控制流,使程序更难以破译。控制混淆可采用的手段很多,比如应用不透明谓词增加伪造分支、加入可导致反编译错误的指令(例如在Java字节码中添加goto语句等)、将一段代码转换为内联函数调用等。
关于切片混淆,切片通常是用来帮助理解程序,而混淆的目的是使程序更难以被理解。在现有技术中,Drape等人提出了切片混淆算法,使得混淆过的程序能够更好地对抗切片分析攻击。切片混淆(slicing obfuscation)算法的主要思想就是尽可能多地将多个变量的值放入到切片的观察范围之内,增加使用切片分析程序的攻击者的困难程度。切片混淆的主要方法有:增加恒假谓词、变量编码和增加循环变量。增加恒假谓词是在恒假谓词的假分支上增加令x与Y相关的函数;变量编码是在不改变语义的情况下将Y的表达式重新编码为与x相关的表达式;增加循环变量是在循环变量中添加与x,Y相关的变量。
目前,主流的混淆工具基本都是基于上述方法来实现的,混淆的评估一般从强度、开销、隐蔽性、弹性等方面对混淆算法进行评估。虽然现有技术中的上述方法能够满足应用混淆的指标,但是仍然具有一定的局限性:
1、传统应用软件混淆大多数基于软件源码
ProGuard及APKProtect等应用软件混淆工具都是基于源码的混淆方法,需要在获取开发者源代码的基础上进行保护,因此,各大软件厂商和应用商店无法直接对已经发布的可执行程序进行混淆。
2、静态混淆难以防止动态调试
传统的混淆算法大多属于静态混淆技术,通过传统方法进行混淆后,虽然能够增加攻击者的阅读难度,但是仍然可以理解大部分的程序代码,同时也难以抵挡IDA等工具的动态调试。
3、混淆方法易被发现
经过传统方法的混淆后,攻击者能够从混淆后的应用程序代码片段中发现各种可能被利用的特征,从特征中可以分析判断出使用的混淆方法,然后通过各种针对性分析方法对目标应用去混淆,甚至可以通过自动化去混淆工具进行攻击。
目前,移动应用软件中暴露出大量的安全问题。经研究发现,大部分安全问题并不是应用本身存在问题,而是应用软件在发布后被恶意开发者破解后加入恶意代码重新打包发布所导致的问题。现有技术中已经有大量工具对应用软件进行保护,例如,传统混淆工具会对应用进行各种混淆,加固工具会使用解壳程序将原始程序进行解密后运行。但是,由于传统混淆工具和加固工具具有鲜明的特征,可以通过随机性、熵等各种指标进行量化区分,各种自动去混淆、脱壳工具已经应运而生,从而使得应用安全保护手段都受到了一定程度的威胁。
发明内容
有鉴于此,本发明提供了一种可执行应用的混淆方法和装置,从而可以降低自动化工具对混淆方法的识别能力,增加攻击者阅读代码和破解应用的难度。
本发明的技术方案具体是这样实现的:
一种可执行应用的混淆方法,该方法包括:
A、对需混淆的可执行代码进行逆向分析,得到逆向分析后的指令序列;
B、对所述逆向分析后的指令序列进行指令抽象和统计分析,根据统计分析结果进行编码,生成Huffman编码树;
C、将需混淆的可执行代码的二进制流根据所述Huffman编码树进行重新编码,生成混淆后的指令序列;
D、将所述混淆后的指令序列进行封装,并打包生成混淆后的可执行应用。
较佳的,在所述步骤D之后,该方法还进一步包括:
E、对混淆后的可执行应用进行分析,获取相应的Huffman编码树;
F、生成一个加载器,并使用该加载器将所述混淆后的可执行应用加载到内存中,启动所述混淆后的可执行应用;
G、根据所得到的Huffman编码树对该混淆后的可执行应用进行解码,得到解码后的程序指令并执行。
较佳的,所述根据统计分析结果进行编码,生成Huffman编码树包括:
B1、从逆向分析后的指令序列中截取一个指令片段;
B2、对所述指令片段中相似的指令进行指令抽象得到抽象指令;
B3、分别对各个抽象指令及其参数的频数进行计数统计;
B4、根据计数统计结果生成前缀编码树和参数编码树;
其中,前缀编码树中的每一个叶子节点均为一种抽象指令;前缀编码树中的任意一个叶子节点均对应一个参数编码树。
较佳的,所述根据所得到的Huffman编码树对该混淆后的可执行应用进行解码包括:
根据所获取的混淆后应用的指令序列,从所述Huffman编码树中逐条查找所述指令序列中的各个指令及其参数所对应的编码并输出,形成一个编码序列;
根据所述Huffman编码树以及所述编码序列恢复出原始指令序列。
较佳的,所述加载器利用Android Linux中的ptrace机制,动态查询运行可执行应用的Android设备的断点;如果发现所述可执行应用本身被调试,则立刻中断该可执行应用的运行。
本发明还提供了一种可执行应用的混淆装置,该装置包括:逆向分析器、第一预处理器、混淆器和重编译器;
其中,所述逆向分析器,用于对需混淆的可执行代码进行逆向分析,得到逆向分析后的指令序列;将所述逆向分析后的指令序列发送给所述第一预处理器;
所述第一预处理器,用于对所述逆向分析后的指令序列进行指令抽象和统计分析,根据统计分析结果进行编码,生成Huffman编码树;将所述Huffman编码树发送给所述混淆器;
所述混淆器,用于将需混淆的可执行代码的二进制流根据所述Huffman编码树进行重新编码,生成混淆后的指令序列;将所述混淆后的指令序列发送给所述重编译器;
所述重编译器,用于将所述混淆后的指令序列进行封装,并打包生成混淆后的可执行应用。
较佳的,所述可执行应用的混淆装置还进一步包括:第二预处理器、加载器和解码器;
所述第二预处理器,用于对混淆后的可执行应用进行分析,获取相应的Huffman编码树;将所述Huffman编码树发送给所述解码器;
所述加载器,用于将所述混淆后的可执行应用加载到内存中,启动所述混淆后的可执行应用;
所述解码器,用于根据所得到的Huffman编码树对所述混淆后的可执行应用进行解码,得到解码后的程序指令并执行。
由上述技术方案可见,在本发明的技术方案中,由于先根据需混淆的可执行代码生成了一个Huffman编码树,然后再根据该Huffman编码树对需混淆的可执行代码的二进制流进行重新编码,生成混淆后的指令序列,因此可以在尽可能小地改变统计特性的前提下,对原始指令序列进行重新编码,大大降低了自动化工具对混淆方法的识别能力;而且,由于原始的指令序列被重新编码,因此也极大的增加了攻击者的阅读代码和破解应用软件的难度。另外,由于本发明所提供的方法中结合了传统混淆、动态混淆、加固等多种技术手段,在混淆过程中极大的改变了原程序的控制流、数据流等,因此使得攻击者难以完成对原代码的阅读。另外,由于本发明中使用了自定义的加载器,该加载器可以利用Android Linux中的ptrace机制,动态查询Android设备的断点,一旦发现程序本身被调试,可以立刻中断程序本身,因此可以有效地阻止攻击者对目标程序的动态调试。此外,由于本发明中所提出的方法中虽然也具有一些保护特征,但是由于编解码均使用原程序指令进行替换,因此对随机性和熵等指标造成的影响相对较小,攻击者通过反编译也很难发现程序被进行了重新编码,因此具有较高的隐蔽性,可应用于各种Android系统和平台。
附图说明
图1为本发明实施例中的可执行应用的混淆方法的流程示意图。
图2为本发明实施例中生成Huffman编码树的原理示意图。
图3为本发明实施例中混淆器的工作原理示意图一。
图4为本发明实施例中混淆器的工作原理示意图二。
图5为本发明实施例中解码器的工作原理示意图。
图6是本发明实施例中的可执行应用的混淆装置的结构示意图。
具体实施方式
为使本发明的技术方案及优点更加清楚明白,以下结合附图及具体实施例,对本发明作进一步详细的说明。
图1为本发明实施例中的可执行应用的混淆方法的流程示意图。如图1所示,本发明实施例中的可执行应用的混淆方法包括:
步骤11,对需混淆的可执行代码进行逆向分析,得到逆向分析后的指令序列。
在本发明的技术方案中,可以使用逆向分析器对需混淆的可执行代码进行逆向分析,得到逆向分析后的指令序列。
具体来说,较佳的,在本发明的具体实施例中,可以使用逆向分析器对需混淆的可执行代码进行自动化逆向分析,将可执行代码还原到Dalvik/Arm指令层,从而得到经过逆向分析后的指令序列。
步骤12,对所述逆向分析后的指令序列进行指令抽象和统计分析,根据统计分析结果进行编码,生成Huffman编码树。
由于目前Android系统中共有256条Dalvik指令,其中无参数的简单指令占了相当大的比例,这些简单指令所组成的序列构成了复杂的代码。因此,在一段函数指令片段中,一般会出现很多次重复指令序列,因此可以利用Huffman编码树实现对整个函数指令片段的编码。
因此,在本发明的较佳实施例中,可以使用第一预处理器对所述逆向分析后的指令序列进行指令抽象(例如,将MOV/16和MOV/32等指令抽象成MOV指令)和统计分析,并根据统计分析结果进行编码,生成Huffman编码树。
具体来说,在生成Huffman编码树时,首先可以从逆向分析后的指令序列中任意截取一个指令片段,对该指令片段进行统计分析,对该指令片段中相似的指令进行指令抽象得到抽象指令(例如,将MOV/16和MOV/32等指令抽象成MOV指令),并分别对抽象指令和每个指令的参数进行计数统计;根据计数统计生成前缀编码树和参数编码树这两类Huffman编码树。其中,在每一段指令片段中,只生成一个前缀编码树,其中前缀编码树中的每一个叶子节点均为一种抽象指令;而参数编码树则可生成若干个,即对于前缀编码树中的任意一个叶子节点,均生成一个对应的参数编码树(该参数编码树可能是空树)。
例如,在本发明的一个较佳实施例中,所述根据统计分析结果进行编码,生成Huffman编码树包括:
步骤a1、从逆向分析后的指令序列中截取一个指令片段。
步骤a2、对该指令片段中相似的指令进行指令抽象得到抽象指令。
例如,可以将MOV/16和MOV/32等指令抽象成MOV指令。
步骤a3、分别对各个抽象指令及其参数的频数进行计数统计。
步骤a4、根据计数统计结果生成前缀编码树和参数编码树。
其中,前缀编码树中的每一个叶子节点均为一种抽象指令;前缀编码树中的任意一个叶子节点均对应一个参数编码树。
图2为本发明实施例中生成Huffman编码树的原理示意图。例如,如图2所示,图2中的左边为一个函数中出现的指令序列(也可以称为指令片段),通过上述的方法可以根据图2中的指令序列生成图2中右边所示的Huffman编码树(包括前缀编码树和参数编码树)。
例如,在上述的图2中,对指令序列进行指令抽象之后得到相应的抽象指令:指令1、指令2、指令3、指令4,而且各个抽象指令的参数包含两部分:指令前缀部分和参数部分,其中,参数部分可以为空。然后,对各个抽象指令及其参数的频数(即在上述指令序列中出现的次数)进行计数统计;如图2所示,计数统计结果显示:在该指令序列中,指令前缀1、2、3的频数分别为2、1、1。
由于Huffman编码是通过计算统计特性而生成树的过程,而Huffman编码树均是自底向上而构建的编码树,因此根据上述三个前缀的频数,可以首先将指令前缀2对应的节点(称为结点2)和指令前缀3对应的节点(称为结点3)构成第一个子树;其中,结点2的值为指令前缀2的频数i(图2中i=1),结点3的值为指令前缀3的频数j(图2中j=1)。因此,该子树的根结点的值为:i+j=1+1=2。随后,该根结点与指令前缀1对应的节点(称为结点1,)又生成一个新的子树,从而生成图2右上所示的前缀编码树。其中,结点1的值为指令前缀1的频数k(图2中k=2);新的子树的根结点的值为:i+j+k=1+1+2=4。
在编码过程中,左子树将被编码为0,右子树将被编码为1。因此,根据上述的前缀编码树可知,指令前缀1被编码为“0”,指令前缀2被编码为“10”,指令前缀3被编码为“11”,如图2中右上的前缀编码树所示。
而对于指令前缀1来说,其相应的参数也将被编码,例如,在上述的指令序列中,指令1中的指令前缀1之后有两个参数:参数11和参数12(可统称为参数1),出现的频次为1,因此,指令1中的参数11和参数12被编码为“0”;,指令2中的参数只有一个参数21,为根结点,因此无编码;指令3中无参数,因此也无编码;指令4中的指令前缀1之后有两个参数:参数31和参数32(可统称为参数3),出现的频次为1,因此,该参数3被编码为“1”,从而生成了图2右下所示的参数编码树。
因此,根据上述的Huffman编码树(包括前缀编码树和参数编码树)可知,上述指令序列中的指令1的指令前缀编码部分被编码为0,参数编码部分也被编码为0,所以该指令1将会被编码为“00”,指令2只有指令前缀编码部分,因此被编码为“10”,指令3也只有指令前缀编码部分,因此被编码为“11”,指令4的指令前缀编码部分被编码为0,参数编码部分被编码为1,所以指令4被编码为“01”。
步骤13,将需混淆的可执行代码的二进制流根据所述Huffman编码树进行重新编码,生成混淆后的指令序列。
在本发明的技术方案中,可以使用混淆器将需混淆的可执行代码的二进制流根据所述Huffman编码树进行重新编码,生成混淆后的指令序列。
在进行文本压缩中,编码过程会将若干个8bit的字符用若干二进制位来表示,从而实现对目标字符进行压缩;而在解压缩过程中,则可根据所生成的编码表,将编码后的二进制位进行解码恢复,从而得到原始的字符。
而在本发明的技术方案中,本步骤的工作流程类似于“解压缩”的过程,由于Huffman编码为自底向上构建的树,对于其中任何子树来说均为满树。因此,根据解析得到的Huffman编码树,直接将待混淆的可执行文件进行输入,逐字节读取并在Huffman编码树中查找对应指令,则可得到混淆后的程序片段,即混淆后的指令序列。
例如,图3为本发明实施例中混淆器的工作原理示意图一。图4为本发明实施例中混淆器的工作原理示意图二。如图3和图4所示,在得到Huffman编码树后,可以根据该Huffman编码树对需混淆的可执行代码的二进制流(即指令序列所对应的二进制数据流)进行编码,从而得到混淆后的结果序列。
例如,图3左上部分为一个指令片段,对该指令片段进行指令抽象和计数统计之后,可以得到计数统计结果,即各个抽象指令及其参数的频数,如图3左下部分所示。根据上述的计数统计结果,按照图2所示的生成Huffman编码树的方法,可以生成图3右部所示的前缀编码树和参数编码树。其中,图3中所示的参数编码树为指令Push的参数编码树。其它指令也可以生成相应的参数编码树,但是由于篇幅的限制,未在图3中一一示出。上述前缀编码树和参数编码树的具体生成过程在此不再赘述。
生成Huffman编码树之后,即可将需混淆的可执行代码的二进制流根据上述所生成的Huffman编码树进行重新编码,生成混淆后的指令序列。
例如,图4中左边所示的指令片段中的前两条指令片段,通过上述的方法进行混淆后,将被混淆编码成图4中右下所示的6条指令。
具体来说,上述的两条指令片段在可执行程序中的实际机器码是图4右上角所示的二进制形式(即二进制流),例如,push ebp的机器码为01010000,而push esi的机器码为01010110。
由于Huffman编码树是自下向上构建的树,也就是说Huffman编码树是满树,任何结点只要有子节点,一定会有两个子节点。因此对于任何一个Huffman编码树,只要输入一段机器码,就一定能够在Huffman编码树中找到某一个叶子节点,即一个指令。所以,在根据Huffman编码树对二进制流进行重新编码时,可以根据Huffman编码树,对需要编码的二进制流进行逐位匹配,从而生成相应的指令和参数。
例如,当根据图3中所生成的前缀编码树和各个指令的参数编码树(图3中只示出了指令Push的参数编码树),对图4右上角所示的二进制流进行混淆(即重新编码)时,在所述二进制流中,第一个匹配到的指令是JZ(010),并且JZ有唯一参数short loc_403708;第二个匹配到的指令是push(1),而指令push有相应的参数编码树,能匹配到的参数是eax(0),由此得到第二条指令push eax(10);第三个匹配到的指令是call(00)sub_4064EE(0);第四个匹配到的指令是JZ short loc_403708(010);第五个匹配到的指令是push eax(10);第六个匹配到的指令是push(1)ebp(10)。因此,根据所生成的Huffman编码树,通过上述的步骤,图4右上角所示的二进制流将被混淆编码成图4中右下所示的6条指令。
通过对比可以看出,左边的原始指令序列经过混淆后,所生成的混淆后的指令序列与原始指令序列相比,产生了非常明显的变化,通过混淆后的指令序列完全无法正确理解原始指令片段的真实意义。
步骤14,将所述混淆后的指令序列进行封装,并打包生成混淆后的可执行应用。
在本发明的技术方案中,可以使用重编译器将所述混淆后的指令序列进行封装,并打包生成混淆后的可执行应用。
通过上述的步骤11~14,即可对原始的可执行应用(即可执行代码)进行混淆,从而生成混淆后的可执行应用。
在生成上述混淆后的可执行应用之后,即可将该混淆后的可执行应用投入实际应用中。
在本发明的技术方案中,在得到该混淆后的可执行应用之后,还可以进一步对上述混淆后的可执行应用进行解码和加载运行。
例如,可以对该混淆后的可执行应用进行分析从而获取相应的Huffman编码树,然后将上述混淆后的可执行应用通过自定义的加载器加载到内存中,并启动上述混淆后的可执行应用;再根据所得到的Huffman编码树对该混淆后的可执行应用进行解码,得到解码后的程序指令。
因此,较佳的,在本发明的具体实施例中,所述步骤14之后还可进一步包括:
步骤15,对混淆后的可执行应用进行分析,获取相应的Huffman编码树。
由于混淆过程中所用到的Huffman编码树将会保存在混淆后的应用程序中,因此,较佳的,在本发明的较佳实施例中,可以使用第二预处理器对混淆后的可执行应用进行分析,通过寻址获取相应的Huffman编码树。
步骤16,生成一个加载器,并使用该加载器将所述混淆后的可执行应用加载到内存中,启动所述混淆后的可执行应用。
步骤17,根据所得到的Huffman编码树对该混淆后的可执行应用进行解码,得到解码后的程序指令并执行。
较佳的,在本发明的较佳实施例中,可以使用解码器根据所得到的Huffman编码树对该混淆后的可执行应用进行解码,得到解码后的程序指令并执行。
在解码过程中,首先需要获取Huffman编码树;在获取Huffman编码树之后,即可根据所获取的混淆后应用的指令序列,从所述Huffman编码树中逐条查找所述指令序列中的各个指令及其参数所对应的编码并输出,形成一个编码序列;然后,即可按照Huffman解码过程根据所述Huffman编码树以及上述编码序列恢复出原始指令序列。
具体来说,例如,图5为本发明实施例中解码器的工作原理示意图,如图5所示,在本发明的具体实施例中,图5所示的左边为所述混淆后的指令序列(即函数指令片段),在对此函数指令片段进行解码时,将根据所获取的混淆后应用的指令序列,从Huffman编码树中逐条查找各个指令及其参数所对应的编码并输出,从而逐步恢复出混淆前的指令序列。例如,图5所示的左边的指令序列中的指令“MOV”将被还原成编码“101”,指令序列中的指令“PUSH”指令将被还原成编码“11”,…….,依次类推,即可将指令序列中各个指令均还原为相应的编码,然后再根据所述Huffman编码树以及上述编码序列恢复出原始指令序列。
由于上述的解码过程中实质上相当于一种查表过程而非加解密过程,因此一方面可以尽可能的提高解码速度,减少对解码效率的影响,另一方面也可以尽可能的降低对随机性、熵等统计指标的影响,提高了混淆技术本身的隐蔽性。
由于在使用解码器对可执行应用的程序指令进行恢复时,如果不使用自定义的加载器,将难以实现Android应用程序对解码器的支持。因此,在本发明的技术方案中,将在步骤16中,在所述混淆后的可执行应用的程序入口生成一个加载器,该加载器将自动对Huffman编码树进行寻址,并且在程序运行过程中调用解码器,将解码器恢复出来的二进制字节码加载到Android设备内存中,执行解码后指令,实现原应用软件的加载和使用。
此外,较佳的,在本发明的较佳实施例中,所述加载器将利用Android Linux中的ptrace机制,动态查询运行可执行应用的Android设备的断点,如果发现该可执行应用本身被调试,则立刻中断该可执行应用本身的运行,从而可以防止攻击者对该可执行应用进行动态调试。
根据本发明提供的上述可执行应用的混淆方法,本发明还提供了相应的可执行应用的混淆装置,具体请参见图6。
图6是本发明实施例中的可执行应用的混淆装置的结构示意图。如图6所示,本发明实施例中的可执行应用的混淆装置包括:逆向分析器、第一预处理器、混淆器和重编译器;
其中,所述逆向分析器,用于对需混淆的可执行代码进行逆向分析,得到逆向分析后的指令序列;将所述逆向分析后的指令序列发送给所述第一预处理器;
所述第一预处理器,用于对所述逆向分析后的指令序列进行指令抽象和统计分析,根据统计分析结果进行编码,生成Huffman编码树;将所述Huffman编码树发送给所述混淆器;
所述混淆器,用于将需混淆的可执行代码的二进制流根据所述Huffman编码树进行重新编码,生成混淆后的指令序列;将所述混淆后的指令序列发送给所述重编译器;
所述重编译器,用于将所述混淆后的指令序列进行封装,并打包生成混淆后的可执行应用。
较佳的,在本发明的具体实施例中,所述可执行应用的混淆装置还进一步包括:第二预处理器、加载器和解码器;
所述第二预处理器,用于对混淆后的可执行应用进行分析,获取相应的Huffman编码树;将所述Huffman编码树发送给所述解码器;
所述加载器,用于将所述混淆后的可执行应用加载到内存中,启动所述混淆后的可执行应用;
所述解码器,用于根据所得到的Huffman编码树对所述混淆后的可执行应用进行解码,得到解码后的程序指令并执行。
综上所述,在本发明的技术方案中,由于先根据需混淆的可执行代码生成了一个Huffman编码树,然后再根据该Huffman编码树对需混淆的可执行代码的二进制流进行重新编码,生成混淆后的指令序列,因此可以在尽可能小地改变统计特性的前提下,对原始指令序列进行重新编码,大大降低了自动化工具对混淆方法的识别能力;而且,由于原始的指令序列被重新编码,因此也极大的增加了攻击者的阅读代码和破解应用软件的难度。另外,由于本发明所提供的方法中结合了传统混淆、动态混淆、加固等多种技术手段,在混淆过程中极大的改变了原程序的控制流、数据流等,因此使得攻击者难以完成对原代码的阅读。另外,由于本发明中使用了自定义的加载器,该加载器可以利用Android Linux中的ptrace机制,动态查询Android设备的断点,一旦发现程序本身被调试,可以立刻中断程序本身,因此可以有效地阻止攻击者对目标程序的动态调试。此外,由于本发明中所提出的方法中虽然也具有一些保护特征,但是由于编解码均使用原程序指令进行替换,因此对随机性和熵等指标造成的影响相对较小,攻击者通过反编译也很难发现程序被进行了重新编码,因此具有较高的隐蔽性。另外,本发明中所提供的方法和装置,均可应用于各种Android系统和平台。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。

Claims (6)

1.一种可执行应用的混淆方法,其特征在于,该方法包括:
A、对需混淆的可执行代码进行逆向分析,得到逆向分析后的指令序列;
B、对所述逆向分析后的指令序列进行指令抽象和统计分析,根据统计分析结果进行编码,生成Huffman编码树;
C、将需混淆的可执行代码的二进制流根据所述Huffman编码树进行重新编码,生成混淆后的指令序列;
D、将所述混淆后的指令序列进行封装,并打包生成混淆后的可执行应用;
其中,所述根据统计分析结果进行编码,生成Huffman编码树包括:
B1、从逆向分析后的指令序列中截取一个指令片段;
B2、对所述指令片段中相似的指令进行指令抽象得到抽象指令;
B3、分别对各个抽象指令及其参数的频数进行计数统计;
B4、根据计数统计结果生成前缀编码树和参数编码树;
其中,前缀编码树中的每一个叶子节点均为一种抽象指令;前缀编码树中的任意一个叶子节点均对应一个参数编码树。
2.根据权利要求1所述的方法,其特征在于,在所述步骤D之后,该方法还进一步包括:
E、对混淆后的可执行应用进行分析,获取相应的Huffman编码树;
F、生成一个加载器,并使用该加载器将所述混淆后的可执行应用加载到内存中,启动所述混淆后的可执行应用;
G、根据所得到的Huffman编码树对该混淆后的可执行应用进行解码,得到解码后的程序指令并执行。
3.根据权利要求2所述的方法,其特征在于,所述根据所得到的Huffman编码树对该混淆后的可执行应用进行解码包括:
根据所获取的混淆后应用的指令序列,从所述Huffman编码树中逐条查找所述指令序列中的各个指令及其参数所对应的编码并输出,形成一个编码序列;
根据所述Huffman编码树以及所述编码序列恢复出原始指令序列。
4.根据权利要求2所述的方法,其特征在于:
所述加载器利用Android Linux中的ptrace机制,动态查询运行可执行应用的Android设备的断点;如果发现所述可执行应用本身被调试,则立刻中断该可执行应用的运行。
5.一种可执行应用的混淆装置,其特征在于,该装置包括:逆向分析器、第一预处理器、混淆器和重编译器;
其中,所述逆向分析器,用于对需混淆的可执行代码进行逆向分析,得到逆向分析后的指令序列;将所述逆向分析后的指令序列发送给所述第一预处理器;
所述第一预处理器,用于对所述逆向分析后的指令序列进行指令抽象和统计分析,根据统计分析结果进行编码,生成Huffman编码树;将所述Huffman编码树发送给所述混淆器;
其中,所述根据统计分析结果进行编码,生成Huffman编码树包括:
B1、从逆向分析后的指令序列中截取一个指令片段;
B2、对所述指令片段中相似的指令进行指令抽象得到抽象指令;
B3、分别对各个抽象指令及其参数的频数进行计数统计;
B4、根据计数统计结果生成前缀编码树和参数编码树;
其中,前缀编码树中的每一个叶子节点均为一种抽象指令;前缀编码树中的任意一个叶子节点均对应一个参数编码树;
所述混淆器,用于将需混淆的可执行代码的二进制流根据所述Huffman编码树进行重新编码,生成混淆后的指令序列;将所述混淆后的指令序列发送给所述重编译器;
所述重编译器,用于将所述混淆后的指令序列进行封装,并打包生成混淆后的可执行应用。
6.根据权利要求5所述的装置,其特征在于,所述可执行应用的混淆装置还进一步包括:第二预处理器、加载器和解码器;
所述第二预处理器,用于对混淆后的可执行应用进行分析,获取相应的Huffman编码树;将所述Huffman编码树发送给所述解码器;
所述加载器,用于将所述混淆后的可执行应用加载到内存中,启动所述混淆后的可执行应用;
所述解码器,用于根据所得到的Huffman编码树对所述混淆后的可执行应用进行解码,得到解码后的程序指令并执行。
CN201510005064.5A 2015-01-06 2015-01-06 一种可执行应用的混淆方法和装置 Active CN104573427B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201510005064.5A CN104573427B (zh) 2015-01-06 2015-01-06 一种可执行应用的混淆方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201510005064.5A CN104573427B (zh) 2015-01-06 2015-01-06 一种可执行应用的混淆方法和装置

Publications (2)

Publication Number Publication Date
CN104573427A CN104573427A (zh) 2015-04-29
CN104573427B true CN104573427B (zh) 2017-09-08

Family

ID=53089470

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201510005064.5A Active CN104573427B (zh) 2015-01-06 2015-01-06 一种可执行应用的混淆方法和装置

Country Status (1)

Country Link
CN (1) CN104573427B (zh)

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CA2982867A1 (en) * 2015-04-07 2016-10-13 RunSafe Security, Inc. System and method of obfuscation through binary and memory diversity
CN106951744B (zh) * 2017-03-15 2019-12-13 北京深思数盾科技股份有限公司 可执行程序的保护方法及装置
CN107480479B (zh) * 2017-08-15 2020-08-07 北京奇虎科技有限公司 应用程序的加固方法及装置、计算设备、计算机存储介质
CN108171016B (zh) * 2017-11-30 2021-04-09 中国人民解放军国防科技大学 一种线性汇编级的可配置容错方法、计算机、计算机程序
CN108446536B (zh) * 2018-02-12 2021-08-13 北京梆梆安全科技有限公司 一种基于符号执行和单点逻辑的源代码加固方法及装置
CN109767516B (zh) * 2018-12-14 2021-06-11 汉海信息技术(上海)有限公司 日志设置和打印方法、设置和打印设备、及日志系统
CN110135133B (zh) * 2019-04-19 2021-08-17 佛山市微风科技有限公司 一种面向微控制器的压缩整合式源代码混淆方法及系统
CN110288673B (zh) * 2019-05-08 2023-01-31 深圳大学 将指令序列映射成图像的方法及系统
CN111680271A (zh) * 2020-06-02 2020-09-18 浙江大学 基于智能合约字节码特征的合约代码混淆平台和混淆方法

Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7263722B1 (en) * 1999-05-12 2007-08-28 Fraunhofer Crcg, Inc. Obfuscation of executable code
CN102081513A (zh) * 2011-01-24 2011-06-01 山东大学 Aes加密算法中列混淆过程指令优化方法及其指令集处理器
CN103150493A (zh) * 2013-02-28 2013-06-12 浙江中控技术股份有限公司 一种JavaScript代码的混淆方法和装置
CN103324481A (zh) * 2013-06-26 2013-09-25 网宿科技股份有限公司 通过汇编实现代码混淆的编译方法和系统
CN103324872A (zh) * 2013-07-12 2013-09-25 上海交通大学 基于指令混淆的Android应用程序保护方法及系统
CN103377326A (zh) * 2012-04-13 2013-10-30 腾讯科技(北京)有限公司 一种动态网页程序代码的混淆加密方法及装置
CN103544414A (zh) * 2013-10-25 2014-01-29 苏州通付盾信息技术有限公司 一种Android系统应用的深度代码混淆方法

Patent Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7263722B1 (en) * 1999-05-12 2007-08-28 Fraunhofer Crcg, Inc. Obfuscation of executable code
CN102081513A (zh) * 2011-01-24 2011-06-01 山东大学 Aes加密算法中列混淆过程指令优化方法及其指令集处理器
CN103377326A (zh) * 2012-04-13 2013-10-30 腾讯科技(北京)有限公司 一种动态网页程序代码的混淆加密方法及装置
CN103150493A (zh) * 2013-02-28 2013-06-12 浙江中控技术股份有限公司 一种JavaScript代码的混淆方法和装置
CN103324481A (zh) * 2013-06-26 2013-09-25 网宿科技股份有限公司 通过汇编实现代码混淆的编译方法和系统
CN103324872A (zh) * 2013-07-12 2013-09-25 上海交通大学 基于指令混淆的Android应用程序保护方法及系统
CN103544414A (zh) * 2013-10-25 2014-01-29 苏州通付盾信息技术有限公司 一种Android系统应用的深度代码混淆方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
Mimimorphism:A New Approach to Binary Code Obfuscation;Zhenyu Wu等;《Proceedings of the 17th ACM conference on Computer and communications security》;20101008;第536-546页 *

Also Published As

Publication number Publication date
CN104573427A (zh) 2015-04-29

Similar Documents

Publication Publication Date Title
CN104573427B (zh) 一种可执行应用的混淆方法和装置
CN104573426B (zh) 一种可执行应用的混淆方法和装置
CN104463002B (zh) 一种加固apk的方法和装置以及apk加固客户端和服务器
CN100594509C (zh) 软件保护方法
CN109992935A (zh) 一种源代码保护方法及装置
CN110929234B (zh) 一种基于代码虚拟化的Python程序加密保护系统与方法
US8984299B1 (en) Apparatus for code obfuscation and method thereof
CN102890758B (zh) 一种保护可执行文件的方法及系统
CN106682460B (zh) 一种基于两次变换的代码混淆方法
Brown et al. Is less really more? towards better metrics for measuring security improvements realized through software debloating
CN101986326A (zh) 保护软件安全的方法及装置
CA3150187C (en) Method and apparatus for protecting web script codes
CN107391973A (zh) 一种函数保护方法及装置
Kuang et al. Exploiting dynamic scheduling for VM-based code obfuscation
CN110147653A (zh) 应用程序安全加固方法及装置
CN117390603A (zh) 基于前端代码加密的访问方法、装置、电子设备及介质
Xue et al. Exploiting code diversity to enhance code virtualization protection
CN107122662A (zh) 一种基于Proguard软件的移动互联网App代码混淆测评方法
Kim et al. Zero-sum defender: Fast and space-efficient defense against return-oriented programming attacks
CN114090965B (zh) java代码混淆方法、系统、计算机设备及存储介质
CN115756480A (zh) 一种安卓应用加固方法、系统及设备
CN114968206A (zh) 一种编程语言代码动态混淆方法及系统
Wang et al. An efficient control-flow based obfuscator for micropython bytecode
Kuang et al. Exploit dynamic data flows to protect software against semantic attacks
CN106127044A (zh) 一种函数恶意程度的检测方法和装置

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant
CB03 Change of inventor or designer information

Inventor after: Xu Guoai

Inventor after: Li Chengze

Inventor after: Zhang Miao

Inventor after: Zhang Chengpeng

Inventor after: Dong Feng

Inventor after: Hu Yangyu

Inventor after: Xu Guosheng

Inventor after: Wang Chenyu

Inventor before: Li Chengze

Inventor before: Zhang Miao

Inventor before: Zhang Chengpeng

Inventor before: Dong Feng

Inventor before: Hu Yangyu

CB03 Change of inventor or designer information