Xposed的一些常用总结

原理

  • 通过下边的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

Hook 实操整理

hook hashmap

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Good Iead

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值