從零開始自學了半年Android逆向反編譯,XPosed框架中的幾個常見的反射方法
一、對Class類的HOOK反射
① 反射類,獲取該類;
/** hook某類 */
Class<?> clazz = XposedHelpers.findClass("類的路徑", classLoader);
② 反射類,獲取該類是否存在;
/** hook某類是否存在 */
Class<?> clazz = XposedHelpers.findClassIfExists("類的路徑", classLoader);
③ 反射類,獲取該類,可以取出傳入該類的數(shù)據(jù)
/** hook類 */
XposedBridge.hookAllConstructors(clazz, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
}
});
二:對方法類的HOOK反射
① 反射某類中的方法,獲取該方法,可以取出傳入該方法的數(shù)據(jù)
XposedHelpers.findAndHookMethod("類的路徑", classLoader, "類里的方法", "方法傳入的值", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
/** 反射方法前 */
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
/** 反射方法后 */
}
});
② 反射某類中的方法,獲取該方法,可以取出傳入該方法的數(shù)據(jù)
/** hook某路徑類方法 */
XposedHelpers.findAndHookMethod(clazz, "類里的方法", "方法傳入值", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
/** hook某路徑類中的方法 */
Object objectField = XposedHelpers.getObjectField(param.thisObject, "方法變量");
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
}
});
③ 獲取某類中的全部方法,并進行遍歷,可以取出傳入該方法的數(shù)據(jù)
/** 遍歷類中的方法 */
for (Method method : clazz.getDeclaredMethods()) {
if (method.getName().equals("方法")
&& !Modifier.isAbstract(method.getModifiers())
&& Modifier.isPublic(method.getModifiers())) {
XposedBridge.hookMethod(method, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
}
});
}
}
④ 反射某類中的方法,獲取該方法,可以取出傳入該方法的數(shù)據(jù)
/** hook類中的方法 */
XposedBridge.hookAllMethods(clazz, "方法", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
}
});
以上是獲取反射類,若目前常用的就是這些方法,接下來介紹下怎么進行重新創(chuàng)建:
①對類進行創(chuàng)建
Object object = XposedHelpers.newInstance(clazz, "需要傳入的值");
②對類里的公用方法的重獲取
Object object = XposedHelpers.callStaticMethod(clazz, "該類中的公用方法", "需要傳入的值");
③對類里的方法的重獲取
Object object = XposedHelpers.callMethod("HOOK某類的對象", "該類中的公用方法", "需要傳入的值");