xposed,主页: http://repo.xposed.info/module/de.robv.android.xposed.installer
是个开源的框架,在 github 上有源码的,直接下载 apk 后安装激活就可以使用,很多地方有这方面的教程,针对不同的手机架构,有大牛做了针对性的修改。可以在论坛中进行搜索
通过替换 / system/bin/app_process 程序控制 zygote 进程,使得 app_process 在启动过程中会加载 XposedBridge.jar 这个 jar 包,从而完成对 Zygote 进程及其创建的 Dalvik 虚拟机的劫持。
Xposed 在开机的时候完成对所有的 Hook Function 的劫持,在原 Function 执行的前后加上自定义代码。
很多人将这个框架用在对 android 的私有化定制上面,其实在 android 安全测试方面这个框架提供了很大的便利,xposed 主要是对方法的 hook,在以往的重打包技术中,需要对 smali 代码的进行修改,修改起来比较麻烦。
利用 xposed 框架可以很容易的获取到 android 应用中的信息,比如加密私钥、salt 值等等,不需要饭编译获取密钥转换算法、不需要了解密钥保存机制,直接 hook 函数,获取输入输出就可以。
在 Android 系统中,应用程序进程都是由 Zygote 进程孵化出来的,而 Zygote 进程是由 Init 进程启动的。Zygote 进程在启动时会创建一个 Dalvik 虚拟机实例,每当它孵化一个新的应用程序进程时,都会将这个 Dalvik 虚拟机实例复制到新的应用程序进程里面去,从而使得每一个应用程序进程都有一个独立的 Dalvik 虚拟机实例。这也是 Xposed 选择替换 app_process 的原因。
Zygote 进程在启动的过程中,除了会创建一个 Dalvik 虚拟机实例之外,还会将 Java 运行时库加载到进程中来,以及注册一些 Android 核心类的 JNI 方法来前面创建的 Dalvik 虚拟机实例中去。注意,一个应用程序进程被 Zygote 进程孵化出来的时候,不仅会获得 Zygote 进程中的 Dalvik 虚拟机实例拷贝,还会与 Zygote 一起共享 Java 运行时库。这也就是可以将 XposedBridge 这个 jar 包加载到每一个 Android 应用程序中的原因。XposedBridge 有一个私有的 Native(JNI)方法 hookMethodNative,这个方法也在 app_process 中使用。这个函数提供一个方法对象利用 Java 的 Reflection 机制来对内置方法覆写。有能力的可以针对 xposed 的源码进行分析,不得不说,作者对于 android 的机制和 java 的了解已经相当深入了。
很简单的一个 android 登入代码:
很简单的就是判断下用户输入的用户名和密码是正确,这里做个简单的演示,将用户输入的用户名和密码信息 hook 出来不管正确与否
简单说下 xposed 模块的开发,首先需要的是导入 api,具体的可以参考: https://github.com/rovo89/XposedBridge/wiki/Using-the-Xposed-Framework-API
在 manifest 中定义
声明这个是 xposed 模块,名称为 hook test 并且使用 api 版本号是 82
下面创建运行时候的 hook 代码:
看代码中的注释,主要是三个方法的调用,handleLoadPackage,主要是获取到 android 包的相关信息,这里由于只是对 logintest 进行 hook, 做下简单的判断。
findAndHookMethod 是主要的 hook 入口,里面几个参数分别为包名,classloader,hook 的函数名,参数类型(这个比较容易出错,比如 list 类型写为 List.class), 回调函数
回调函数中比较重要的:beforeHookedMethod 和 afterHookedMethod,一个是在函数运行前劫持掉,一个是 hook 后放行,实例中对用户输入的字段进行劫持打印,后面将参数之改为正确登入用户名和密码,这样在 app 中输入任何字符都能登入成功
Frida 是一款基于 python + javascript 的 hook 框架,通杀 android\ios\linux\win\osx 等各平台,由于是基于脚本的交互,因此相比 xposed 和 substrace cydia 更加便捷,本文重点介绍 Frida 在 android 下面的使用。
Frida 的官网为: http://www.frida.re/
安装 Frida 非常简单,在 pc 端直接执行
- pip install frida
即可
在 Android 设备需要导入 frida 的服务端,需要 root 你的手机
设备上运行 frida-server:
电脑上运行 adb forward tcp 转发:
27042 端口用于与 frida-server 通信, 之后的每个端口对应每个注入的进程。
运行如下命令验证是否成功安装:
- $ frida-ps-R
正常情况应该输出进程列表如下:
hook 的主要模块是 js 编写的,利用 javascript 的 api 与 server 进行通信
下面结合一个真实例子进行简单的介绍,首先是测试代码:
对于上面的 js 代码,其实就是调用 app 中的某个函数,比如 sign 值生成函数,加密解密函数,不需要自己单独的去分析算法流程,分析 key 值在哪,直接调用 app 的相应函数,让 app 帮我们完成这些工作。
这里我们分析的 app 是友宝,这是一款饮料售货机,当时抓包看到提货的时候是只有个订单 id 的,猜想是不是遍历订单的 id,支付成功但是没有取货的订单会不会响应请求,自己掉货出来。
下面对友宝的订单进行分析过程
1. 抓取支付订单成功链接
分析:
sign 是校验值,主要是防止订单伪造的,orderid 是产生的支付订单 id,这个主要是防止伪造用
2. 反编译友宝 app
找到 morder/shipping 所在的包为:com/ub/main/d/e.class
其中 localStringBuffer 存储的就是 url 中的参数信息,该请求查找到的代码在 a()
生成签名的函数在 com/ub/main/d/e.class 中的 b 函数
最后加上 sign 值,发送请求
3. 可以反编译出他的 sign 计算方法,也可以直接调用 b 函数来产生 sign 值,后来发现 app 会自动取时间戳,我们就不需要给他 array 型的参数
直接调用 a 函数,把 orderId 给他,让他直接 return 一个值出来就好了,就有了上面的 js 代码
4. 自动化的批量处理
看代码
构造了一个类,后面直接 fuzz uid 就可以了,提取里面的 sign 值拼接到 post 数据中去。
可以产生的 post 请求和抓到的数据包的请求是完全一样的,但是并没有测试成功,分析原因有可能是订单 id 和用户的 id 有所绑定。
不过学习到了怎样通过 frida 对 app 进行分析。
如果遇到函数的参数类型是数组、map、ArrayList 类型的,首先目标 MyClass 类的 fun1 函数,声明如下:
解决方法:
用 Xposed 自身提供的 XposedHelpers 的 findClass 方法加载每一个类,然后再将得到的类传递给 hook 函数作参数!
具体实现可参考链接,大牛讲的很清楚。
https://xianzhi.aliyun.com/forum/read/611.html
http://www.freebuf.com/articles/terminal/56453.html
http://bbs.pediy.com/showthread.php?t=202147&page=2
来源: http://www.tuicool.com/articles/NbuEn23