随着移动互联网的快速发展,应用的安全问题不断涌现出来,于是越来越多的应用开发者将核心代码由java层转到native层,以对抗成熟的java逆向分析工具,然而如果native层的代码如果没有进行任何保护,还是比较容易被逆向分析工作者获取其运行逻辑,进而完成应用破解或者进行其他的操作。那么提高native代码的安全性有什么好办法吗?答案是肯定的,今天我们就来介绍一种有效对抗native层代码分析的方法——代码混淆技术。
那么,什么是代码混淆呢?代码混淆的学术定义如下:
代码混淆(code obfuscation)是指将计算机程序的代码,转换成一种功能上等价,所谓功能上的等价是指其在变换前后功能相同或相近。其解释如下:程序P经过混淆变换为P‘,若P没有结束或错误结束,那么P’也不能结束或错误结束;而且P‘程序的结果应与程序P具有相同的输出。否则P’不是P的有效的混淆。
目前对于混淆的分类,普遍是以Collberg 的理论为基础,分为布局混淆(layout obfuscation)、数据混淆(data obfuscation)、控制混淆(control obfuscation)和预防混淆(preventive obfuscation)这四种类型。
1.布局混淆
布局混淆是指删除或者混淆软件源代码或者中间代码中与执行无关的辅助文本信息,增加攻击者阅读和理解代码的难度。软件源代码中的注释文本、调试信息可以直接删除,用不到的方法和类等代码或数据结构也可以删除,这样即可以使攻击者难以理解代码的语义,也可以减小软件体积,提高软件装载和执行的效率。软件代码中的常量名、变量名、类名和方法名等标识符的命名规则和字面意义有利于攻击者对代码的理解,布局混淆通过混淆这些标识符增加攻击者对软件代码理解的难度。标识符混淆的方法有多种,例如哈希函数命名、标识符交换和重载归纳等。哈希函数命名是简单地将原来标识符的字符串替换成该字符串的哈希值,这样标识符的字符串就与软件代码不相关了;标识符交换是指先收集软件代码中所有的标识符字符串,然后再随机地分配给不同的标识符,该方法不易被攻击者察觉;重载归纳是指利用高级编程语言命名规则中的一些特点,例如在不同的命名空间中变量名可以相同,使软件中不同的标识符尽量使用相同的字符串,增加攻击者对软件源代码的理解难度。布局混淆是最简单的混淆方法,它不改变软件的代码和执行过程。
2.数据混淆
数据混淆是修改程序中的数据域,而对代码段不作处理。常用的数据混淆方式有合并变量、分割变量、数组重组、字符串加密等。
合并变量是将几个变量合并为一个数据,原来的每个变量占据其中一个区域,类似于一个大的数据结构。分割变量则是将一个变量分割为两个变量,对分割前后提供一种映射关系,将对一个变量的操作转化为对分割后两个变量的操作。
数组重组有数组的分割、合并、折叠和平滑等几种方式。分割是将一个数组分成2个或多个相同维度的数组;合并则相反;折叠是增加数组的维数;平滑则是相反。
在ELF文件中,全局变量和常量字符串存放在数据段中,反汇编工具可以轻易查找到字符串与代码之间的引用关系。在软件破解中,通过一些字符串提示可以很方便的找到代码关键语句,从而破解软件。字符串加密则可以对这些明显的字符串进行加密存储,在需要时再进行解密。
3.控制混淆
控制混淆也称流程混淆,它是改变程序的执行流程,从而打断逆向分析人员的跟踪思路,达到保护软件的目的。一般采用的技术有插入指令、伪装条件语句、断点等。伪装条件语句是当程序顺序执行从A到B,混淆后在A和B之间加入条件判断,使A执行完后输出TRUE或FALSE,但不论怎么输出,B一定会执行。
控制混淆采用比较多的还有模糊谓词、内嵌外联、打破顺序等方法。
模糊谓词是利用消息不对称的原理,在加入模糊谓词时其值对混淆者是已知的,而对反混淆者却很难推知。所以加入后将干扰反汇编者对值的分析。模糊谓词的使用一般是插入一些死的或不相关的代码(bogus code),或者是插入在循环或分支语句中,打断程序执行流程。
内嵌(in-line)是将一小段程序嵌入到被调用的每一个程序点,外联(out-line)是将没有任何逻辑联系的一段代码抽象成一段可被多次调用的程序。
打破顺序是指打破程序的局部相关性。由于程序员往往倾向于把相关代码放在一起,通过打破顺序改变程序空间结构,将加大破解者的思维跳跃。
4.预防混淆
预防混淆一般是针对专用的反编译器设计的,目的就是预防被这类反编译器反编译。他是利用特定的反编译器或反混淆器的弱点进行专门设计。预防混淆对于特定的反编译器非常有效,所以在使用时要综合利用各种反编译器的特点进行设计。
市面的安全服务供应商如腾讯御安全,所提供的保护方案提供了以上所述四种混淆分类的多维度的保护;布局混淆方面:提供了针对native代码层中的函数名进行了混淆删除调试信息等功能;数据混淆方面:提供了针对常量字符串加密及全局变量的混淆的功能;控制混淆方面:针对代码流程上,提供了扁平化,插入bogus 分支以及代码等价变换等功能;预防混淆方面:在混淆过程中加入了针对主流反编译器的预防混淆的代码,能够有效地抵抗其分析。此外还对应用开发者提供不同等级的保护力度及多种混淆方式的功能的选择,用户可以根据自己的需求定制不同的混淆功能保护。
安全保护方案除了提供代码混淆保护方面的技术,还提供代码虚拟化技术及反逆向、反调试等其他应用安全加固方案,综合使用多种代码保护方案可以有效地提高应用代码安全。
(腾讯御安全技术团队)
相关推荐
【腾讯御安全】浅谈安卓开发代码混淆技术 在当今快速发展的移动互联网时代,应用程序的安全性成为了开发者关注的焦点。由于Java层的逆向分析工具日益成熟,许多开发者选择将核心代码迁移到Native层,以增强应用的...
浅谈用于Java软件保护的代码混淆技术研究与实现.pdf
代码混淆是一种重要的软件保护技术,尤其在Java软件开发领域中,它被广泛应用于防止恶意逆向工程、保护知识产权以及确保代码安全。本文将深入探讨Java代码混淆技术的研究与实现,帮助开发者理解其原理、方法及实际...
浅谈游戏开发平台Unity3D的应用与发展前景 Unity3D 作为一款游戏开发平台,已经在游戏行业中崭露头角多年。随着游戏行业的快速发展,Unity3D 的应用前景也变得愈加广阔。在本文中,我们将浅谈 Unity3D 的优势和...
深入浅出Android「Android」是一个基于 Linux 核心(kernel) 的开放手机平台操作系统。与 Windows Mobile、Symbian 等手机操作系统处在同一级别。 对于设备制造商来说,「Android」是一个免费的平台。「Android」操作...
浅谈Android重打包技术 主讲人:沈明星 网易安全工程师沈明星解析Android重打包技术,从APK文件结构到文件转换,包括实战中会用到的工具和重打包技术的应用场景。 2013年1月12日由OWASP杭州区和“杭州谷歌开发者社区...
本书理论与实践相结合,内容详尽,配有丰富的示例程序,讲解深入浅出,可以使读者在较短的时间内理解Android系统框架及其应用的开发过程,掌握Android应用程序的设计方法。 本书提供所有程序的源代码和电子课件。...
### 浅谈Android移动开发程序员的职业发展之路 随着信息技术的快速发展与智能手机的普及,移动应用开发成为了一个备受关注的领域,而Android作为全球最大的移动操作系统之一,其开发人员的需求量也在逐年攀升。本文...
《Android开发案例驱动教程》 配套代码。 注: 由于第12,13,14章代码太大,无法上传到一个包中。 这三节代码会放到其他压缩包中。 作者:关东升,赵志荣 Java或C++程序员转变成为Android程序员 采用案例驱动模式...
这本书全面覆盖了Android平台的基础知识和高级技术,旨在帮助读者深入理解Android开发的核心概念,并通过丰富的实例代码提升实际操作能力。 首先,书中的基础知识部分会介绍Android系统架构,包括应用程序框架、...
这本书深入浅出地讲解了Android开发的基础知识,是入门和巩固技能的理想选择。在本文中,我们将详细探讨书中的关键知识点,帮助读者构建坚实的Android开发基础。 一、Android系统简介 Android是一种开源的操作系统...
浅谈网站开发技术的发展及前景.doc
浅谈公共行政管理的信息技术化-论文.zip
涂勇策在MDCC 2015中国移动开发者大会上发表的主题演讲“Android应用开发浅谈”,概述了Android开发历程、面临的主要问题及技术方案、新产品开发思路以及技术演进的方向。 首先,涂勇策介绍了自己的背景信息,他是...
浅谈Auto CAD二次开发技术.pdf
浅谈PHP开发技术课程的教学设计与实践.pdf
安卓系统生物识别技术浅谈
"原生APP开发公司浅谈原生开发、H5开发与混合开发的区别.pdf" 在移动应用开发领域中,开发模式的选择对应用的性能、用户体验和开发效率都有着至关重要的影响。原生开发、H5开发和混合开发是当前市场上三种主流的...
浅谈计算机网络安全管理技术.pdf