Android SandHook 使用

Hook 又叫“鉤子”,它可以在事件傳送的過程中截獲并監(jiān)控事件的傳輸,將自身的代碼與系統(tǒng)方法進(jìn)行融入
一般都是用于攔截修改系統(tǒng)方法,今天介紹的是一個(gè)開源 HOOK 框架 SandHook的使用,下邊是github的地址:
https://github.com/asLody/SandHook

添加依賴

implementation 'com.swift.sandhook:hooklib:4.2.0'
// need for android 11
implementation 'com.swift.sandhook:nativehook:4.2.0'

創(chuàng)建Hooker類

下邊是一個(gè) hook Activity 生命周期方法的實(shí)例,需要創(chuàng)建類,寫出要 hook 的方法名,通過@HookClass 和 @HookMethod 注解來聲明自已要Hook的類和方法;@HookMethodBackup注解來獲取攔截方法的原有實(shí)現(xiàn),通過 callOrigin 或者 SandHook.callOriginByBackup 來調(diào)用原有方法;@MethodParams 聲明方法的參數(shù)類型

@HookClass(Activity.class)
public class Hooker {

    @HookMethodBackup("onCreate")
    @MethodParams(Bundle.class)
    static Method onCreateBackup;

    @HookMethodBackup("onPause")
    static HookWrapper.HookEntity onPauseBackup;

    @HookMethod("onCreate")
    @MethodParams(Bundle.class)
    public static void onCreate(Activity thiz, Bundle bundle) throws Throwable {
        Log.e("ActivityHooker", "hooked onCreate success " + thiz);
        SandHook.callOriginByBackup(onCreateBackup, thiz, bundle);
    }

    @HookMethod("onPause")
    public static void onPause(@ThisObject Activity thiz) throws Throwable {
        Log.e("ActivityHooker", "hooked onPause success " + thiz);
        onPauseBackup.callOrigin(thiz);
    }
}

初始化Hooker類

下邊代碼最好放到 Application 的 onCreate 方法中,同時(shí)不要忘記將自定義的 Application 放到manifest application標(biāo)簽下的 android:name 中

try {
    SandHook.addHookClass(
            Hooker.class);
} catch (HookErrorException e) {
    e.printStackTrace();
}

自已定義想要 hook 的方法,有時(shí)候會初始失敗,可以看看這里拋出的異常,一般會有詳細(xì)信息,未找到 hook 的類,或者未找到 hook 的方法。

結(jié)論

這樣在每個(gè)Activity的 onCreate 和 onPause 的時(shí)候,都可以看到日志的打印,然后通過 callOrigin 方法回調(diào)系統(tǒng)的實(shí)現(xiàn)。
這樣就可以攔截自己需要的系統(tǒng)方法,并且還可以自己控制需不需要系統(tǒng)的原有實(shí)現(xiàn)。當(dāng)然也可以攔截自己代碼中的類中的方法,不一定必須是要系統(tǒng)方法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容