关于参数问题
📌 如果方法是这样
public int addNumbers(int a, int b) {return a + b;
}
📌 Hook 代码
XposedHelpers.findAndHookMethod("com.example.app.Calculator",lpparam.classLoader,"addNumbers",int.class, int.class, // 两个参数,都是 intnew XC_MethodHook() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) {XposedBridge.log("[+] addNumbers 被 Hook,参数: " + param.args[0] + ", " + param.args[1]);}});
📌 beforeHookedMethod
和 afterHookedMethod
的区别
💡 简单理解
方法 | 执行时机 | 作用 |
---|---|---|
beforeHookedMethod | 目标方法执行前 | 获取/修改参数,阻止方法执行 |
afterHookedMethod | 目标方法执行后 | 获取/修改返回值 |
beforeHookedMethod
✅ beforeHookedMethod
作用
- 在方法执行前,获取参数 →
param.args[0]
- 修改参数,让方法运行时使用新的参数 →
param.args[0] = "NewValue"
- 阻止目标方法执行 →
param.setResult(null)
beforeHookedMethod
获取参数
📌 如果目标方法是
public void setUserInfo(String username, int age) {System.out.println("User: " + username + ", Age: " + age);
}
📌 Hook 代码
XposedHelpers.findAndHookMethod("com.example.app.UserManager",lpparam.classLoader,"setUserInfo",String.class, int.class, // 方法的参数类型new XC_MethodHook() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) {// 获取方法的参数String username = (String) param.args[0];int age = (int) param.args[1];XposedBridge.log("[+] 用户名: " + username);XposedBridge.log("[+] 年龄: " + age);}});
beforeHookedMethod
修改参数
📌 修改参数,让方法执行时使用新参数
XposedHelpers.findAndHookMethod("com.example.app.UserManager",lpparam.classLoader,"setUserInfo",String.class, int.class,new XC_MethodHook() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) {// 修改参数param.args[0] = "HookedUser"; // 修改用户名param.args[1] = 99; // 修改年龄XposedBridge.log("[+] 参数已修改 -> 用户名: " + param.args[0] + ",年龄: " + param.args[1]);}});
beforeHookedMethod
阻止方法并返回假数据
📌 如果方法有返回值
public boolean isUserPremium() {return false;
}
📌 Hook 代码
XposedHelpers.findAndHookMethod("com.example.app.UserManager",lpparam.classLoader,"isUserPremium",new XC_MethodHook() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) {XposedBridge.log("[+] isUserPremium 被 Hook,强制返回 true");param.setResult(true); // 让方法永远返回 true}});
✅ 作用
isUserPremium()
方法永远返回true
- 适用于绕过 VIP 限制
afterHookedMethod
XposedHelpers.findAndHookMethod("com.example.app.UserManager",lpparam.classLoader,"getUserInfo",new XC_MethodHook() {@Overrideprotected void afterHookedMethod(MethodHookParam param) {XposedBridge.log("[+] 原始返回值: " + param.getResult());// 修改返回值param.setResult("Hooked UserInfo");XposedBridge.log("[+] 修改后返回值: " + param.getResult());}});
✅ 作用
- 方法执行后,修改返回值
- 原来的
getUserInfo()
返回"Real UserInfo"
- Hook 之后,返回
"Hooked UserInfo"
功能 | beforeHookedMethod | afterHookedMethod |
---|---|---|
执行时机 | 方法执行 前 | 方法执行 后 |
获取参数 | ✅ param.args[0] | ❌(只能看返回值) |
修改参数 | ✅ param.args[0] = "NewValue" | ❌ |
阻止方法执行 | ✅ param.setResult(null) | ❌ |
修改返回值 | ❌ | ✅ param.setResult("NewValue") |
让方法延迟执行 | ✅ Thread.sleep(5000) | ❌ |
MethodHookParam
的常用方法
方法 | 作用 |
---|---|
param.args[i] | 获取/修改方法的第 i 个参数 |
param.thisObject | 获取当前调用方法的对象(this ) |
param.getResult() | 获取方法的返回值(仅 afterHookedMethod 可用) |
param.setResult(Object value) | 修改返回值(仅 afterHookedMethod 可用) |
param.setThrowable(Throwable t) | 让方法抛出异常 |
param.hasThrowable() | 检查方法是否抛出异常 |
param.getThrowable() | 获取方法抛出的异常 |
📌 Xposed 直接启动某个方法
💡 在 Xposed 里,你可以使用 XposedHelpers.callMethod()
或 XposedHelpers.callStaticMethod()
直接启动(调用)某个方法,就像 Frida 里的 choose()
之后手动调用方法一样。
1️⃣ 使用 XposedHelpers.callMethod()
调用对象方法
📌 假设目标类 User
里有一个方法
public class User {public String getUsername() {return "Alice";}
}
📌 在 Xposed 里 Hook 该类,并调用 getUsername()
XposedHelpers.findAndHookConstructor("com.example.app.User",lpparam.classLoader,String.class, int.class,new XC_MethodHook() {@Overrideprotected void afterHookedMethod(MethodHookParam param) {Object instance = param.thisObject; // 获取 User 实例String username = (String) XposedHelpers.callMethod(instance, "getUsername");XposedBridge.log("[+] 直接调用 getUsername(),返回值: " + username);}});
✅ 作用
- 当
User
对象被创建后,直接调用getUsername()
- 不需要等 App 调用这个方法,Xposed 主动触发
- 适用于 Hook 目标对象后立即执行特定方法
1️⃣ replaceHookedMethod()
直接替换方法
和frida的这个方法差不多implementation。
📌 Frida
Java.use("com.example.app.TargetClass").targetMethod.implementation = function(arg) {console.log("Hooked! 参数: " + arg);return "Hooked Result";
};
📌 Xposed
XposedHelpers.findAndHookMethod("com.example.app.TargetClass",lpparam.classLoader,"targetMethod",String.class,new XC_MethodReplacement() { // 直接替换方法@Overrideprotected Object replaceHookedMethod(MethodHookParam param) {XposedBridge.log("[+] targetMethod 被完全替换");return "Hooked Result"; // 返回新的结果}});