防逆向技术简史:从代码混淆到虚拟机保护技术

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

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

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

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

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


ProGuard混淆后DEX文件截图

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

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

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

1. DEX文件整体加密

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

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

2. DEX函数抽取加密

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


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

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

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

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

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

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

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

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

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

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

写在最后:

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

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

本文转自d1net(转载)

时间: 2024-10-04 17:38:23

防逆向技术简史:从代码混淆到虚拟机保护技术的相关文章

编程实现小型虚拟机保护并逆向分析及其保护

本文讲的是编程实现小型虚拟机保护并逆向分析及其保护, 1.引言 虚拟机保护技术已经出现了10多年,目前已有较多.较为成熟的商业化虚拟机保护产品,如VMProtect.Themida等.这些产品实现的虚拟机过于复杂,而本文仅仅是逆向分析和编程实现小型虚拟机保护,这种小型虚拟机仅用于说明虚拟机保护这种技术,可以用于开发CrackMe,但与真正的虚拟机保护还有非常远的路要走. 2017年看雪CTF大赛正在火热征题中,防守组的各位参赛者随手写一个适用于自己CrackMe的虚拟机,相信可以如虎添翼. Gi

Android代码混淆技术总结(一)

Android代码混淆技术总结(一)       一.前言 最近一直在学习Android加固方面的知识,看了不少论文.技术博客以及一些github上的源代码,下面总结一下混淆方面的技术,也算是给想学习加固的同学做一些科普,在文中讲到的论文.资料以及源码,我都会给出相应的链接,供大家进一步去深入学习.后面我会弄成一个系列的文章,如有一些混淆技术没讲到,还希望大家指点,当做是交流学习. 二.Android混淆技术介绍 2.1 控制流平坦化 2.1.1 概念和思路 控制流平坦化,就是在不改变源代码的功

Android高级混淆和代码保护技术

本文讲的是Android高级混淆和代码保护技术,这是一篇关于 Android 代码保护的文章,旨在介绍代码混淆.防止逆向工程的各种高级技巧.大家都很忙,我也赶着回去继续开发我的新应用,因此话不多说,越干(gan, 一声)越好. 开始之前,值得一说的是,本文超过五千字,完全由我开发的「纯纯写作」书写而成,纯纯写作主打安全.写作体验和永不丢失内容,于是本着珍爱生命,我用纯纯写作来写这篇文章. 本文有两部分内容,一部分讲混淆,一部分介绍一些混淆之下的安全手段.基准原则都是:在保证不麻烦到自身 以及 能

【直播】APP全量混淆和瘦身技术揭秘

[直播]APP全量混淆和瘦身技术揭秘 近些年来移动APP数量呈现爆炸式的增长,黑产也从原来的PC端转移到了移动端,通过逆向手段造成数据泄漏.源码被盗.APP被山寨.破解后注入病毒或广告现象让用户苦不堪言.  为了解决安卓APP容易被逆向的问题,除了对产品进行加固处理,代码混淆技术是对抗逆向攻击最有效的方式之一.本直播会分享阿里聚安全带来的APP全量混淆技术.此外越来越多的新特性正在啃蚀着大型APP的用户体验,APP瘦身减肥也成了亟待解决的问题,如何能在使用安全功能同时瘦身,也将是本期主题所带来的

&#106avascript代码混淆综合解决方案-&#106avascript在线混淆器

解决|在线 文章来源:javascriptOnlineObfuscator">http://www.BizStruct.cn/JavascriptOnlineObfuscator Javascript 代码混淆的目的 Javascript 是一种解释执行的脚本语言,主要应用于 Web 领域的客户端的浏览器中:由于 Javascript 解释执行的特性,代码必须明文下载到客户端,并且可以很容易的进行调试,使得 Javascript 代码的保护非常困难: 不同的人对 Javascript 代码

Javascript代码混淆综合解决方案

javascript|解决 Javascript 代码混淆的目的 Javascript 是一种解释执行的脚本语言,主要应用于 Web 领域的客户端的浏览器中:由于 Javascript 解释执行的特性,代码必须明文下载到客户端,并且可以很容易的进行调试,使得 Javascript 代码的保护非常困难: 不同的人对 Javascript 代码的保护有不同的看法:有的人辛苦努力的代码,却可以被竞争对手轻易获得,他们就非常希望能有保护 Javascript 代码的方案,但现有的方案可能无法满足他们的要

Android应用开发之代码混淆_Android

混淆器(ProGuard) 混淆器通过删除从未用过的代码和使用晦涩名字重命名类.字段和方法,对代码进行压缩,优化和混淆.结果是一个比較小的.apk文件,该文件比較难进行逆向project.因此,当你的应用程序对安全敏感(要求高),比如当你授权应用程序的时候,混淆器是一种重要的保护手段.    混淆器被集成在android 构建系统中,所以你不必手动调用它.同一时候混淆器仅在公布模式下进行构建应用程序的时候才会执行起来,所以在调试模式下构建程序时,你不必处理混淆代码.让混淆器执行起来是可选择的,可

Javascript代码混淆综合解决方案-Javascript在线混淆器_javascript技巧

 文章来源:javascriptOnlineObfuscator">http://www.BizStruct.cn/JavascriptOnlineObfuscator Javascript 代码混淆的目的 Javascript 是一种解释执行的脚本语言,主要应用于 Web 领域的客户端的浏览器中:由于 Javascript 解释执行的特性,代码必须明文下载到客户端,并且可以很容易的进行调试,使得 Javascript 代码的保护非常困难: 不同的人对 Javascript 代码的保护有不

读懂Android中的代码混淆

本文为本人的一些实践总结,介绍一些混淆的知识和注意事项.希望可以帮助大家更好的学习和使用代码混淆. 什么是混淆 关于混淆维基百科上该词条的解释为 代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为. 代码混淆影响到的元素有 类名 变量名 方法名 包名 其他元素 混淆的目的 混淆的目的是为了加大反编译的成本,但是并不能彻底防止反编译. 如何开启混淆 通常我们需要找到项目路径下app目录下的build.gradle文件 找