lsposed模块开发

  1. AndroidManifest.xml -> application 标签中加入以下内容
<meta-data
android:name="xposedmodule"
android:value="true" />
<meta-data
android:name="xposeddescription"
android:value="xiaojianbang Hook Demo" />
<meta-data
android:name="xposedminversion"
android:value="54" />
  1. app -> build.gradle -> dependencies 中加入以下内容
compileOnly files('libs\\api.jar')
  1. 将 api.jar 放入 libs 目录下, 在 api.jar 上右键,add as library

  2. 创建 assets 目录,在里面创建 xposed_init 文件,该文件中写入模块入口类全路径

import android.util.Log;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;

public class Main implements IXposedHookLoadPackage{

public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
//此处写hook代码即可
Log.d("xiaojianbang", "lsposed Hooking......");
//if (!loadPackageParam.packageName.equals(PackageName)) return;

}
}

注意:前面的步骤不能做错,否则模块会无法开启

hook构造函数和普通方法

package com.example.lsposeddemo;

import android.util.Log;

import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
public class Main implements IXposedHookLoadPackage{

public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
//此处写hook代码即可
Log.d("hyq", "lsposed Hooking......");
//if (!loadPackageParam.packageName.equals(PackageName)) return;
XposedHelpers.findAndHookConstructor("com.xiaojianbang.hook.Money", loadPackageParam.classLoader,
String.class,
int.class,
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
Log.d("xiaojianbangXposed", "Money Constructor beforeHookedMethod");
}

@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
Log.d("xiaojianbangXposed", "Money Constructor afterHookedMethod");
}
});
Class<?> aClass = XposedHelpers.findClass("com.xiaojianbang.Wallet", loadPackageParam.classLoader);
XposedHelpers.findAndHookConstructor(aClass,
String.class,
int.class,
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
Log.d("xiaojianbangXposed", "Wallet Constructor beforeHookedMethod");
}
});
}
}

获取和修改函数参数的返回值

package com.example.lsposeddemo;

import android.util.Log;

import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
public class Main implements IXposedHookLoadPackage{

public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
//此处写hook代码即可
Log.d("hyq", "lsposed Hooking......");
//if (!loadPackageParam.packageName.equals(PackageName)) return;
XposedHelpers.findAndHookConstructor("com.xiaojianbang.hook.Money", loadPackageParam.classLoader,
String.class,
int.class,
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
String args1 = (String) param.args[0];
int args2 = (int) param.args[1];
Log.d("xiaojianbangXposed", "Money Constructor afterHookedMethod" + args1 + " " + args2);
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
Log.d("xiaojianbangXposed", "Money Constructor beforeHookedMethod");
}
});
Class<?> aClass = XposedHelpers.findClass("com.xiaojianbang.hook.Wallet", loadPackageParam.classLoader);
XposedHelpers.findAndHookConstructor(aClass,
String.class,
String.class,
int.class,
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
param.args[0] = "ruyi";
param.args[2] = 10000;
Log.d("xiaojianbangXposed", "Wallet Constructor beforeHookedMethod");
}
});
XposedHelpers.findAndHookMethod("com.xiaojianbang.hook.Money", loadPackageParam.classLoader,
"getInfo",
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
String retval = (String) param.getResult();
Log.d("xiaojianbangXposed", "Money getInfo afterHookedMethod");
}
}
);
XposedHelpers.findAndHookMethod("com.xiaojianbang.hook.Utils", loadPackageParam.classLoader,
"getCalc",
int.class,
int.class,
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
param.setResult(10000);
Log.d("xiaojianbangXposed", "Utils getCalc afterHookedMethod");
}
}
);
}
}

获取和修改类的字段

package com.example.lsposeddemo;

import android.util.Log;

import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
public class Main implements IXposedHookLoadPackage{

public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {

//此处写hook代码即可
Log.d("hyq", "lsposed Hooking......");
//if (!loadPackageParam.packageName.equals(PackageName)) return;
try{
XposedHelpers.findAndHookConstructor("com.xiaojianbang.hook.Money", loadPackageParam.classLoader,
String.class,
int.class,
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
String args1 = (String) param.args[0];
int args2 = (int) param.args[1];
Log.d("xiaojianbangXposed", "Money Constructor afterHookedMethod" + args1 + " " + args2);
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
Log.d("xiaojianbangXposed", "Money Constructor beforeHookedMethod");
}
});
Class<?> aClass = XposedHelpers.findClass("com.xiaojianbang.hook.Wallet", loadPackageParam.classLoader);
XposedHelpers.findAndHookConstructor(aClass,
String.class,
String.class,
int.class,
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
param.args[0] = "ruyi";
param.args[2] = 10000;
Log.d("xiaojianbangXposed", "Wallet Constructor beforeHookedMethod");
}
});
XposedHelpers.findAndHookMethod("com.xiaojianbang.hook.Money", loadPackageParam.classLoader,
"getInfo",
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
Class<?> aClass1 = XposedHelpers.findClass("com.xiaojianbang.hook.Money", loadPackageParam.classLoader);
String flag = (String)XposedHelpers.getStaticObjectField(aClass1, "flag");
Log.d("xiaojianbangXposed", "Money flag getStaticObjectField " + flag);
XposedHelpers.setStaticObjectField(aClass1, "flag", "QQ285092564");
String currency = (String) XposedHelpers.getObjectField(param.thisObject, "currency");
int amount = XposedHelpers.getIntField(param.thisObject, "amount");
String retval = (String) param.getResult();
Log.d("xiaojianbangXposed", "Money getInfo afterHookedMethod " + retval + " " + currency + " " + amount);
}
}
);
XposedHelpers.findAndHookMethod("com.xiaojianbang.hook.Utils", loadPackageParam.classLoader,
"getCalc",
int.class,
int.class,
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
param.setResult(10000);
Log.d("xiaojianbangXposed", "Utils getCalc afterHookedMethod");
}
}
);
}catch (Exception e){
e.printStackTrace();
}
}
}

注意:获取静态字段的时候要注意时机,太早了会获取不到

hook自定义类参数

//获取类的字节码的几种方法
/*
* 类名.class String[][].class
* 对象.getClass()
* class.forName('......')
* class.forName('......', false, classloader)
* "java.lang.String"
* XposedHelpers.findClass(......)
* classloaderObj.loadClass(......)
*/
XposedHelpers.findAndHookMethod("com.xiaojianbang.hook.Wallet", loadPackageParam.classLoader,
"deposit",
//"com.xiaojianbang.hook.Money",
//XposedHelpers.findClass("com.xiaojianbang.hook.Money", loadPackageParam.classLoader),
//loadPackageParam.classLoader.loadClass("com.xiaojianbang.hook.Money"),
Class.forName("com.xiaojianbang.hook.Money", false, loadPackageParam.classLoader),
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
Log.d("xiaojianbangXposed", "Wallet deposit afterHookedMethod 111");
}
});

hook匿名类与内部类

匿名类用$加数字,内部类$加名字

XposedHelpers.findAndHookMethod("com.xiaojianbang.app.MainActivity$1", loadPackageParam.classLoader,
"getInfo",
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
Class<?> aClass = XposedHelpers.findClass("com.xiaojianbang.app.MainActivity$1", loadPackageParam.classLoader);
String result = (String) param.getResult();
Log.d("xiaojianbangXposed", "MainActivity getInfo afterHookedMethod " + result);
}
});

替换函数

XposedHelpers.findAndHookMethod("com.xiaojianbang.hook.Wallet", loadPackageParam.classLoader,
"deposit",
"com.xiaojianbang.hook.Money",
new XC_MethodReplacement() {
@Override
protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {
Log.d("xiaojianbangXposed", "Money getInfo replaceHookedMethod " + methodHookParam.args[0]);

return true;
}
});

打印函数堆栈

Log.e("xiaojianbangXposed", "", new Throwable("stack dump"));

主动调用

静态方法

int result = (int)XposedHelpers.callStaticMethod(
XposedHelpers.findClass("com.xiaojianbang.hook.Utils", loadPackageParam.classLoader),
"getCalc", 1, 1);
Log.d("xiaojianbangXposed", "Utils callStaticMethod " + result);

实例方法

XposedHelpers.findAndHookMethod("com.xiaojianbang.hook.Money", loadPackageParam.classLoader,
"getInfo",
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
String currency =(String) XposedHelpers.callMethod(param.thisObject, "getCurrency");
Log.d("xiaojianbangXposed", "callMethod "+ currency);
}
});

反射主动调用

Class<?> aClass = Class.forName("com.xiaojianbang.hook.Utils", false, loadPackageParam.classLoader);
Method getCalc = aClass.getDeclaredMethod("getCalc", int.class, int.class);
Object invoke = getCalc.invoke(null, 100, 200);
Log.d("xiaojianbangXposed", "invoke: " + invoke);
Log.d("xiaojianbangXposed", "invoke int : " + (int)invoke);

hook方法的所有重载

XposedBridge.hookAllMethods(XposedHelpers.findClass("com.xiaojianbang.hook.Utils", loadPackageParam.classLoader)
, "getCalc", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
for (int i = 0; i < param.args.length; i++) {
Log.d("xiaojianbangXposed", "Utils getCalc: " + param.args[i]);
}
Log.d("xiaojianbangXposed", "====================================");
}

});

XposedBridge.hookAllMethods(XposedHelpers.findClass("com.xiaojianbang.hook.Utils", loadPackageParam.classLoader)
, "myPrint", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
for (int i = 0; i < param.args.length; i++) {
Log.d("xiaojianbangXposed", "Utils getCalc: " + param.args[i] + " type: " + param.args[i].getClass().getName());
}
Log.d("xiaojianbangXposed", "====================================");
}

});
XposedHelpers.findAndHookMethod(XposedHelpers.findClass("com.xiaojianbang.hook.Utils", loadPackageParam.classLoader),
"myPrint",
"[Ljava.lang.Object;", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
Log.d("xiaojianbangXposed", "Utils getCalc: " + param.args[0] + " type: " + param.args[0].getClass().getName());
}
});

hook类的所有方法

Class<?> aClass = XposedHelpers.findClass("com.xiaojianbang.hook.Utils", loadPackageParam.classLoader);
Method[] declaredMethods = aClass.getDeclaredMethods();
for (int i = 0; i < declaredMethods.length; i++) {
Method method = declaredMethods[i];
int modifier = method.getModifiers();
if (!Modifier.isAbstract(modifier) &&
!Modifier.isNative(modifier) &&
!Modifier.isInterface(modifier)) {

XposedBridge.hookMethod(method, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
Log.d("xiaojianbangXposed", "Utils declaredMethods is hooked : " + method);
}
});
}
}