1. hook 普通静态方法
jadx 反编译分析查看代码,找到需要hook的类和方法
Xposed 插件的写法
// 判断 当前的 启动的模板程序是否是 需要hook的 应用,这里要知道 应用的报名// 如果不判断指定 报名 启动 插件的话,打开所有的应用都会 启动插件,就会保存,其他的应用 不一定用这个指定方法if(loadPackageParam.packageName.equals("com.qianyu.helloworld")) {// hook 方法 普通方法 静态方法XposedHelpers.findAndHookMethod("com.qianyu.helloworld.LoginActivity", // 指定加载类,包名+类名loadPackageParam.classLoader, // 类加载器"login", // 指定hook的方法String.class, String.class, // 指定hook的方法的参数列表,参数类型.classnew XC_MethodHook() {@Override // 执行指定方法之前 要做的操作,就可以在这个方法里面 写逻辑protected void beforeHookedMethod(MethodHookParam param) throws Throwable {super.beforeHookedMethod(param);// param.args 方法的 传入参数XposedBridge.log("args1: " + param.args[0]);XposedBridge.log("args2: " + param.args[1]);}@Override // 执行指定方法之后 要做的操作,就可以在这个方法里面 写逻辑protected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);// 在 执行 方法之后,获取方法的返回值 param.getResult()XposedBridge.log("result: " + param.getResult());}});}
2. hook 构造方法
jadx 反编译找到 构造方法,使用Xposed的插件hook测试
Xposed插件hook构造方法的解法
// hook 构造方法 不需要填写方法名XposedHelpers.findAndHookConstructor("com.qianyu.helloworld.MySQLiteDatabase", // 指定加载类,包名+类名loadPackageParam.classLoader,Context.class, // 指定hook的方法的参数列表,参数类型.classnew XC_MethodHook() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {super.beforeHookedMethod(param);XposedBridge.log("args1 findAndHookConstructor: "+param.args[0]);Toast.makeText((Context) param.args[0],"hook 构造方法 ",Toast.LENGTH_LONG).show();}@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);}});
3. hook 匿名内部类
以 一个实践监听为测试,作为一个 匿名内部类的 hook 测试
android/view/View 匿名内部类,调用
Xposed 插件的hook 写法
// hook 匿名内部类Class <?> clazz = XposedHelpers.findClass("com.qianyu.helloworld.LoginActivity$1",loadPackageParam.classLoader);XposedHelpers.findAndHookMethod(clazz, "onClick", View.class,new XC_MethodHook() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {super.beforeHookedMethod(param);View view = (View) param.args[0];XposedBridge.log("View beforeHookedMethod: "+view.getId());}@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);View view = (View) param.args[0];XposedBridge.log("View afterHookedMethod: "+view.getId());}});
4. xposed 拦截方法(hook并替换方法(XP主动调用方法))
jadx 反编译 apk 应用,找到payFailed或者payCancel的方法,拦截 变成 执行paySuccess方法
找到 对应的 类名com.qy.zombie.zombie$3 这才是 上面三个方法的 所属的类里面,不然会hook不到
xposed 插件写 拦截方法(替换方法的写法)和 XP主动调用方法 方法
中间出错,用打印日志或调用栈看错误日志
// 打印方法调用栈的信息StackTraceElement[] wodelogs = new Throwable("wodelog").getStackTrace();// 使用for循环打印 调用栈查看调用关系for(int i = 0;i<wodelogs.length;i++){XposedBridge.log("查看调用栈:"+ wodelogs[i].toString());}
// 换了 一个 贪吃蛇的项目if (loadPackageParam.packageName.equals("com.yunhaoge.tanchishe.egame")) {// 找到 需要 执行方法的 类Class<?> clazz = XposedHelpers.findClass("com.qy.zombie.zombie$3",loadPackageParam.classLoader);// 拦截方法,替换方法 payCancelXposedHelpers.findAndHookMethod(clazz, "payCancel", Map.class,new XC_MethodReplacement() {@Overrideprotected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {// 替换其他方法,XP主动调用 方法Map<String,String> map = new HashMap<>();XposedHelpers.callMethod(methodHookParam.thisObject,"paySuccess",map);// 打印方法调用栈的信息StackTraceElement[] wodelogs = new Throwable("wodelog").getStackTrace();// 使用for循环打印 调用栈查看调用关系for(int i = 0;i<wodelogs.length;i++){XposedBridge.log("查看调用栈:"+ wodelogs[i].toString());}return null;}});// 拦截方法,替换方法 payFailed 直接调用里面的 zombie.BuySccess(); 其他类的方法// Class<?> clazz2 = XposedHelpers.findClass("com.qy.zombie.zombie",loadPackageParam.classLoader);XposedHelpers.findAndHookMethod(clazz, "payFailed", Map.class,int.class,new XC_MethodReplacement() {@Overrideprotected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {// 替换其他方法,XP主动调用 方法Map<String,String> map = new HashMap<>();XposedHelpers.callStaticMethod(XposedHelpers.findClass("com.qy.zombie.zombie",loadPackageParam.classLoader),"BuySccess");// 打印方法调用栈的信息StackTraceElement[] wodelogs = new Throwable("wodelog").getStackTrace();// 使用for循环打印 调用栈查看调用关系for(int i = 0;i<wodelogs.length;i++){XposedBridge.log("查看调用栈:"+ wodelogs[i].toString());}return null;}});}
如果觉得《安卓逆向——Xposed插件常用HOOK方法》对你有帮助,请点赞、收藏,并留下你的观点哦!