返回介绍

23.3 分析解密之后的 dex 文件内容

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

拿到 dump.dex 文件之后,使用 dex2jar 工具进行反编译,如下所示:

可惜的是,报错了,反编译失败,主要是因为有一个类导致的。开始我以为是 dump 出来的 dex 文件有问题,最后用 baksmali 工具得到 smali 文件是可以的,所以不是 dump 出来的问题,最后用 baksmali 工具将 dex 转化成 smali 源码:

得到的 smali 源码目录 classout 在 C 盘中,如图 23-14 所示。

图 23-14 反编译之后的 smali 源码

得到了指定的 smali 源码了。

那么下面就可以使用静态方式分析 smali。首先找到入口的 MainActivity 源码:

这里不解释了,肯定是找按钮的点击事件代码处,这里是一个 btn_listener 变量,看这个变量的定义:

是 MainActivity$1 内部类定义,查看这个类的 smali 源码,直接查看它的 onClick 方法:

这里可以看到,把 EditText 中的内容用 Intent 传递给 WebViewActivity 中,但是这里的 intent 数据的 key 是加密的。下面继续看 WebViewActivity 这个类:

直接查找 onCreate 方法即可,这里是初始化 WebView,然后进行一些设置。这里看到一个 @JavascriptInterface。

这个注解在使用 WebView 的时候都知道,它是用于 JavaScript 中能够访问而设置的,没有这个注解的方法 JavaScript 是访问不了的。

注意:这个注解是在 SDK 17 加上的,也就是 Android 4.2 版本中,那么在之前的版本中没有这个注解,任何 public 的方法都可以在 JavaScript 代码中访问,而 Java 对象继承关系会导致很多 public 的方法都可以在 JavaScript 中访问,其中一个重要的方法就是 getClass()。然后 JavaScript 可以通过反射来访问其他一些内容。那么这里就有这个问题了,比如下面的一段 JavaScript 代码:

这段 JavaScript 代码很危险,使用 getClass 方法得到这个对象(Java 中的每个对象都有这个方法的),用这个方法可以得到一个 Java 对象,然后就可以调用这个对象中的方法了。这个也算是 WebView 的一个漏洞。所以通过引入 @JavascriptInterface 注解,则在 JavaScript 中只能访问 @JavascriptInterface 注解的函数。这样就可以增强安全性。

回归到正题,上面分析了 smali 源码,看到了 WebView 的一些设置信息,可以继续往下面看:

这里看到了一些重要的方法,一个是 addJavascriptInterface,一个是 loadUrl 方法。知道 addjavaascriptInterface 方法一般的用法:

第一个参数是本地的 Java 对象,第二个参数是给 JavaScript 中使用的对象的名称。然后 JavaScript 得到这个对象的名称就可以调用本地的 Java 对象中的方法了。这里用如下代码:

将 JavaScript 中的名称进行混淆加密了,这也是为了防止恶意的网站来拦截后,然后调用本地的 Java 中的方法。

注意:这里又存在一个关于 WebView 的安全问题,就是 JavaScript 访问的对象的名称问题,比如现在程序中有一个 JavaScript 交互的类,类中有一个获取设备重要信息的方法,获取设备的 imei,如果程序没有做这样名称的混淆的话,破解者得到这个 JavaScript 名称和方法名,然后就伪造一个恶意 URL,来调用程序中的这个方法,比如这样一个例子:

然后再设置 JavaScript 名称:

就可以伪造一个恶意的 URL 页面来访问这个方法,比如这个恶意的页面代码如下:

运行程序如图 23-15 所示。

图 23-15 调用 JavaScript 方法

恶意页面就成功地调用了程序中的一个重要方法。可以看到,对 JavaScript 交互中的对象名称做混淆是必要的,特别是本地一些重要的方法。

分析完了 WebView 的一些初始化和设置代码,而且知道如果要被 JavaScript 访问的方法,必须要有 @JavascriptInterface 注解,因为在 Java 中注解也是一个类,所以去注解类的源码看看那个被 JavaScript 调用的方法:

这里看到有一个 showToast 方法,展示的内容为\u7965\u9f99\uff01,在线转化一下,如图 23-16 所示。

图 23-16 在线转化字符串

这里就是题目要求展示的内容。

到这里就分析完了 apk 的逻辑了,下面来整理一下:

1)在 MainActivity 中输入一个页面的 URL,跳转到 WebViewActivity 进行展示。

2)WebViewActivity 有 Java Script 交互,需要调用本地 Java 对象中的 showToast 方法展示消息。

问题:因为这里的 Java Script 对象名称进行了加密,所以这里自己编写一个网页,但是不知道这个 Java Script 对象名称,无法完成 showToast 方法的调用。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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