1.普通的类中方法;
XposedHelpers.findAndHookMethod(clazz,//类 "test",//方法名 String::class.java,//参数 object : XC_MethodHook() { @Throws(Throwable::class) override fun beforeHookedMethod(param: MethodHookParam) { Log.i(TAG, "正在替换参数:"+param) param.args[0] = "Haha, Android are hooked" } })
2.普通的类文件中的全局函数;
val packageName = "com.example.hooktarsget" // 包名 val className = "$packageName.MainActivityKt"//包中的类文件【注意类名后面加上Kt】 val gTestClass = lpparam.classLoader.loadClass(className)//加载这个特殊的类
剩下的与XposedHelpers.findAndHookMethod上面方式相同!
3.内部类的方法
//hook 匿名内部类TestClass的a方法,并替换参数,通过美元符号 $ 连接内部类
XposedHelpers.findAndHookMethod("com.example.hookdemo.MainActivity$TestClass", clazz.getClassLoader(),
"a", String.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
param.setResult("我被hook了");
}
});
总结:
一:hook方法,基本都是要获取类的模版,然后都按照相同的方式去调用XposedHelpers.findAndHookMethod方法
二:对于需要修改变量的值的时候,通过param可以获得hook的对象param.thisObject。然后使用param.thisObject进行一些相应的操作!
// 查找并访问字段 val targetClass: Class<*> = param.thisObject.javaClass val field = XposedHelpers.findField(targetClass, "name") if (field != null) { // 修改字段值 field.isAccessible = true field[param.thisObject] = "胜利的fork you!" }
三:相应的XposedHelpers还有get,setfield方法用来获得和设置字段内容!
XposedHelpers.setObjectField
四:同时不仅可以hook目标方法从类修改参数之类的,还可以直接替换目标方法从而直接实现自己想要的逻辑。用的是
XC_Methodreplacement()
-=-=-==-=-=-=========--------------------------------------------------------------------------------
4.//hook 获取MainActivity的TextView控件,并修改器内容
XposedHelpers.findAndHookMethod("com.example.hookdemo.MainActivity",
loadPackageParam.classLoader,
"onCreate",
Bundle.class,
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
//获取到当前hook的类,这里是MainActivity
Class clazz = param.thisObject.getClass();
XposedBridge.log("class name:" + clazz.getName());
// 通过反射获取控件,无论parivate或者public
Field field = clazz.getDeclaredField("mTextView");
// 设置访问权限
field.setAccessible(true);
TextView textView = (TextView) field.get(param.thisObject);
String string = textView.getText().toString();
XposedBridge.log("原来的文案 " + string);
// 修改文案
textView.setText("我是被劫持修改啦");
}
}
);