原理
- 通过下边的hook 图可以看到。应用是通过ZygoteIint开始执行的然后ActivityThread .而Xposed是hook 到了最上层。

- Demo$InnerClass.innerFunc通过hook 后变为了Native Method 这里有说具体原理

常用Hook方法
修改静态字段
//设置ms.bd.o.p1$a的静态属性name值为张三
Class clazz = XposedHelpers.findClass("ms.bd.o.p1$a", loadPackageParam.classLoader);
XposedHelpers.findField(clazz, "name").set(null, "张三");
修改实例对象的属性
Class D2Class = param.thisObject.getClass();
Field name = D2Class.getDeclaredField("name");
name.setAccessible(true);
name.set(param.thisObject, "张三");
常用获取类字节码的方式
//1、Class c = Class.forName("带有包名的完整类名");
Class class =Class.forName("java.lang.Integer");
//2、java中任何一个对象都有一个方法:getClass()
String s = "abc";
Class x = s.getClass(); //x代表String.class字节码文件,x代表String类型
//3、java语言中任何一种类型,包括基本数据类型,都有.class类型
Class z = String.class; //z代表String类型
//4、通过findclass
Class clz = XposedHelpers.findClass("地址",lpparam.classLoader)
//5、 通过 DexClassLoader 加载
DexClassLoader (String dexPath, String optimizedDirectory, String librarySearchPath, ClassLoader
Class clz = lpparam.classLoader.loadClass("com.xy.dex.plugin.impl.DexImpl");
Hook替换函数(更多应用于破解,协议开发用的不多)
XposedHelpers.findAndHookMethod(class,"funcName",new XC_MethodReplacment(){
@ovrride
})
Hook 内部类
Class clz = XposedHelpers.findClass("地址$内部类名",lpparam.classLoader)
主动调用(也分静态方法跟实例方法,如果是非静态方法需要实力化对象)
- 静态
Class clazz = XposedHelpers.findClass("ms.bd.o.p1$a", loadPackageParam.classLoader);
(Map<String, String>) XposedHelpers.callStaticMethod(clazz, "LIZ", url, _map);
- 类实例
Map<String, String> __map = (Map<String, String>) XposedHelpers.callMethod(param.thisObject, "LIZ", url, _map);
- 反射出类实例
Class clazz = XposedHelpers.findClass("ms.bd.o.p1$a", loadPackageParam.classLoader);
Map<String, String> __map = (Map<String, String>) XposedHelpers.callMethod(calss.newInstance(), "LIZ", url, _map);
打印堆栈
hook 堆栈 防止堆栈监测
findAndHookMethod(Thread.class, "getStackTrace", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
StackTraceElement[] st = (StackTraceElement[]) param.getResult();
String sts = "";
for (StackTraceElement ste : st) {
sts += ste.toString() + "\n";
}
Log.e("StackTrace", sts);
super.afterHookedMethod(param);
}
});
反射
Class clazz = XposedHelpers.findClass("ms.bd.o.p1$a", loadPackageParam.classLoader);
clazz.getMethod();// 获取方法。但是不能获取私有方法
clazz.getDelcaredMethod(); //可获取到私有方法
clazz.getFiled();
clazz.getDelcaredFiled();//可获取私有变量
Method a = clazz.getDelcaredMethod();
a.setAccessble(true);// 设定访问权限。私有方法
a.invoke(class.newInstance());
遍历方法和字段
Method[] md = clazz.getDelcaredMethods();
for (int i = 0;i<md.length;i++){
Log.d(md[i].toString())
}
Filed[] fd= clazz.getDelcaredFileds();
for (int i = 0;i<md.length;i++){
Log.d(md[i].toString())
}
遍历所有内部类
clazz.getDelcaredClasses()
遍历所有类 (利用反射原理,通过ClassLoader 类反射出所有类)
XposedHelpers.findAndHookMethod(ClassLoader.class,"loadClass", String.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(final MethodHookParam param) throws Throwable {
Class clazz = (Class) param.getResult();
class.getName();
}
});
遍历所有函数
通过遍历所有函数,可以去定位参数中是否有我们需要的变量;
修饰符 – getModifiers()
PUBLIC: 1
PRIVATE: 2
PROTECTED: 4
STATIC: 8
FINAL: 16
SYNCHRONIZED: 32
VOLATILE: 64
TRANSIENT: 128
NATIVE: 256
INTERFACE: 512
ABSTRACT: 1024
STRICT: 2048
XposedBirdge.hookAllMethods() // hook 所有同名的方法。主要是重载方法
XposedBirdge.hookMethod() // hook 所有方法
XposedHelpers.findAndHookMethod(ClassLoader.class,"loadClass", String.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(final MethodHookParam param) throws Throwable {
Class clazz = (Class) param.getResult();
Method[] mds = clazz.getDelcaredMethods();
for (int i = 0;i<mds.length;i++){
XposedBirdge.hookMethod(md[i],new XC_MethodHook(){
@Override
protected void beforeHookedMethod(final MethodHookParam param) throws Throwable {
final Method md = mds[i];
int mod = mds[i].getModifiers();
Modifier.isAbstract(mod); //判断是否是抽象方法
Modifier.isNative(mod); //判断是否是JNI
Modifier.isInerface(mod); //判断是否是接口
if (!Modifier.isAbstract(mod) && !Modifier.isNative(mod) && !Modifier.isInerface(mod)){
if (md.getName().contains("待hook 名")){
int paramNum = param.args.length;
for(int i=0;i<paramNum;i++){
String classType = param.args[i].getClass().getName();
}
}
}
}
})
}
}
});
Hook的一些操作
免重启hook hook https://www.cnblogs.com/CYCLearning/p/11636420.html
436

被折叠的 条评论
为什么被折叠?



