0x01 什么是xposed?
Xposed是一款可以在不修改APK的情况下影响程序运行的框架服务,基于Xposed能够制作出许多功能强大的模块,且在功能不冲突的情况下同时运作。
xposed是一个框架,可以通过xposed installer安装,具体安装方法我就不在这里详述了,需要的同学请自行搜索。这里我们主要介绍其hook函数的方法。
其api jar包下载地址:api下载地址
0x02 使用api lib
在android studio最新版本中(目前2.1.2),将jar添加到项目中作为lib已经十分简单了,不过这里需要注意几个细节。
新建一个项目,可以没有activity,如果有的话也不影响。
首先将下载jar包放入项目的/app/libs/里边,并在android studio中找到这个jar包,右键点击,选择 add as library。
其次,在android studio中找到app/build.gradle,将里边的compile files(‘libs/XposedBridgeApi-XX.jar’) (此处的XX为版本号)的compile改为provided
注意,第二步如果不改会得到error,信息为:IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
0x03 更改manifest
在AndroidManfest里边,在项中添加如下项
<meta-data
android:name="xposedmodule"
android:value="true"/>
<meta-data
android:name="xposeddescription"
android:value="Easy example"/>
<meta-data
android:name="xposedminversion"
android:value="54"/>
其中Easy example为你自己的描述,可以自行根据内容更改,最后一个meta-data里边的54为最少需要xposed的版本,我之前下载的版本为54,所以我设置其为54,可以自行更改。
0x04 java代码
新建一个java class,可以随意命名。(具体写在注释里)
package com.example.root.hook_test;//自己的包名
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;
//android studio中可以自动添加import,不需要自己处理
/**
* Created by Anciety on 7/19/16.
*/
public class Test implements IXposedHookLoadPackage{
@Override
public void handleLoadPackage(
final XC_LoadPackage.LoadPackageParam loadPackageParam)
throws Throwable {
//这里是一个hook应用的实例,主要目的是hook com.example.crackme中的check函数,使其返回值为true
if (!loadPackageParam.packageName.equals("com.example.crackme")) {
//loadPackageParam为载入的package的参数,其中packageName存了包名,如果包名不一致,不做处理
return;
}
//使用XposedBridge的log来输出载入的app,在tag过滤器中添加Xposed即可读取log
XposedBridge.log("Loaded app:" + loadPackageParam.packageName);
//这里就是关键了,hook方法(函数)的时候用到这个方法
XposedHelpers.findAndHookMethod(
"com.example.crackme.MainActivity",//要hook的类
loadPackageParam.classLoader,//获取classLoader
"check",//要hook的方法(函数)
String.class,//第一个参数
String.class,//第二个参数
new XC_MethodHook() {
//这里是hook回调函数
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
//afterHookedMethod,顾名思义,在被hook的方法之后调用这个函数
//param.args作为数组,存了调用函数时的参数,通过getResult得到返回值
XposedBridge.log("after hook:" + param.args[0]);
XposedBridge.log("after hook 2:" + param.args[1]);
XposedBridge.log("result:" + param.getResult());
param.setResult(true);//通过setResult更改返回值
XposedBridge.log("result(settled):" + param.getResult());
}
});
}
}
与afterHookedMethod对应,还有beforeHookedMethod,即在之前被调用。
0x05 添加assets/xposed_init
之前的许多教程也是说将xposed_init添加到assets文件夹中,但是android studio和eclipse的文件夹结构不尽相同,在这里花费了一些时间。
这里是在/app/src/main/内新建一个文件夹,assets,然后在该文件夹中新建文本文件,命名为xposed_init,在其中写入完整的包名和用来hook的类名,本例中为com.example.root.hook_test.Test
0x06 安装
将app安装后,在xposed installer中添加上模块,重启,就可以测试了。