开发软件的人都知道这个世界上没有破解不了的软件,只有不值得破解的软件。换而言之,只有软件的破解成本超过Hacker收益,软件资产才是相对安全的。Android平台以其免费和开源的特性占据了移动应用领域半壁江山,但也因其应用很容易被逆向破解获取源码,导致它成为Hacker最喜欢***的一个“靶子”。 

防逆向技术简史:从代码混淆到虚拟机保护技术_第1张图片

那么如何才能保护自己开发APP不被逆向破解呢?在道高一尺魔高一丈的网络安全***对抗中,防逆向保护技术也在不停更新演进,笔者在这里梳理了几个关键时期的防逆向保护技术,让大家对APP防护有一个更好理解。

启蒙阶段——防逆向保护始于代码混淆技术

这个时期最大特点是,从未能登上大雅之堂的代码混淆技术,摇身一变成为了防逆向保护唯一有效的技术。这要从1995年JAVA语言横空出世说起,它让人们在享受跨平台便利运行的同时,由于其天生易反编译特性,也让传统针对机器码的安全保护一夜之间变得毫无用处。

从此,那个曾经被唾弃的代码混淆技术开始逐渐被人所重视。从Android 2.3开始,Google在SDK中加入了一款叫ProGuard代码混淆工具,通过它可混淆JAVA代码。

防逆向技术简史:从代码混淆到虚拟机保护技术_第2张图片

ProGuard混淆后DEX文件截图

从上图就可以看到,代码混淆之后左侧的类名大多都变成了a、b等自定义字母,虽然机器执行起来的逻辑是一样的,但增加了***人为分析的难度和时间成本。从某种程度上来说,代码混淆技术很好的保护JAVA源代码,但这种方式也只是简单的改变类名或者变量名,***只要找到DEX文件,反编译也就是时间问题了,就看时间成本是否超过***收益。

发展阶段——DEX加密技术成为应用防护中流砥柱

随着Android反编译技术越来越纯熟,即便代码混淆技术做到native层,也是治标不治本。为了解决代码混淆技术存在弊端,越来越多的人采用DEX整体隐藏和DEX函数抽取加密来保护自己代码安全,例如梆梆安全等厂商早期加固产品用的就是这个技术。

1. DEX文件整体加密

对DEX文件进行整体加密,与壳APK进行合并得到新的DEX文件,然后替换壳程序中的DEX文件即可得到新的APK。新APK运行时将加密后DEX 文件在内存中解密,并让 Dalvik虚拟机动态加载执行。

防逆向技术简史:从代码混淆到虚拟机保护技术_第3张图片

DEX文件整体加密能够对抗静态分析,但也存在一定缺陷。该技术对DEX文件进行整体加密、解密操作,运行时在内存中存在连续完整的代码。通过修改Dalvik虚拟机就有可能通过内存Dump的方式获得解密后的代码。虽然开发者可以采取一些 patch 的方法来增加破解难度,例如类加载结束后,抹掉或者混淆内存中 DEX 文件的头部或尾部信息,但这些方法也无法从根本上解决内存 Dump 的问题。

2. DEX函数抽取加密

为解决DEX文件整体加密可以被内存 Dump这个弱点,DEX函数抽取加密技术对代码中每个方法抽取进行单独加密。JAVA 虚拟机在第一次执行某个方法前,才开始加载这个方法的代码。利用这个机制将解密操作延迟到某个方法在执行之前才对该方法进行解密,并且解密后代码在内存中是不连续存放。例如通过抽取Dalvik虚拟机运行一个DEX必不可缺少DEXCode中的部分,然后对字节码指令添加nop,这种方式大大增加代码安全性。

防逆向技术简史:从代码混淆到虚拟机保护技术_第4张图片

加密前后DEX 文件中的代码对比

这种加固技术的主要优点在于:

  • 加密粒度变小,加密粒度从DEX 文件级别变为方法级别;

  • 按需解密,解密操作延迟到某个方法在确实要执行之前才触发,如果方法不被执行,则不被解密;

  • 内存不连续,避免了内存 Dump的问题,极大提高安全性。

巅峰阶段——VMP加固成为防逆向保护“终极大招”

DEX函数抽取加密解决了内存被Dump问题,但是本质上这也是一种代码隐藏技术,最终代码还是通过Dalvik或者ART 虚拟机进行执行。因此,破解者可以构建一个自己修改过的虚拟机来脱壳。这就需要寻求更加强大、安全的防逆向技术来保证 APK 的安全。虚拟机软件保护技术(VMP)成为了当下最前沿移动应用安全加固技术。

VMP首先会对被保护的目标程序核心代码进行“编译”,将由编译器生成的本机代码(Native code)转换成效果等价的byte-code,然后将控制权交虚拟机,由虚拟机来执行控制。VMP最关键技术是需要自定义一套虚拟机指令和与之对应解释器,然后将标准指令转换成自己指令,由自定义解释器解释执行指令。

这样即使破解者拿到自定义的字节码也毫无意义,除非能够逆向破解自定义的虚拟机解释引擎。除此之外,VMP 还可以构建多个不同虚拟化解释引擎,不同的JAVA方法采用不同的虚拟化执行引擎,这就进一步提高了应用的安全性。

虽然现在市场上有相当一部分厂商都发布了针对移动应用VMP保护方案,但其实有很多厂商采用都是代码混淆或者代码隐藏技术。笔者认为拥有一套高质量的自定义指令集和解释器是判断VMP技术真伪唯一标准。而了解,目前在国内安全厂商中只有梆梆安全等公司在VMP技术上发展相对成熟。

写在最后:

任何安全技术变迁都是一部历史,移动应用安全发展也是如此。从某种程度上来看,Android应用防逆向技术演化史基本等于移动应用安全进化史。例如国内首个提出“应用加固”概念的梆梆安全,其加固技术也是从早期代码混淆技术演化到当前最先进虚拟机保护技术。

安全的攻与防是一个永恒话题,也是一个动态螺旋式发展过程,开发者需要不断提高自己安全意识和安全技能,才能更好应对各种层出不穷安全问题。