一文了解安卓APP逆向分析与保护机制

“知物由学”是网易云易盾打造的一个品牌栏目,词语出自汉·王充《论衡·实知》。人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道。“知物由学”希望通过一篇篇技术干货、趋势解读、人物思考和沉淀给你带来收获的同时,也希望打开你的眼界,成就不一样的你。

以下为文章正文:

想知道Android App常见的保护方法及其对应的逆向分析方法吗?

网易云易盾资深安全工程师 钟亚平

3月17日,安卓巴士全球开发者论坛在重庆举办,网易资深安全工程师钟亚平出席交流活动,并做了《安卓APP逆向与保护》的演讲。在分享中,他介绍了 Android App常见保护方法及其对应的逆向分析方法,以及分析了常见的加固方案原理与对抗方法。

安卓APP安全包含很多内容,本次分享了混淆代码、整体Dex加固、拆分 Dex 加固、虚拟机加固等方面。事实上,这些内容也是国内近几年Android App安全保护的一种主要趋势。

一、混淆代码

Java代码是非常容易反编译的,作为一种跨平台的、解释型语言,Java 源代码被编译成中间“字节码”存储于class文件中。由于跨平台的需要,这些字节码带有许多的语义信息,很容易被反编译成Java源代码。为了很好地保护Java源代码,开发者往往会对编译好的class文件进行混淆处理。

混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义。ProGuard就是一个混淆代码的开源项目,能够对字节码进行混淆、缩减体积、优化等处理。

Proguard处理流程图如下所示,包含压缩、优化、混淆、预检四个主要环节:

压缩(Shrink):检测并移除代码中无用的类、字段、方法和特性(Attribute);
优化(Optimize):对字节码进行优化,移除无用的指令。优化代码,非入口节点类会加上private/static/final,没有用到的参数会被删除,一些方法可能会变成内联代码;
混淆(Obfuscate):使用a、b、c、d这样简短而无意义的名称,对类、字段和方法进行重命名;
预检(Preveirfy):在Java平台上对处理后的代码进行预检,确保加载的class文件是可执行的。

在分享中,钟亚平展示了利用Proguard,对Dex2jar进行反编译处理后的Apk效果示例:

Proguard处理后

Proguard混淆器不仅能够保护代码,而且能够精简编译后的程序大小,减少内存占用。

混淆代码逆向分析

如果想要反编译混淆代码,钟亚平分享了一个国外的工具DEGUADR,它能够通过统计的方式来解混淆。虽然这个工具的正确率达不到100%,但是能在一定程度上帮助反编译代码。

使用DEGUADR解混淆的示例:

com.xxxxx.common.util.CryptoUtil网站也提供了一种反编译服务,如下所示:

java.lang.String a(byte[]) -> encodeToString

java.lang.String a(byte[],boolean,java.lang.String) -> a

byte[] a(byte[],byte[]) -> encrypt

byte[] b(byte[]) -> getKey

byte[] b(byte[],byte[]) -> decrypt

byte[] d(java.lang.String) -> getKey

java.lang.String a(byte,char[]) -> a

java.lang.String a(java.io.File) -> getHash

java.lang.String a(java.lang.String) -> c

java.lang.String b(java.lang.String) -> encode

二、整体Dex加固

为了加强Android保护强度,随着安全技术的发展,又出现了新型的“加固技术”。DEX加固是对DEX文件进行加壳防护,防止被静态反编译工具破解而泄露源码,最刚开始出现的是整体加固技术方案。

整体加固技术的原理如上所示,包括替换application/classes.dex、解密/动态加载原classes.dex、调用原application相关方法、将原application对象/名称设置到系统内部相关变量四大环节。其中最为关键的一步就是解密/动态加载原classes.dex,通过加密编译好的最终dex源码文件,然后在一个新项目中用新项目的application启动来解密原项目代码并加载到内存中,再把当前进程替换为解密后的代码,能够很好地隐藏源码并防止直接性的反编译。

整体Dex加固逆向分析

整体Dex加固逆向分析有两种常用的方法。其一是在内存中暴力搜索 dex\n035,再 dump。以下是在32位系统中的效果示例:

另一种方法就是通过HookdvmDexFileOpenPartial(void* addr, int len, DvmDex**)。

三、拆分Dex加固

随着业务规模发展到一定程度,不断地加入新功能、添加新的类库,代码在急剧膨胀的同时,相应的apk包的大小也急剧增加,那么简单的整体加固方案就不能很好地满足安全需求,在整体加固方案之外又出现了拆分加固的技术方案。

但是如上所示,dex文件在加固时,针对中间缺失的一部分数据会以解密后的数据来替换,有的时候这种拆分替换也会导致数据不准确。那么到底应该拆分什么样的数据呢?就需要了解一下dex文件的数据结构。

Dex文件结构极为复杂,以下图示选取了其中较为重要的内容。事实上,dex文件是一个以class为核心组装起来的文件,其中最重要的是classdata和classcode两部分,有其特定的接口和指令数据,选取这两部分来拆分的话,即使拆分出来也不会泄露class数据和字节码数据,反编译出来也不完整,安全性较高。

拆分Dex加固逆向分析

对于dex拆分加固的逆向分析,如下所示,可以用classdata替换从而组装成新的dex文件,虽然和原来的dex文件不会完全一致,但也在一定程度上复原了被拆分数据的样子。

但要注意的是,这种方法仅适用于被拆分出去的数据变形一次性完成,也就是说,在有其他保护思路的情况下尽量避免使用,而且即使有需要也尽量选在用到这个类的时候才去恢复。

此外还有一个更底层一些的工具dexhunter,这个工具较为前卫,但同时也有一些局限性,譬如部分指令数据会被优化,形成的代码界面不是很美观等等。

四、虚拟机加固

虚拟机加固也属于dex拆分加固的一种,它是对字节做了一些变化处理。如下所示,这是一个正常安卓系统中的代码,在其中进行了虚拟机加固操作:

以add-int v0, v1, v2、sub-int v0, v1, v2、mul-int v0, v1, v2这三条指令进行替换,然后进行加固编译,这样子操作后,即使把替换后的数据恢复了,也不会以add-int v0, v1, v2、sub-int v0, v1, v2、mul-int v0, v1, v2这三条指令进行替换,然后进行加固编译,这样子操作后,即使把替换后的数据恢复了,也不会变形成为之前的字节码,安全系数较高。

虚拟机加固逆向分析—HOOK JNI 接口

这种方式下的逆向分析,一方面可以通过HOOK JNI 接口来实现,它有两种实现方式。

其一是类成员/静态变量操作相关接口,比如:

GetStaticDoubleFieldSetStaticDoubleField GetDoubleField SetDoubleField …
(byte, object, int,long…)

其二是反射调用类方法,比如:

CallVoidMethodACallBooleanMethodA CallShortMethodA CallObjectMethodA …
CallStaticVoidMethodACallStaticBooleanMethodA CallStaticShortMethodA CallStaticObjectMethodA …
(byte, int, long,double …)
CallObjectMethodA(JNIEnv* env, jobject object, jmethoID method, …)

通过HOOKJNI 接口实现虚拟机加固逆向分析

通过HOOK JNI 接口不用逆向底层,就可以了解APP大致的调用流程。但是对于复杂的调用过程,或者虚拟化方法数量较多的情况,这种逆向分析手段看起来会比较混乱;对于不需要返射到Java层执行的指令,如算术、逻辑运算等,则无法监控到。

虚拟机加固逆向分析—分析指令操作码映射

另一方面,也可以通过分析指令操作码映射来逆向分析。在同一加固版本,或者映射关系相同的情况下,可以采取以下所示的方法:

但在实际情况中,每次加固时的映射关系都是随机变化的,如下所示,这种情况下就无法直接建立映射关系。

不依赖于操作码的映射关系只与虚拟机结构有关,所以需要根据偏移关系建立映射关系,从而进行逆向分析。

以上就是此次《安卓APP逆向与保护》主题的全部分享内容。

安卓APP逆向保护作为开发工作中的重要内容,一直是网易云易盾致力于提供的应用服务。“后续,我们将在SO加密保护方面进行更加深入的研究。”钟亚平最后说道。

*本文作者:网易云易盾,来自FreeBuf.COM

原文地址:https://www.cnblogs.com/163yun/p/8862077.html

时间: 2024-08-18 17:06:49

一文了解安卓APP逆向分析与保护机制的相关文章

Wish App逆向分析app_device_id字段生成算法

概述 本文对Wish App进行了反编译,对应用中app_device_id字段的生成算法进行了逆向分析. 使用到的工具有: 1. Apktool:获取资源文件和smali 反汇编代码 2. dex2jar:反编译apk,将其中的classes.dex转化成jar文件 3. jd-gui:打开jar文件,查看java源码 反编译环境:mac osx apk反编译获得java代码和smali反汇编代码 1. 从google play下载Wish.apk 2. 使用dex2jar把apk解包,将其中

Android无需权限显示悬浮窗, 兼谈逆向分析app

最近UC浏览器中文版出了一个快速搜索的功能, 在使用其他app的时候, 如果复制了一些内容, 屏幕顶部会弹一个窗口, 提示一些操作, 点击后跳转到UC, 显示这个悬浮窗不需要申请android.permission.SYSTEM_ALERT_WINDOW权限. 如下图, 截图是在使用Chrome时截的, 但是屏幕顶部却有UC的view浮在屏幕上. 我使用的是小米, 我并没有给UC授悬浮窗权限, 所以我看到这个悬浮窗时是很震惊的. 截图 悬浮窗原理 做过悬浮窗功能的人都知道, 要想显示悬浮窗, 要

app逆向入门分析——APP登陆请求参数

环境配置: PyhtonJavadex2jar(将apk反编译成java源码)jd_gui(源码查看)jadx已root的手机或者安卓模拟器fiddler 分析: 首先我们用fiddler抓包工具对app的登陆进行抓包,这个app抓包需要开启全局代理,不然会抓不到数据. 如果还不会使用全局代理抓包的朋友,可以看下前面一篇文章,里面有详细的抓包教程. 抓包的数据如下:               <ignore_js_op> 发送验证码请求参数 我们可以看到有个 token 的参数,有经验的朋友

Android逆向分析(2) APK的打包与安装

http://blog.zhaiyifan.cn/2016/02/13/android-reverse-2/ 2/18日增加对aidl和java编译的描述. 前言 上一次我们反编译了手Q,并遇到了Apktool反编译直接crash的问题,虽然笔者很想在这次解决这个问题,但在解决途中,发现该保护依赖于很多知识,所以本次先插入一下,正所谓知其然知其所以然,授之鱼不如授之以渔,只有知道一些基本原理,才能让我们以后能自行解决更多问题. 那么,你知道么?从我们在Android Studio中,点击run,

安卓APP动态调试-IDA实用攻略

0x00 前言 随着智能手机的普及,移动APP已经贯穿到人们生活的各个领域.越来越多的人甚至已经对这些APP应用产生了依赖,包括手机QQ.游戏.导航地图.微博.微信.手机支付等等,尤其2015年春节期间各大厂商推出的抢红包活动,一时让移动支付应用变得异常火热. 然后移动安全问题接憧而至,主要分为移动断网络安全和客户端应用安全.目前移动APP软件保护方面还处于初级阶段,许多厂商对APP安全认识不够深入,产品未经过加密处理,使得逆向分析者能够通过逆向分析.动态调试等技术来破解APP,这样APP原本需

c++反汇编与逆向分析 小结

第一章  熟悉工作环境和相关工具1.1 熟悉OllyDBG  操作技巧1.2 反汇编静态分析工具 IDA(最专业的逆向工具)    快捷键    功能     Enter     跟进函数实现     Esc       返回跟进处    A         解释光标处的地址为一个字符串的首地址     B         十六进制数与二进制数转换    C         解释光标处的地址为一条指令     D         解释光标处的地址为数据,没按一次将会转换这个地址的数据长度   

安卓App安全检查平台、爱加密App安全加密!

2014年6月初,爱加密高调推出免费自动化App安全检测平台,这是国内首家自动化App安全检测平台,也是爱加密推出的一个重磅产品.作为国内首家免费自动化App安全检测平台,在目前整个互联网行业,包括移动互联网行业还没有这样的服务平台出现,行业前景相当乐观.www.ijiami.cn 只需一键,专业简单,让风险漏洞无处遁形 爱加密漏洞分析平台的推出旨在打造一个服务于移动互联网开发者的安全服务平台,同时也给整个移动互联网安全领域带来一份保障.目前移动应用开发者越来越多,他们不知道自己的应用是否安全,

逆向分析智能窗帘频射协议

近来我热衷于对家庭自动化设备的破解,然后将它们添加到我的Homekit集成包之中.这事情要从几个月前说起,当时我爸订购了大批量的RAEX 433MHz射频电动窗帘,以替代老式的手动式窗帘. 注意:你可以在Spotlight网店搜索Motion Motorised Roller Blind找到该窗帘. 我对这个电动窗帘非常满意,有了它我就不用跑上跑下的去打开/关闭窗户,可是为了控制它们,你需要购买RAEX的遥控器.RAEX有许多不同类型的遥控器产品,其中我选择购买了以下两种遥控器: R 型遥控器

Android动态逆向分析工具ZjDroid--脱壳神器

项目地址:https://github.com/BaiduSecurityLabs/ZjDroid 前提条件: 1.Root手机一部 2.须要通过Xposed installer( http://dl.xposed.info/latest.apk)安装Xposed Framework; 一.ZjDroid工具介绍 ZjDroid是基于Xposed Framewrok的动态逆向分析模块,逆向分析者能够通过ZjDroid完毕下面工作:1.DEX文件的内存dump2.基于Dalvik关键指针的内存Ba