返回介绍

8.1 混淆机制

发布于 2024-10-10 22:32:16 字数 1947 浏览 0 评论 0 收藏 0

在应用中用混淆不仅是为了安全防护,也是为了减小应用安装包的大小,所以每个应用发版之前必须要添加混淆这项功能。现在混淆机制一般有两种:代码混淆和资源混淆。下面分别介绍。

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文