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

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

Info

Publication number
CN104573426B
CN104573426B CN201510005059.4A CN201510005059A CN104573426B CN 104573426 B CN104573426 B CN 104573426B CN 201510005059 A CN201510005059 A CN 201510005059A CN 104573426 B CN104573426 B CN 104573426B
Authority
CN
China
Prior art keywords
sequence
coding schedules
command sequence
lzw
lzw coding
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
Application number
CN201510005059.4A
Other languages
English (en)
Other versions
CN104573426A (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 CN201510005059.4A priority Critical patent/CN104573426B/zh
Publication of CN104573426A publication Critical patent/CN104573426A/zh
Application granted granted Critical
Publication of CN104573426B publication Critical patent/CN104573426B/zh
Expired - Fee Related 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、对所述逆向分析后的指令序列进行指令抽象和统计分析,根据统计分析结果进行编码,生成LZW编码表;C、将需混淆的可执行代码的二进制流根据所述LZW编码表进行重新编码,生成混淆后的指令序列;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、对所述逆向分析后的指令序列进行指令抽象和统计分析,根据统计分析结果进行编码,生成LZW编码表;
C、将需混淆的可执行代码的二进制流根据所述LZW编码表进行重新编码,生成混淆后的指令序列;
D、将所述混淆后的指令序列进行封装,并打包生成混淆后的可执行应用。
较佳的,在所述步骤D之后,该方法还进一步包括:
E、对混淆后的可执行应用进行分析,通过寻址找到相应的LZW编码表;
F、生成一个加载器,并使用该加载器将所述混淆后的可执行应用加载到内存中,启动所述混淆后的可执行应用;
G、根据所得到的LZW编码表对该混淆后的可执行应用进行解码,得到解码后的程序指令并执行。
较佳的,所述根据统计分析结果进行编码,生成LZW编码表包括:
B1、从逆向分析后的指令序列中截取一个指令片段,并从该指令片段中提取组成整个指令序列的基本指令;
B2、设置初始的序列计数和初始的LZW编码表;
B3、从所述指令序列的第一个指令开始,将所述指令序列的各个序列逐个加入到预设的序列组合中;当序列组合满足预设的添加条件时,将当前的序列组合添加到所述LZW编码表中,输出当前的序列计数的值,并将当前的序列计数的值加1。
较佳的,所述添加条件为:
其中,atomm表示指令片段中的第m个指令,TableLZW表示LZW编码表。
较佳的,所述根据所得到的LZW编码表对该混淆后的可执行应用进行解码包括:
根据所获取的混淆后应用的指令序列,从所述LZW编码表中逐条查找到满足预设输出条件的最大匹配序列,并输出查找到的最大匹配序列在所述LZW编码表中所以对应的序号;
当所述混淆后应用的指令序列中的所有指令都查找到最大匹配序列之后,将输出的所有序号按照输出时间的先后次序依次排列成一个序号队列;
根据所述LZW编码表以及所述序号队列恢复出原始指令序列。
较佳的,所述预设输出条件为:
当前查找到的最大匹配序列存在于所述LZW编码表中,且当前查找到的最大匹配序列与上一个查找到的最大匹配序列的最后一位所组成的序列也存在于所述LZW编码表中。
较佳的,所述加载器利用Android Linux中的ptrace机制,动态查询运行可执行应用的Android设备的断点;如果发现所述可执行应用本身被调试,则立刻中断该可执行应用的运行。
本发明还提供了一种可执行应用的混淆装置,该装置包括:逆向分析器、第一预处理器、混淆器和重编译器;
其中,所述逆向分析器,用于对需混淆的可执行代码进行逆向分析,得到逆向分析后的指令序列;将所述逆向分析后的指令序列发送给所述第一预处理器;
所述第一预处理器,用于对所述逆向分析后的指令序列进行指令抽象和统计分析,根据统计分析结果进行编码,生成LZW编码表;将所述LZW编码表发送给所述混淆器;
所述混淆器,用于将需混淆的可执行代码的二进制流根据所述LZW编码表进行重新编码,生成混淆后的指令序列;将所述混淆后的指令序列发送给所述重编译器;
所述重编译器,用于将所述混淆后的指令序列进行封装,并打包生成混淆后的可执行应用。
较佳的,所述可执行应用的混淆装置还进一步包括:第二预处理器、加载器和解码器;
所述第二预处理器,用于对混淆后的可执行应用进行分析,通过寻址找到相应的LZW编码表;将所述LZW编码表发送给所述解码器;
所述加载器,用于将所述混淆后的可执行应用加载到内存中,启动所述混淆后的可执行应用;
所述解码器,用于根据所得到的LZW编码表对所述混淆后的可执行应用进行解码,得到解码后的程序指令并执行。
由上述技术方案可见,在本发明的技术方案中,由于先根据需混淆的可执行代码生成了一个LZW编码表,然后再根据该LZW编码表对需混淆的可执行代码的二进制流进行重新编码,生成混淆后的指令序列,实际上是利用LZW编码表来实现可执行指令的重新排列,因此可以在尽可能小地改变统计特性的前提下,对原始指令序列进行重新排列编码,大大降低了自动化工具对混淆方法的识别能力;而且,由于原始的指令序列被重新排列,因此也极大的增加了攻击者的阅读代码和破解应用软件的难度。另外,由于本发明所提供的方法中结合了传统混淆、动态混淆、加固等多种技术手段,在混淆过程中极大的改变了原程序的控制流、数据流等,因此使得攻击者难以完成对原代码的阅读。另外,由于本发明中使用了自定义的加载器,该加载器可以利用Android Linux中的ptrace机制,动态查询Android设备的断点,一旦发现程序本身被调试,可以立刻中断程序本身,因此可以有效地阻止攻击者对目标程序的动态调试。此外,由于本发明中所提出的方法中虽然也具有一些保护特征,但是由于编解码均使用原程序指令进行替换,因此对随机性和熵等指标造成的影响相对较小,攻击者通过反编译也很难发现程序被进行了重新编码,因此具有较高的隐蔽性,可应用于各种Android系统和平台。
附图说明
图1为本发明实施例中的可执行应用的混淆方法的流程示意图。
图2为本发明实施例中生成LZW编码表的原理示意图。
图3为本发明实施例中混淆器的工作原理示意图。
图4为本发明实施例中解码器的工作原理示意图。
图5是本发明实施例中的可执行应用的混淆装置的结构示意图。
具体实施方式
为使本发明的技术方案及优点更加清楚明白,以下结合附图及具体实施例,对本发明作进一步详细的说明。
图1为本发明实施例中的可执行应用的混淆方法的流程示意图。如图1所示,本发明实施例中的可执行应用的混淆方法包括:
步骤11,对需混淆的可执行代码进行逆向分析,得到逆向分析后的指令序列。
在本发明的技术方案中,可以使用逆向分析器对需混淆的可执行代码进行逆向分析,得到逆向分析后的指令序列。
具体来说,较佳的,在本发明的具体实施例中,可以使用逆向分析器对需混淆的可执行代码进行自动化逆向分析,将可执行代码还原到Dalvik/Arm指令层,从而得到经过逆向分析后的指令序列。
步骤12,对所述逆向分析后的指令序列进行指令抽象和统计分析,根据统计分析结果进行编码,生成LZW编码表。
由于目前Android系统中共有256条Dalvik指令,其中无参数的简单指令占了相当大的比例,这些简单指令所组成的序列构成了复杂的代码。因此,在一段函数指令片段中,一般会出现很多次重复指令序列,因此可以利用LZW算法实现对整个函数指令片段的编码。
因此,在本发明的较佳实施例中,可以使用第一预处理器对所述逆向分析后的指令序列进行指令抽象和统计分析,并根据统计分析结果进行编码,生成LZW编码表。
在本发明的技术方案中,为了在混淆后的指令序列中尽可能的减少重复字符的出现,因此需要在对指令序列进行混淆之前生成一个LZW编码表。
在生成LZW编码时,首先可以从逆向分析后的指令序列中截取一个指令片段,然后从该指令片段中提取组成整个片段的基本指令atom,从该指令片段的第一个指令atom1开始,依次将未记录在LZW编码表中的指令序列添加到LZW编码表中并记录该指令(序列)的序号,在编码过程中使用指令序号代替指令本身。
例如,在本发明的一个较佳实施例中,所述根据统计分析结果进行编码,生成LZW编码表包括:
步骤a1、从逆向分析后的指令序列中截取一个指令片段,并从该指令片段中提取组成整个指令序列的基本指令。
步骤a2、设置初始的序列计数和初始的LZW编码表。
在本发明的技术方案中,所述初始的序列计数可以是0,所述初始的LZW编码表可以包括该指令序列的基本指令。
步骤a3、从所述指令序列的第一个指令开始,将所述指令序列的各个序列逐个加入到预设的序列组合中;当序列组合满足预设的添加条件时,将当前的序列组合添加到所述LZW编码表中,输出当前的序列计数的值,并将当前的序列计数的值加1。
在本发明的技术方案中,可以根据实际应用的需求,预先设置上述的添加条件。例如,较佳的,在本发明的具体实施例中,所述添加条件可以为:
也就是说,如果在序列组合<atom1,atom2,...,atomm>中加入指令序列中的第m+1个指令atomm+1时,使得当前的序列组合<atom1,atom2,...,atomm,atomm+1>满足上述的添加条件,则可将该当前的序列组合<atom1,atom2,...,atomm,atomm+1>添加到LZW编码表中;同时,还将输出当前的序列计数Countm(即将<atom1,atom2,...,atomm>添加到LZW编码表中后的序列计数)的值,即并将Countm的值加1后作为当前的序列计数Countm+1
图2为本发明实施例中生成LZW编码表的原理示意图。例如,如图2所示,图2中的左边为一个函数中出现的指令序列(也可以称为指令片段),其中,A、B、C为该指令序列的基本指令,通过上述的方法可以根据图2中的指令序列生成图2中右上所示的LZW编码表。而且,从图2中可以看出,图2中的指令序列根据该LZW编码表可以被编码为“122473”,从而极大地缩减了程序的指令长度。
步骤13,将需混淆的可执行代码的二进制流根据所述LZW编码表进行重新编码,生成混淆后的指令序列。
在本发明的技术方案中,可以使用混淆器将需混淆的可执行代码的二进制流根据所述LZW编码表进行重新编码,生成混淆后的指令序列。
在进行文本压缩中,编码过程会将若干个字符序列用若干数字序列来表示,从而实现对目标字符进行压缩;而在解压缩过程中,则可根据所生成的编码表,将编码后的数字序列进行解码恢复,从而得到原始的字符序列。
而在本发明的技术方案中,本步骤的工作流程类似于“解压缩”的过程,即根据所述LZW编码表,对将需混淆的可执行代码的二进制流进行重新编码,从而生成混淆后的指令序列。
图3为本发明实施例中混淆器的工作原理示意图。例如,如图3所示,在得到LZW编码表后,可以根据该LZW编码表对需混淆的可执行代码的二进制流(即指令序列所对应的二进制数据流)进行编码,从而得到一个输出序列(例如,图3中所示的压缩输出“122473”),然后对该输出序列进行取逆(例如,图3中的所示的混淆输出“374221”)并反转,最终得到混淆后的结果序列(例如,图3中所示的右图)。
由图3可以看出,左边的原始指令序列经过混淆后,所生成的混淆后的指令序列与原始指令序列相比,产生了明显的变化。
步骤14,将所述混淆后的指令序列进行封装,并打包生成混淆后的可执行应用。
在本发明的技术方案中,可以使用重编译器将所述混淆后的指令序列进行封装,并打包生成混淆后的可执行应用。
通过上述的步骤11~14,即可对原始的可执行应用(即可执行代码)进行混淆,从而生成混淆后的可执行应用。
在生成上述混淆后的可执行应用之后,即可将该混淆后的可执行应用投入实际应用中。
在本发明的技术方案中,在得到该混淆后的可执行应用之后,还可以进一步对上述混淆后的可执行应用进行解码和加载运行。
例如,可以对该混淆后的可执行应用进行分析从而找到相应的LZW编码表,然后将上述混淆后的可执行应用通过自定义的加载器加载到内存中,并启动上述混淆后的可执行应用;再根据所得到的LZW编码表对该混淆后的可执行应用进行解码,得到解码后的程序指令。
因此,较佳的,在本发明的具体实施例中,所述步骤14之后还可进一步包括:
步骤15,对混淆后的可执行应用进行分析,通过寻址找到相应的LZW编码表。
较佳的,在本发明的较佳实施例中,可以使用第二预处理器对混淆后的可执行应用进行分析,通过寻址找到相应的LZW编码表。
步骤16,生成一个加载器,并使用该加载器将所述混淆后的可执行应用加载到内存中,启动所述混淆后的可执行应用。
步骤17,根据所得到的LZW编码表对该混淆后的可执行应用进行解码,得到解码后的程序指令并执行。
较佳的,在本发明的较佳实施例中,可以使用解码器根据所得到的LZW编码表对该混淆后的可执行应用进行解码,得到解码后的程序指令并执行。
在解码过程中,首先需要获取LZW编码表;在获取LZW编码表之后,即可根据所获取的混淆后应用的指令序列,从所述LZW编码表中逐条查找到满足预设输出条件的最大匹配序列,并输出查找到的最大匹配序列在所述LZW编码表中所以对应的序号;当所述混淆后应用的指令序列中的所有指令都查找到最大匹配序列之后,将输出的所有序号按照输出时间的先后次序依次排列成一个序号队列(相当于恢复出反转前的指令序列);然后,即可按照LZW解码过程根据所述LZW编码表以及上述序号队列恢复出原始指令序列。
较佳的,在本发明的具体实施例中,所述预设输出条件可以是:
当前查找到的最大匹配序列存在于所述LZW编码表中,且当前查找到的最大匹配序列与上一个查找到的最大匹配序列的最后一位所组成的序列也存在于所述LZW编码表中。
具体来说,图4为本发明实施例中解码器的工作原理示意图,如图4所示,较佳的,在本发明的具体实施例中,图4所示的左边为所述混淆后的指令序列(即函数指令片段),在对此函数指令片段进行解码时,将根据所获取的混淆后应用的指令序列,从LZW编码表中逐条查找最大匹配序列,逐步恢复出混淆前的指令序列。具体可以包括:
步骤b1、根据混淆后应用的指令序列中的当前指令在所述LZW编码表中查找最大匹配序列,查找结果为最大匹配序列指令C存在于所述LZW编码表中,且上一个查找到的最大匹配序列为空(因为指令C是混淆后应用的指令序列中的第一个指令),因此输出所述LZW编码表中指令C所对应的序号3;
步骤b2、根据混淆后应用的指令序列中的当前指令在所述LZW编码表中查找最大匹配序列,查找结果为最大匹配序列指令ABA存在于所述LZW编码表中,且该指令ABA与上一个查找到的最大匹配序列C的最后一位C组成的指令ABAC也存在于所述LZW编码表中,因此输出所述LZW编码表中指令ABA所对应的序号7;
步骤b3、根据混淆后应用的指令序列中的当前指令在所述LZW编码表中查找最大匹配序列,查找结果为最大匹配序列指令AB存在于所述LZW编码表中,且该指令AB与上一个查找到的最大匹配序列ABA的最后一位A组成的指令ABA也存在于所述LZW编码表中,因此输出所述LZW编码表中指令AB所对应的序号4;
步骤b4、根据混淆后应用的指令序列中的当前指令在所述LZW编码表中查找最大匹配序列,查找结果为最大匹配序列指令BB存在于所述LZW编码表中,但该指令BB与上一个查找到的最大匹配序列AB的最后一位B组成的指令BBB不存在于所述LZW编码表中,因此重新进行查找;
步骤b5、根据混淆后应用的指令序列中的当前指令在所述LZW编码表中查找最大匹配序列,查找结果为最大匹配序列指令B存在于所述LZW编码表中,且该指令B与上一个查找到的最大匹配序列AB的最后一位B组成的指令BB也存在于所述LZW编码表中,因此输出所述LZW编码表中指令B所对应的序号2;
步骤b6、根据混淆后应用的指令序列中的当前指令在所述LZW编码表中查找最大匹配序列,查找结果为最大匹配序列指令BA存在于所述LZW编码表中,但该指令BA与上一个查找到的最大匹配序列B的最后一位B组成的指令BAB不存在于所述LZW编码表中,因此重新进行查找;
步骤b7、根据混淆后应用的指令序列中的当前指令在所述LZW编码表中查找最大匹配序列,查找结果为最大匹配序列指令B存在于所述LZW编码表中,且该指令B与上一个查找到的最大匹配序列B的最后一位B组成的指令BB也存在于所述LZW编码表中,因此输出所述LZW编码表中指令B所对应的序号2;
步骤b8、根据混淆后应用的指令序列中的当前指令在所述LZW编码表中查找最大匹配序列,查找结果为最大匹配序列指令A存在于所述LZW编码表中,且该指令A与上一个查找到的最大匹配序列B的最后一位B组成的指令AB也存在于所述LZW编码表中,因此输出所述LZW编码表中指令A所对应的序号1。
通过上述步骤b1~b8,从而可得到输出“122473”,如图2所示,根据该输出,即可根据所述LZW编码表获知该输出所对应的原始指令序列。
由于上述的解码过程中实质上是一种查表过程而非加解密过程,因此一方面可以尽可能的提高解码速度,减少对解码效率的影响,另一方面也可以尽可能的降低对随机性、熵等统计指标的影响,提高了混淆技术本身的隐蔽性。
由于在使用解码器对可执行应用的程序指令进行恢复时,如果不使用自定义的加载器,将难以实现Android应用程序对解码器的支持。因此,在本发明的技术方案中,将在步骤16中,在所述混淆后的可执行应用的程序入口生成一个加载器,该加载器将自动对LZW编码表进行寻址,并且在程序运行过程中调用解码器,将解码器恢复出来的二进制字节码加载到Android设备内存中,执行解码后指令,实现原应用软件的加载和使用。
此外,较佳的,在本发明的较佳实施例中,所述加载器将利用Android Linux中的ptrace机制,动态查询运行可执行应用的Android设备的断点,如果发现该可执行应用本身被调试,则立刻中断该可执行应用本身的运行,从而可以防止攻击者对该可执行应用进行动态调试。
根据本发明提供的上述可执行应用的混淆方法,本发明还提供了相应的可执行应用的混淆装置,具体请参见图5。
图5是本发明实施例中的可执行应用的混淆装置的结构示意图。如图5所示,本发明实施例中的可执行应用的混淆装置包括:逆向分析器、第一预处理器、混淆器和重编译器;
其中,所述逆向分析器,用于对需混淆的可执行代码进行逆向分析,得到逆向分析后的指令序列;将所述逆向分析后的指令序列发送给所述第一预处理器;
所述第一预处理器,用于对所述逆向分析后的指令序列进行指令抽象和统计分析,根据统计分析结果进行编码,生成LZW编码表;将所述LZW编码表发送给所述混淆器;
所述混淆器,用于将需混淆的可执行代码的二进制流根据所述LZW编码表进行重新编码,生成混淆后的指令序列;将所述混淆后的指令序列发送给所述重编译器;
所述重编译器,用于将所述混淆后的指令序列进行封装,并打包生成混淆后的可执行应用。
较佳的,在本发明的具体实施例中,所述可执行应用的混淆装置还进一步包括:第二预处理器、加载器和解码器;
所述第二预处理器,用于对混淆后的可执行应用进行分析,通过寻址找到相应的LZW编码表;将所述LZW编码表发送给所述解码器;
所述加载器,用于将所述混淆后的可执行应用加载到内存中,启动所述混淆后的可执行应用;
所述解码器,用于根据所得到的LZW编码表对所述混淆后的可执行应用进行解码,得到解码后的程序指令并执行。
综上所述,在本发明的技术方案中,由于先根据需混淆的可执行代码生成了一个LZW编码表,然后再根据该LZW编码表对需混淆的可执行代码的二进制流进行重新编码,生成混淆后的指令序列,实际上是利用LZW编码表来实现可执行指令的重新排列,因此可以在尽可能小地改变统计特性的前提下,对原始指令序列进行重新排列编码,大大降低了自动化工具对混淆方法的识别能力;而且,由于原始的指令序列被重新排列,因此也极大的增加了攻击者的阅读代码和破解应用软件的难度。另外,由于本发明所提供的方法中结合了传统混淆、动态混淆、加固等多种技术手段,在混淆过程中极大的改变了原程序的控制流、数据流等,因此使得攻击者难以完成对原代码的阅读。另外,由于本发明中使用了自定义的加载器,该加载器可以利用Android Linux中的ptrace机制,动态查询Android设备的断点,一旦发现程序本身被调试,可以立刻中断程序本身,因此可以有效地阻止攻击者对目标程序的动态调试。此外,由于本发明中所提出的方法中虽然也具有一些保护特征,但是由于编解码均使用原程序指令进行替换,因此对随机性和熵等指标造成的影响相对较小,攻击者通过反编译也很难发现程序被进行了重新编码,因此具有较高的隐蔽性。另外,本发明中所提供的方法和装置,均可应用于各种Android系统和平台。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。

Claims (8)

1.一种可执行应用的混淆方法,其特征在于,该方法包括:
A、对需混淆的可执行代码进行逆向分析,得到逆向分析后的指令序列;
B、对所述逆向分析后的指令序列进行指令抽象和统计分析,根据统计分析结果进行编码,生成LZW编码表;
C、将需混淆的可执行代码的二进制流根据所述LZW编码表进行重新编码,生成混淆后的指令序列;
D、将所述混淆后的指令序列进行封装,并打包生成混淆后的可执行应用;
其中,所述根据统计分析结果进行编码,生成LZW编码表包括:
B1、从逆向分析后的指令序列中截取一个指令片段,并从该指令片段中提取组成整个指令序列的基本指令;
B2、设置初始的序列计数和初始的LZW编码表;
B3、从所述指令序列的第一个指令开始,将所述指令序列的各个序列逐个加入到预设的序列组合中;当序列组合满足预设的添加条件时,将当前的序列组合添加到所述LZW编码表中,输出当前的序列计数的值,并将当前的序列计数的值加1。
2.根据权利要求1所述的方法,其特征在于,在所述步骤D之后,该方法还进一步包括:
E、对混淆后的可执行应用进行分析,通过寻址找到相应的LZW编码表;
F、生成一个加载器,并使用该加载器将所述混淆后的可执行应用加载到内存中,启动所述混淆后的可执行应用;
G、根据所得到的LZW编码表对该混淆后的可执行应用进行解码,得到解码后的程序指令并执行。
3.根据权利要求1所述的方法,其特征在于,所述添加条件为:
< atom 1 , atom 2 , ... , atom m > &Element; Table L Z W < atom 1 , atom 2 , ... , atom m , atom m + 1 > &NotElement; Table L Z W
其中,atomm表示指令片段中的第m个指令,TableLZW表示LZW编码表。
4.根据权利要求2所述的方法,其特征在于,所述根据所得到的LZW编码表对该混淆后的可执行应用进行解码包括:
根据所获取的混淆后应用的指令序列,从所述LZW编码表中逐条查找到满足预设输出条件的最大匹配序列,并输出查找到的最大匹配序列在所述LZW编码表中所以对应的序号;
当所述混淆后应用的指令序列中的所有指令都查找到最大匹配序列之后,将输出的所有序号按照输出时间的先后次序依次排列成一个序号队列;
根据所述LZW编码表以及所述序号队列恢复出原始指令序列。
5.根据权利要求4所述的方法,其特征在于,所述预设输出条件为:
当前查找到的最大匹配序列存在于所述LZW编码表中,且当前查找到的最大匹配序列与上一个查找到的最大匹配序列的最后一位所组成的序列也存在于所述LZW编码表中。
6.根据权利要求2所述的方法,其特征在于:
所述加载器利用Android Linux中的ptrace机制,动态查询运行可执行应用的Android设备的断点;如果发现所述可执行应用本身被调试,则立刻中断该可执行应用的运行。
7.一种可执行应用的混淆装置,其特征在于,该装置包括:逆向分析器、第一预处理器、混淆器和重编译器;
其中,所述逆向分析器,用于对需混淆的可执行代码进行逆向分析,得到逆向分析后的指令序列;将所述逆向分析后的指令序列发送给所述第一预处理器;
所述第一预处理器,用于对所述逆向分析后的指令序列进行指令抽象和统计分析,根据统计分析结果进行编码,生成LZW编码表;将所述LZW编码表发送给所述混淆器;其中,所述根据统计分析结果进行编码,生成LZW编码表包括:
B1、从逆向分析后的指令序列中截取一个指令片段,并从该指令片段中提取组成整个指令序列的基本指令;
B2、设置初始的序列计数和初始的LZW编码表;
B3、从所述指令序列的第一个指令开始,将所述指令序列的各个序列逐个加入到预设的序列组合中;当序列组合满足预设的添加条件时,将当前的序列组合添加到所述LZW编码表中,输出当前的序列计数的值,并将当前的序列计数的值加1;
所述混淆器,用于将需混淆的可执行代码的二进制流根据所述LZW编码表进行重新编码,生成混淆后的指令序列;将所述混淆后的指令序列发送给所述重编译器;
所述重编译器,用于将所述混淆后的指令序列进行封装,并打包生成混淆后的可执行应用。
8.根据权利要求7所述的装置,其特征在于,所述可执行应用的混淆装置还进一步包括:第二预处理器、加载器和解码器;
所述第二预处理器,用于对混淆后的可执行应用进行分析,通过寻址找到相应的LZW编码表;将所述LZW编码表发送给所述解码器;
所述加载器,用于将所述混淆后的可执行应用加载到内存中,启动所述混淆后的可执行应用;
所述解码器,用于根据所得到的LZW编码表对所述混淆后的可执行应用进行解码,得到解码后的程序指令并执行。
CN201510005059.4A 2015-01-06 2015-01-06 一种可执行应用的混淆方法和装置 Expired - Fee Related CN104573426B (zh)

Priority Applications (1)

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

Applications Claiming Priority (1)

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

Publications (2)

Publication Number Publication Date
CN104573426A CN104573426A (zh) 2015-04-29
CN104573426B true CN104573426B (zh) 2017-06-06

Family

ID=53089469

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201510005059.4A Expired - Fee Related CN104573426B (zh) 2015-01-06 2015-01-06 一种可执行应用的混淆方法和装置

Country Status (1)

Country Link
CN (1) CN104573426B (zh)

Families Citing this family (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106650428A (zh) * 2015-11-03 2017-05-10 阿里巴巴集团控股有限公司 用于优化应用代码的方法与设备
CN106682460B (zh) * 2016-11-25 2019-05-31 西北大学 一种基于两次变换的代码混淆方法
CN106951744B (zh) * 2017-03-15 2019-12-13 北京深思数盾科技股份有限公司 可执行程序的保护方法及装置
CN107122662A (zh) * 2017-04-12 2017-09-01 金陵科技学院 一种基于Proguard软件的移动互联网App代码混淆测评方法
CN107480479B (zh) * 2017-08-15 2020-08-07 北京奇虎科技有限公司 应用程序的加固方法及装置、计算设备、计算机存储介质
CN109492354A (zh) * 2018-10-23 2019-03-19 海南新软软件有限公司 一种混淆代码的方法、装置及系统
CN115543341B (zh) * 2022-11-27 2023-02-03 北京麟卓信息科技有限公司 一种基于内联函数分析的内核函数动态定位方法

Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7062088B1 (en) * 2001-08-28 2006-06-13 Adobe Systems Incorporated Variable lossy compression
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系统应用的深度代码混淆方法

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8159374B2 (en) * 2009-11-30 2012-04-17 Red Hat, Inc. Unicode-compatible dictionary compression

Patent Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7062088B1 (en) * 2001-08-28 2006-06-13 Adobe Systems Incorporated Variable lossy compression
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系统应用的深度代码混淆方法

Also Published As

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

Similar Documents

Publication Publication Date Title
CN104573426B (zh) 一种可执行应用的混淆方法和装置
CN104573427B (zh) 一种可执行应用的混淆方法和装置
CN104463002B (zh) 一种加固apk的方法和装置以及apk加固客户端和服务器
Homescu et al. Profile-guided automated software diversity
CN109992935A (zh) 一种源代码保护方法及装置
CN101156157A (zh) 软件保护方法
CN102890758B (zh) 一种保护可执行文件的方法及系统
CN106682460B (zh) 一种基于两次变换的代码混淆方法
WO2013142983A1 (en) Securing accessible systems using cross-linking
CN106845168A (zh) 一种面向远程计算的控制流隐藏方法
CN110929234A (zh) 一种基于代码虚拟化的Python程序加密保护系统与方法
Rinne et al. Performance analysis of contemporary light-weight block ciphers on 8-bit microcontrollers
Coffman et al. ROP gadget prevalence and survival under compiler-based binary diversification schemes
CN110119601A (zh) 基于应用程序安装包的程序加固方法及装置
CN110147653A (zh) 应用程序安全加固方法及装置
Zhang et al. SeBROP: blind ROP attacks without returns
CN107122662A (zh) 一种基于Proguard软件的移动互联网App代码混淆测评方法
CN110119600A (zh) 基于应用程序安装包的程序加固方法及装置
Zhang et al. Cape: compiler-aided program transformation for htm-based cache side-channel defense
CN106845169B (zh) 一种Jar包加固方法及系统
CN110147655A (zh) 应用程序的安全防护系统及方法
CN110032838A (zh) 一种脚本文件加固方法、装置及设备
Wang et al. An efficient control-flow based obfuscator for micropython bytecode
Lin Novel techniques in recovering, embedding, and enforcing policies for control-flow integrity
Kuang et al. Exploit dynamic data flows to protect software against semantic attacks

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
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: 20170606