插件開發之360 DroidPlugin源碼分析(二)Hook機制

前言:新插件的開發,可以說是為插件開發者帶來了福音,雖然還很多坑要填補,對于這款牛逼的插件機制,一直想找個時間分析和總結下它的code,話不多說,直接入正題,本文是分析../hook/handle及../hook/proxy下代碼,../hook/binder單獨分析

Hook機制的包結構關系

Hook機制的類圖關系

Hook機制的時序圖關系

Manifest權制申請

基類Hook做了什么?

HookedMethodHandler

基類BaseHookHandle和Hook有什么關系?

ProxyHook能干什么?

實例-如何hook IPackageManager

Hook機制的包結構關系

Hook機制類圖關系

首先定義了一個基類Hook,抽象類,外部可以通過setEnable()方法來使能否hook。聲明了onInstall和onUnInstall及相關的方法,子類可以覆蓋這些方法完成相應的車間機床,這里相當于提供一個車間,機床上的具體操作什么由子類去自己實現。

Hook機制的時序圖關系

Manifest權限申請

插件管理服務類聲明:

權限申請:

基類Hook做了什么?

ProxyHook

ProxyHook繼承自Hook,實現了InvocationHandler接口。它有一個setOldObj()方法,用來保存原始對象。新的代理對象可以看到在代碼中是如何實現的(動態代理)

BaseHookHandle

接上面ProxyHook中的invoke()方法,mHookHandles是一個BaseHookHandle對象,內部包含了一個Map,可以根據API名映射到對應對應的HookedMethodHandler對象。這個Map由其子類IXXXHookHandle在初始化的時候進行填充。

緊接著調用HookedMethodHandler的doHookInner()方法:

HookedMethodHandler

ReplaceCallingPackageHookedMethodHandler

IO重定向

遞歸遍歷

以IPackageManager為例

IPackageManagerHook:Hook所有IPackageManager的方法

IActivityManagerHookHandle:安裝所有被Hook的方法的處理對象,加入到Map中

IPackageManagerHandle.checkSignatures:這是一個內部類,繼承HookedMethodHandler, 專門校驗簽名的。以此,還有各種各樣的PackageManger原生中的方法,在這都變成了一個內部類繼承了HookedMethodHandler.上圖:

IPackageManagerHookHandle:

第一時間獲得博客更新提醒,以及更多android干貨,源碼分析,歡迎關注我的微信公眾號,掃一掃下方二維碼,即可關注。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容