浅谈安卓开发代码混淆技术

前言

随着移动互联网的快速发展,应用的安全问题不断涌现出来,因而愈来愈多的应用开发者将核心代码由java层转到native层,以对抗成熟的java逆向分析工具,然而若是native层的代码若是没有进行任何保护,仍是比较容易被逆向分析工做者获取其运行逻辑,进而完成应用破解或者进行其余的操做。那么提升native代码的安全性有什么好办法吗?答案是确定的,今天咱们就来介绍一种有效对抗native层代码分析的方法——代码混淆技术。
那么,什么是代码混淆呢?代码混淆的学术定义以下:代码混淆(code obfuscation)是指将计算机程序的代码,转换成一种功能上等价,所谓功能上的等价是指其在变换先后功能相同或相近。其解释以下:程序P通过混淆变换为P‘,若P没有结束或错误结束,那么P’也不能结束或错误结束;并且P‘程序的结果应与程序P具备相同的输出。不然P’不是P的有效的混淆。java

    

  目前对于混淆的分类,广泛是以Collberg 的理论为基础,分为布局混淆(layout obfuscation)、数据混淆(data obfuscation)、控制混淆(control obfuscation)和预防混淆(preventive obfuscation)这四种类型。程序员

布局混淆

  布局混淆是指删除或者混淆软件源代码或者中间代码中与执行无关的辅助文本信息,增长攻击者阅读和理解代码的难度。软件源代码中的注释文本、调试信息能够直接删除,用不到的方法和类等代码或数据结构也能够删除,这样便可以使攻击者难以理解代码的语义,也能够减少软件体积,提升软件装载和执行的效率。软件代码中的常量名、变量名、类名和方法名等标识符的命名规则和字面意义有利于攻击者对代码的理解,布局混淆经过混淆这些标识符增长攻击者对软件代码理解的难度。标识符混淆的方法有多种,例如哈希函数命名、标识符交换和重载概括等。哈希函数命名是简单地将原来标识符的字符串替换成该字符串的哈希值,这样标识符的字符串就与软件代码不相关了;标识符交换是指先收集软件代码中全部的标识符字符串,而后再随机地分配给不一样的标识符,该方法不易被攻击者察觉;重载概括是指利用高级编程语言命名规则中的一些特色,例如在不一样的命名空间中变量名能够相同,使软件中不一样的标识符尽可能使用相同的字符串,增长攻击者对软件源代码的理解难度。布局混淆是最简单的混淆方法,它不改变软件的代码和执行过程。编程

数据混淆

  数据混淆是修改程序中的数据域,而对代码段不做处理。经常使用的数据混淆方式有合并变量、分割变量、数组重组、字符串加密等。合并变量是将几个变量合并为一个数据,原来的每一个变量占据其中一个区域,相似于一个大的数据结构。分割变量则是将一个变量分割为两个变量,对分割先后提供一种映射关系,将对一个变量的操做转化为对分割后两个变量的操做。
  数组重组有数组的分割、合并、折叠和平滑等几种方式。分割是将一个数组分红2个或多个相同维度的数组;合并则相反;折叠是增长数组的维数;平滑则是相反。在ELF文件中,全局变量和常量字符串存放在数据段中,反汇编工具能够轻易查找到字符串与代码之间的引用关系。在软件破解中,经过一些字符串提示能够很方便的找到代码关键语句,从而破解软件。字符串加密则能够对这些明显的字符串进行加密存储,在须要时再进行解密。数组

控制混淆

  控制混淆也称流程混淆,它是改变程序的执行流程,从而打断逆向分析人员的跟踪思路,达到保护软件的目的。通常采用的技术有插入指令、假装条件语句、断点等。假装条件语句是当程序顺序执行从A到B,混淆后在A和B之间加入条件判断,使A执行完后输出TRUE或FALSE,但不论怎么输出,B必定会执行。控制混淆采用比较多的还有模糊谓词、内嵌外联、打破顺序等方法。
  模糊谓词是利用消息不对称的原理,在加入模糊谓词时其值对混淆者是已知的,而对反混淆者却很难推知。因此加入后将干扰反汇编者对值的分析。模糊谓词的使用通常是插入一些死的或不相关的代码(bogus code),或者是插入在循环或分支语句中,打断程序执行流程。
  内嵌(in-line)是将一小段程序嵌入到被调用的每个程序点,外联(out-line)是将没有任何逻辑联系的一段代码抽象成一段可被屡次调用的程序。
打破顺序是指打破程序的局部相关性。因为程序员每每倾向于把相关代码放在一块儿,经过打破顺序改变程序空间结构,将加大破解者的思惟跳跃。安全

预防混淆

  预防混淆通常是针对专用的反编译器设计的,目的就是预防被这类反编译器反编译。他是利用特定的反编译器或反混淆器的弱点进行专门设计。预防混淆对于特定的反编译器很是有效,因此在使用时要综合利用各类反编译器的特色进行设计。数据结构

总结

  腾讯御安全保护方案提供了以上所述四种混淆分类的多维度的保护;布局混淆方面:提供了针对native代码层中的函数名进行了混淆删除调试信息等功能;数据混淆方面:提供了针对常量字符串加密及全局变量的混淆的功能;控制混淆方面:针对代码流程上,提供了扁平化,插入bogus 分支以及代码等价变换等功能;预防混淆方面:在混淆过程当中加入了针对主流反编译器的预防混淆的代码,可以有效地抵抗其分析。此外还对应用开发者提供不一样等级的保护力度及多种混淆方式的功能的选择,用户能够根据本身的需求定制不一样的混淆功能保护。安全保护方案除了提供代码混淆保护方面的技术,还提供代码虚拟化技术及反逆向、反调试等其余应用安全加固方案,综合使用多种代码保护方案能够有效地提升应用代码安全。编程语言

更多内容可浏览:腾讯御安全技术博客(http://blog.yaq.qq.com/blog函数

相关文章
相关标签/搜索