一、基本写法
package com.example.androidhookdemo;
import android.app.Application;
import android.view.View;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
//新建一个类,实现接口IXposedHookLoadPackage
public class MainCopy implements IXposedHookLoadPackage {
@Override
//实现接口定义的方法handleLoadPackage
public void handleLoadPackage(final XC_LoadPackage.
LoadPackageParam lpparam) throws Throwable {
//过滤掉不符合要求的类,可以打一下日志,看看是否正常
if (lpparam.packageName.equals("com.example.xiaoming")){
XposedBridge.log("Loaded app: " + lpparam.packageName);
//先导入import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
//使用findAndHookMethod方法Hook目标方法,findAndHookMethod(目标class名,lpparam.classLoader,方法名,参数1,参数2....,
// new XC_MethodHook(){实现beforeHookedMethod和afterHookedMethod方法})
//XC_MethodHook:在目标方法执行前/后运行相应的替换函数;
//beforeHookedMethod 主要用来读取和修改参数
//afterHookedMethod 主要用来修改返回值以及查看修改是否生效
//XC_MethodReplace:完全替换目标方法,执行用户自定义的新方法。
findAndHookMethod("com.example.xiaoming.myapplication.MainActivity",
lpparam.classLoader,
"getString",
String.class,new XC_MethodHook(){
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("开始劫持了~");
XposedBridge.log("参数1 = " + param.args[0]);
String s = (String)param.args[0];
Integer i = Integer.valueOf(s);
i = i + 1;
s = i + "";
//修改被hook方法的参数
param.args[0] = s;
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("劫持结束了~");
XposedBridge.log("参数1 = " + param.args[0]);
}
});
}else{
XposedBridge.log("包名不符合"+lpparam.packageName);
}
}
}
二、Hook加固应用