Xposed攔截抽象方法

XposeHelpers提供了一些輔助方法,咱們可使用findAndHookXXX:查找並Hook方法與構造方法。並且只能Hook方法與構造方法,不能Hook接口和抽象方法。若是直接攔截抽象方法,會出現下列錯誤:java

一、直接使用findAndHookMethod攔截抽象方法
//unregisterBiz方法爲LongLinkSyncService的抽象方法
XposedHelpers.findAndHookMethod("com.alipay.mobile.rome.longlinkservice.LongLinkSyncService",
        clzLd, "unregisterBiz", String.class, new XC_MethodHook()
        {
            @Override
            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                super.beforeHookedMethod(param);
            }
        });
複製代碼
public abstract class LongLinkSyncService {
    public abstract void unregisterBiz(String arg1);
}
複製代碼

Xposed會拋出以下錯誤:android

E/Xposed: java.lang.IllegalArgumentException: Cannot hook abstract methods: public abstract void com.alipay.mobile.rome.longlinkservice.LongLinkSyncService.unregisterBiz(java.lang.String)
        at de.robv.android.xposed.XposedBridge.hookMethod(XposedBridge.java:183)
        at de.robv.android.xposed.XposedHelpers.findAndHookMethod(XposedHelpers.java:184)
        at de.robv.android.xposed.XposedHelpers.findAndHookMethod(XposedHelpers.java:257)
        at com.mediatek.autotest.assist.hook.Xposed.zfb.AlipayRTPaySessionHk.test(AlipayRTPaySessionHk.java:114)
        at com.mediatek.autotest.assist.hook.Xposed.XposedEnter$1.afterHookedMethod(XposedEnter.java:55)
        at de.robv.android.xposed.XposedBridge.handleHookedMethod(XposedBridge.java:348)
        at android.app.Application.attach(<Xposed>)
        at android.app.Instrumentation.newApplication(Instrumentation.java:1002)
        at android.app.Instrumentation.newApplication(Instrumentation.java:986)
        at android.app.LoadedApk.makeApplication(LoadedApk.java:582)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4947)
        at de.robv.android.xposed.XposedBridge.invokeOriginalMethodNative(Native Method)
        at de.robv.android.xposed.XposedBridge.handleHookedMethod(XposedBridge.java:334)
        at android.app.ActivityThread.handleBindApplication(<Xposed>)
        at android.app.ActivityThread.-wrap1(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1563)
        at android.os.Handler.dispatchMessage(Handler.java:111)
        at android.os.Looper.loop(Looper.java:207)
        at android.app.ActivityThread.main(ActivityThread.java:5771)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:682)
        at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:102)
複製代碼

緣由是由於抽象方法僅僅只是被聲明沒有方法體,因此還須要被實現,而Xposed的不知道你想要攔截的是哪一個實現類的unregisterBiz方法,因此會拋出異常。微信

可是有時候咱們確實須要攔截抽象方法,這時候該怎麼辦呢?app

抽象方法最終是須要被實現的,並且抽象方法的實現體纔是咱們須要攔截的部分,因此咱們能夠攔截具體的實現方法便可。ide

二、使用XposedBridge.hookAllMethods攔截抽象方法的具體實現方法
思路:一、反射獲取抽象方法的實現類的實例對象mL2SyncSrv;
     二、使用XposedBridge.hookAllMethods具體的實現方法
複製代碼
Class<?> syncSrvClass = mL2SyncSrv.getClass();
XposedBridge.hookAllMethods(syncSrvClass, "unregisterBiz", new XC_MethodHook()
{
    @Override
    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
        super.beforeHookedMethod(param);
        param.setResult(null);
        LogUtil.logic_e("hook unregisterBiz: suc : ");
    }
});
複製代碼
public synchronized static Object findAliService(ClassLoader clzLd, String serviceClsName) {
    Object aliMicroAppClz = getAliMicroAppCxt(clzLd);
    return aliMicroAppClz != null ? ReflectUtils.reflect(aliMicroAppClz).method("findServiceByInterface", serviceClsName).get() : null;
}
複製代碼

至此,咱們須要攔截的抽象方法,即抽象方法的真正實現已經攔截成功。oop

總結:Xposed真的能夠隨心所欲,只要找對了方法,沒有什麼事Xposed不能作到的。spa

YSoul技術分享,掃碼關注微信公衆號

——只要你學會了以前所不會的東西,只要今天的你強過了昨天的你,那你就一直是在進階的路上了。.net

ps.png
版權聲明: blog.csdn.net/YSoul_40811…
相關文章
相關標籤/搜索