Xposed框架是一个由xda开发的hook框架,并且有许多基于这个框架的优秀插件(功能模块)。这些插件配合Xposed框架可以在不修改APK的情况下影响程序的运行,几乎可以达到为所欲为的目的,对APK实现界面修改、逻辑修改、数据修改。比如:直接把APP的界面改成自己想要的样子,去掉界面里不喜欢的东西。自动抢红包,消息防撤回,步数修改等等。不过这一切的先决条件就是Xposed需要拥有最高权限。
Xposed开发框架下有很多优秀的插件可以供我们直接使用,这里列举一下我日常工作中使用到的插件。如果自己有兴趣的话,也可以自己开发插件。本文后半段会介绍如何开发插件。
- JustTrustMe(去除ssl证书绑定)
- sslnpinning(同上)
- enablesnapshoot(去除截屏限定)
- inspeckage(客户端动态分析工具)
- AndroidIdChanger(设备信息修改)
网上有很多文章科普了Xposed安装方式,这里就不展开说明。具体步骤就是先root手机、然后安装Xposed Installer。唯一需要注意的是sdk 23之后需要用到recovery工具安装。
目标APK很简单,直接调用getString函数获取字符串,然后赋值给TextView。接下来我们开发一个插件,修改getString函数的返回值。
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private TextView mTv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTv = findViewById(R.id.tv);
mTv.setText(getString());
}
private String getString() {
return "have a nice day.";
}
}
- 新建android工程
- 在manifest中添加meta-data
第一个xposedmodule的属性为ture,证明这是一个xposed的module;第二个xposeddescription,这是介绍项目的话语;第三个xposedminversion则是说明该xposedmodule所支持的最小版本,本文填写的最低版本就是54。
- 导入xposed api包
导入xposed api包有两种方式。第一,可以下载jar文件,存放至lib目录,然后在用provided的方式添加。或者直接在build.gradle中使用 provided 关键字添加依赖。注意不要使用 compile 关键字。我们只需要借助依赖包把apk编译成功即可,不需要把依赖包打包到apk的代码里。
- 添加xposed_init文件 在src/main目录下添加一个assets目录,目录下添加一个xposed_init文件,里面的代码是你的Hook类的包名+类名。而本项目就是 com.flysands.xposeddemo.ModuleTest 。
- 添加插件代码
继承了IXposedHookLoadPackage接口,重写了handleLoadPackage方法,判断了下包名,如果是目标apk包名。则调用XposedHelpers.findAndHookMethod hook掉getString方法,在XC_MethodHook重写afterHookedMethod,当geString执行后会回调这个方法,把返回值修改为 xposed test 。
package com.flysands.xposeddemo; import android.util.Log; import de.robv.android.xposed.IXposedHookLoadPackage; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedHelpers; import de.robv.android.xposed.callbacks.XC_LoadPackage; /** * Created by chenxuesong on 2019/12/30. */ public class ModuleTest implements IXposedHookLoadPackage { public static final String TAG = "flysands"; @Override public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable { Log.d(TAG, "try to hook " + lpparam.packageName); if ("com.flysands.dronydemo".equals(lpparam.packageName)) { XposedBridge.log("ready to hook method."); XposedHelpers.findAndHookMethod("com.flysands.dronydemo.MainActivity", lpparam.classLoader, "getString", new XC_MethodHook() { @Override protected void afterHookedMethod( MethodHookParam param) throws Throwable { super.afterHookedMethod(param); param.setResult("xposed test"); } }); } } }
目标apk的getString的参数被我们修改为 xposed test 。
本文仅仅叙述了xposed插件的开发过程。在下一篇文章我们会详细介绍,xposed 和 burp交互使用。抓取并修改apk加密前的数据。