當前位置:編程學習大全網 - 源碼下載 - 如何hook android sdk

如何hook android sdk

1.1 概述Xposed 是 GitHUB 上 rovo89 大大設計的壹個針對 Android 平臺的動態劫持項目,通過替換 /system/bin/app_process 程序控制 zygote 進程,使得 app_process 在啟動過程中會加載 XposedBridge.jar 這個 jar 包,從而完成對系統應用的劫持。Xposed 框架的基本運行環境如下:因為 Xposed 工作原理是在 /system/bin 目錄下替換文件,在 install 的時候需要root 權限,但是運行時不需要 root 權限。需要在 Android 4.0 以上版本的機器中2. GitHub 上的 Xposed 資源梳理壹下,可以這麽分類:XposedBridge.jar : XposedBridge.jar 是 Xposed 提供的 jar 文件,負責在 Native層與 FrameWork 層進行交互。 /system/bin/app_process 進程啟動過程中會加載該jar 包,其它的 Modules 的開發與運行都是基於該 jar 包的。Xposed : Xposed 的 C++ 部分,主要是用來替換 /system/bin/app_process ,並為 XposedBridge 提供 JNI 方法。XposedInstaller : Xposed 的安裝包,負責配置 Xposed 工作的環境並且提供對基於 Xposed 框架的 Modules 的管理。XposedMods :使用 Xposed 開發的壹些 Modules ,其中 AppSettings 是壹個可以進行權限動態管理的應用1.2 Mechanism :原理1.2.1 Zygote在 Android 系統中,應用程序進程都是由 Zygote 進程孵化出來的,而 Zygote 進程是由 Init 進程啟動的。 Zygote 進程在啟動時會創建壹個 Dalvik 虛擬機實例,每當它孵化壹個新的應用程序進程時,都會將這個 Dalvik 虛擬機實例復制到新的應用程序進程裏面去,從而使得每壹個應用程序進程都有壹個獨立的 Dalvik 虛擬機實例。Zygote 進程在啟動的過程中,除了會創建壹個 Dalvik 虛擬機實例之外,還會將 Java運行時庫加載到進程中來,以及註冊壹些 Android 核心類的 JNI 方法來前面創建的 Dalvik 虛擬機實例中去。註意,壹個應用程序進程被 Zygote 進程孵化出來的時候,不僅會獲得 Zygote 進程中的 Dalvik 虛擬機實例拷貝,還會與 Zygote 壹起***享 Java 運行時庫。這也就是可以將XposedBridge 這個 jar 包加載到每壹個 Android 應用程序中的原因。 XposedBridge 有壹個私有的 Native ( JNI )方法 hookMethodNative,這個方法也在 app_process 中使用。這個函數提供壹個方法對象利用 Java 的 Reflection 機制來對內置方法覆寫。具體的實現可以看下文的 Xposed 源代碼分析。1.2.2 Hook/ReplaceXposed 框架中真正起作用的是對方法的 hook 。在 Repackage 技術中,如果要對APK 做修改,則需要修改 Smali 代碼中的指令。而另壹種動態修改指令的技術需要在程序運行時基於匹配搜索來替換 smali 代碼,但因為方法聲明的多樣性與復雜性,這種方法也比較復雜。在 Android 系統啟動的時候, zygote 進程加載 XposedBridge 將所有需要替換的 Method 通過 JNI 方法 hookMethodNative 指向 Native 方法 xposedCallHandler , xposedCallHandler 在轉入 handleHookedMethod 這個 Java 方法執行用戶規定的 Hook Func 。XposedBridge 這個 jar 包含有壹個私有的本地方法: hookMethodNative ,該方法在附加的 app_process 程序中也得到了實現。它將壹個方法對象作為輸入參數(妳可以使用 Java 的反射機制來獲取這個方法)並且改變 Dalvik 虛擬機中對於該方法的定義。它將該方法的類型改變為 native 並且將這個方法的實現鏈接到它的本地的通用類的方法。換言之,當調用那個被 hook 的方法時候,通用的類方法會被調用而不會對調用者有任何的影響。在 hookMethodNative 的實現中,會調用 XposedBridge中的handleHookedMethod這個方法來傳遞參數。 handleHookedMethod 這個方法類似於壹個統壹調度的 Dispatch 例程,其對應的底層的 C++ 函數是 xposedCallHandler 。而 handleHookedMethod 實現裏面會根據壹個全局結構 hookedMethodCallbacks 來選擇相應的 hook函數,並調用他們的 before, after 函數。當多模塊同時 Hook 壹個方法的時候, Xposed 會自動根據 Module 的優先級來排序,調用順序如下:A.before -> B.before -> original method -> B.after -> A.after2 源代碼分析2.1 Cpp 模塊 其文件分類如下:app_main.cpp :類似 AOSP 中的 frameworks/base/cmds/app_process/app_main.cpp,即/system/bin/app_process 這個 zygote 真實身份的應用程序的源代碼。關於zygote 進程的分析可以參照 Android:AOSP&Core 中的 Zygote 進程詳解。xposed.cpp :提供給 app_main.cpp 的調用函數以及 XposedBridge 的 JNI 方法的實現。主要完成初始化工作以及 Framework 層的 Method 的 Hook 操作。xposed.h , xposed_offsets.h :頭文件 Xposed 框架中的 app_main.cpp 相對於 AOSP 的 app_main.cpp 中修改之處主要為區分了調用 runtime.start() 函數的邏輯。 Xposed 框架中的 app_main.cpp 在此處會根據情況選擇是加載 XposedBridge 類還是 ZygoteInit 或者 RuntimeInit 類。而實際的加載 XposedBridge 以及註冊 JNI 方法的操作發生在第四步: xposedOnVmCreated中。1.包含 cutils/properties.h ,主要用於獲取、設置環境變量, xposed.cpp 中需要將XposedBridge 設置到 ClassPath 中。2.包含了 dlfcn.h ,用於對動態鏈接庫的操作。3.包含了 xposed.h ,需要調用 xposed.cpp 中的函數,譬如在虛擬機創建時註冊 JNI 函數。4.增加了 initTypePointers 函數,對於 Android SDK 大於等於 18 的會獲取到 atrace_set_tracing_enabled 函數指針,在 Zygote 啟動時調用。5.AppRuntime 類中的 onVmCreated 函數中增加 xposedOnVmCreated 函數調用。6.源代碼中的 Log* 全部重命名為 ALog*, 所以 Logv 替換為 Alogv ,但是功能不變。7.Main 函數開始處增加了大量的代碼,但是對於 SDK 版本小於 16 的可以不用考慮。2.1.1 Main 函數: zygote 入口int main(int argc, char* const argv[])

  • 上一篇:如何使用自己的makefile編譯android ndk項目
  • 下一篇:UNIX編程藝術的序
  • copyright 2024編程學習大全網