當前位置:
首頁 > 最新 > Xposed-05-API介紹

Xposed-05-API介紹

上一節整理、收集、分享了Xposed相關資料和交流社區。

這一節開始我們將討論Xposed 基礎API的使用和部分注意事項。

一般情況下,API版本號與Xposed版本號相等,框架的變化,才會導致版本號的變化。Xposed作者推薦使用者使用最新的API版本。如Xposed-03-模塊開發小節所示,我們將使用最新版本的API。

討論將從Xposed-03-模塊開發小節用到的API開始。

本文中的「目標方法」是指我們期望進行HOOK的Java方法或Java構造器。

為了獲得更好的閱讀體驗,建議橫屏閱讀。

文檔說明:http://api.xposed.info/reference/de/robv/android/xposed/IXposedHookLoadPackage.html

這是Xposed的回調介面,Xposed會自動註冊這個介面的實現類(在assets/xposed_init文件中配置)為插件代碼的執行入口。

這是代碼注入的入口!!!

每一個DVM進程啟動時,都會調用其實現類的方法,並將當前進程的應用程序信息作為參數傳遞給自定義代碼,從而實現代碼注入。插件注入的任何功能實現都是從這裡開始執行,而不是從插件應用的Application#onCreate()方法開始的。至關重要!!!

文檔說明:http://api.xposed.info/reference/de/robv/android/xposed/callbacks/XC_LoadPackage.LoadPackageParam.html

這是一個內部類,封裝了正在載入的進程的應用程序信息,其對象作為方法的參數,具體包括的信息如下:

文檔說明:http://api.xposed.info/reference/de/robv/android/xposed/XC_MethodHook.html

這是Xposed的方法回調介面,非常重要的一個介面。

實際上從Java的語法來講,它是一個抽象類,包含兩個空方法:

/**該方法中的代碼會在目標方法被調用前執行**/

protected voidbeforeHookedMethod(MethodHookParam param)throwsThrowable {}

/**該方法中的代碼會在目標方法被調用後執行**/

protected voidafterHookedMethod(MethodHookParam param)throwsThrowable {}

這兩個空方法,就是我們在HOOK目標方法時,需要通過覆寫真正實現代碼的地方。

也就是說,我們要想在運行時對目標方法進行修改,就必須覆寫這兩個方法!!!

其實上句話只是一個強調,並不準確,因為XC_MethodHook還有比較特殊的子類。

文檔說明:http://api.xposed.info/reference/de/robv/android/xposed/XC_MethodHook.MethodHookParam.html

這是一個內部類,類似封裝了信息數據。不同的是,封裝了應用程序信息,其對象作為方法的參數;封裝了Java方法的信息,其對象作為和方法的參數,具體如下:

在覆寫的方法中,可以修改參數,從而影響目標方法的執行。

在覆寫的方法中,可以通過調用方法修改目標方法的返回值。

文檔說明:http://api.xposed.info/reference/de/robv/android/xposed/XposedHelpers.html

使用說明:https://github.com/rovo89/XposedBridge/wiki/Helpers

我們這裡將討論四個最基本、最常用的方法,至於其他的方法,我們會在未來的章節中說明,請優先使用以上連接查看、學習。

public staticXC_MethodHook.UnhookfindAndHookMethod(Class clazz,String methodName,Object... parameterTypesAndCallback);

public staticXC_MethodHook.UnhookfindAndHookMethod(String className,ClassLoader classLoader,String methodName,Object... parameterTypesAndCallback);

public staticXC_MethodHook.UnhookfindAndHookConstructor(Class clazz,Object... parameterTypesAndCallback);

public staticXC_MethodHook.UnhookfindAndHookConstructor(String className,ClassLoader classLoader,Object... parameterTypesAndCallback);

以上四個方法中,名稱為的兩個方法,是為了查找和HOOK Java方法,名稱為的兩個方法,是為了查找和HOOK Java構造器。

在Java中雖然構造器也是方法,但是構造器沒有名字,或者說所有類的構造器名稱都是相同的(),所以需要將Java方法和Java構造器的查找和HOOK操作進行分離。

通過以上四個方法對目標方法進行查找,如果找不到目標方法,拋出異常,HOOK失敗;如果找到目標方法,HOOK成功,可以在目標方法執行前修改參數、在目標方法執行後修改返回值,甚至完全替換掉目標方法,轉而執行我們自定義的方法,聽起來都棒棒噠,有木有?

當然,不誇張地說,我們還可以在目標方法執行前後做其他任何事情,只要想得到,沒有做不到(想要美女,確實做不到)。

上述第二個方法其實是通過調用第一個方法實現的。

以上四個方法的參數說明如下(若是發現描述不準確,請留言討論,進行更正):

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 全球大搜羅 的精彩文章:

羅志祥的女朋友差點又犯錯!
探古尋幽永宗寺

TAG:全球大搜羅 |