- 对本书的赞誉
- 前言
- 基础篇
- 第 1 章 Android 中锁屏密码加密算法分析
- 第 2 章 Android 中 NDK 开发
- 第 3 章 Android 中开发与逆向常用命令总结
- 第 4 章 so 文件格式解析
- 第 5 章 AndroidManifest.xml 文件格式解析
- 第 6 章 resource.arsc 文件格式解析
- 第 7 章 dex 文件格式解析
- 防护篇
- 第 8 章 Android 应用安全防护的基本策略
- 第 9 章 Android 中常用权限分析
- 第 10 章 Android 中的 run-as 命令
- 第 11 章 Android 中的 allowBackup 属性
- 第 12 章 Android 中的签名机制
- 第 13 章 Android 应用加固原理
- 第 14 章 Android 中的 so 加固原理
- 工具篇
- 第 15 章 Android 逆向分析基础
- 第 16 章 反编译神器 apktool 和 Jadx
- 第 17 章 Hook 神器 Xposed
- 第 18 章 脱壳神器 ZjDroid
- 第 19 章 Native 层 Hook 神器 Cydia Substrate
- 操作篇
- 第 20 章 静态方式逆向应用
- 第 21 章 动态调试 smali 源码
- 第 22 章 IDA 工具调试 so 源码
- 第 23 章 逆向加固应用
- 第 24 章 逆向应用经典案例分析
- 第 25 章 Android 中常见漏洞分析
- 第 26 章 文件加密病毒 Wannacry 样本分析
8.1 混淆机制
在应用中用混淆不仅是为了安全防护,也是为了减小应用安装包的大小,所以每个应用发版之前必须要添加混淆这项功能。现在混淆机制一般有两种:代码混淆和资源混淆。下面分别介绍。
8.1.1 代码混淆
在反编译 apk 之后,看到的代码类名、方法名以及代码格式看起来不像正常的 Android 项目代码,那么这时候就会增加阅读难度,增加破解难度,这就是经过混淆的代码,如图 8-1 所示。
图 8-1 代码混淆结构图
现在的破解查看 Java 层代码有以下两种方式:
·直接先解压 classes.dex 文件,使用 dex2jar 工具转化成 jar 文件,然后再用 jd-gui 工具进行查看类结构。
·使用 apktool 工具直接反编译 apk,得到 smali 源码,阅读 smali 源码。
不过代码混淆也不是很安全,在破解的过程中一般是找程序的入口,那么这些入口一般都是 Application 或者是 MainActivity 之处,因为这些 Android 中的组件类是不能进行混淆的,所以还是有入口可寻,能够找到入口代码,然后进行跟踪。
8.1.2 资源混淆
上面说到,对代码的混淆能够增加代码阅读难度。为了保护资源也是可以做混淆的,资源混淆原理这里就不多解释了,微信团队已经将这个功能开源,不了解的同学可以去 GitHub 查看: https://github.com/shwenzhang/AndResGuard 。
当然资源混淆还有一个很大的好处就是减小 apk 包的大小,这不是本节讨论的知识点,这里讨论的是混淆资源增加破解查找资源的难度,先来看一下混淆资源之后的结果如下所示:
这里可以看到,一个混淆资源的应用,反编译之后查看它的 string.xml 内容,发现它的 name 全是简单的混淆字母,那么如果通过 name 的值来查找对应的字符串内容获取消息,将是很难受的一件事,因为这时候如果全局搜索一个 name 值的话,比如这里的 name='a',那么得搜出多少个这样的 name,查找也很耗时间。
对于混淆资源也不是没有办法,因为一般在反编译之后的 Java 代码中,看到的获取资源值的时候,并不是资源的 name 值,而是资源对应的 int 类型的值,比如这样如下所示:
这里获取一个字符串的值,这些 int 类型的值,可以在反编译之后的 res/values/pulblic.xml 中可以找到:
比如这里的 2131230929 变成 16 进制就是 0x0x7f0800d1,在 public.xml 中查找,找到了 name='ev'的一项,然后再去 string.xml 中进行 name 查找:
还是找到了这个字符串的值,反编译之后的 public.xml 中记录了所有资源的 id 和整型对应值,混淆之后的代码中看到的都是资源 id 的整型值,那么这么一看混淆并没有什么用途。
从上面描述的可知,混淆对于破解并没有什么太大的阻碍,也只是一个障眼法,不过混淆有另外一个功能,就是减少 apk 包的大小,这也是每个应用都添加混淆的最主要原因。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论