Xposed 框架
Xposed 框架是一款可以在不修改APK的情况下影响程序运行(修改系统)的框架服务,基于它可以制作出许多功能强大的模块,且在功能不冲突的情况下同时运作。
基本原理
Zygote 进程是 Android 的核心,所有的应用程序进程以及系统服务进程都是由Zygote进程 fork 出来的。Xposed Framework 深入到了 Android 核心机制中,通过改造 Zygote 来实现一些很牛逼的功能。Zygote 的启动配置在/init.rc 脚本中,由系统启动的时候开启此进程,对应的执行文件是/system/bin/app_process,这个文件完成类库加载及一些初始化函数调用的工作。
当系统中安装了 Xposed Framework 之后,会拿自己实现的 app_process 覆盖掉 Android 原生提供的文件,使得app_process在启动过程中会加载XposedBridge.jar这个jar包,从而完成对Zygote进程及其创建的Dalvik虚拟机的劫持。
更详细的框架介绍和插件开发过程可直接参看官方教程或者已有的一些中文教程
本文的主要来由是思寒在我另外一篇文章中的一句留言:
把xposed单独再发文章吧. 这是个杀手级别的框架. 是测试利器. 只是很多人并不懂其中的奥妙
既然是杀手级的东西,那肯定有不少独到的招式和技能。所以,趁着周末我也思考和整理了一下,基于该框架,测试人员都能做些什么,目前想到的主要有以下几点:
- 渗透测试
- 测试数据构造
- 环境监控
- 动态埋点
- 热补丁
- 自动化录制
下面就针对以上几点,结合例子作些简单的分享(部分原理和过程可能不会做太细致的解释,看不懂的可以留言)。
1、渗透测试
以Testerhome的android客户端认证授权模块为例,这里使用了OAuth 2.0的授权协议,其中有个比较重要的访问令牌access_token。通过看源码我们可以发现,在TesterUser类中有个setAccess_token方法
public void setAccess_token(String access_token) {
this.access_token = access_token;
}
其输入参数即是用户授权后产生的访问令牌,因此我们可以通过以下方法来截取该令牌
public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {
if (!lpparam.packageName.equals("com.testerhome.nativeandroid"))
return;
XposedBridge.log("Loaded app: " + lpparam.packageName);
findAndHookMethod("com.testerhome.nativeandroid.models.TesterUser", lpparam.classLoader,"setAccess_token", String.class,new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
// this will be called before the clock was updated by the original method
XposedBridge.log("Enter->beforeHookedMethod");
XposedBridge.log("original token: " + (String)param.args[0]);
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
// this will be called after the clock was updated by the original method
}
});
运行后查看日志如下:
12-19 06:19:54.458: I/Xposed(11327): Enter->beforeHookedMethod
12-19 06:19:54.458: I/Xposed(11327): user token: 0a84d0c29a4b576634baacd5097c39b4e36264f440be5b3affba6b1b5b14603e
获取到令牌后就可以根据交互协议进一步获取用户相关的信息了。
当然,攻击者也可以直接修改该令牌值。
param.args[0] = "b6a8d0b02a651a7759051a5c8b1afa02db35636dd4c20c15dcbf050038d7ae2e";
这样用户登录后使用的都是非法的令牌值,也就无法获取合法的资源了。
findAndHookMethod("com.testerhome.nativeandroid.models.TesterUser", lpparam.classLoader,"getAccess_token