- 对本书的赞誉
- 前言
- 基础篇
- 第 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 样本分析
23.3 分析解密之后的 dex 文件内容
拿到 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论