native層hook---理解ELF文件java
java層---虛擬機特性和Java上的反射的做用android
存放在哪?框架
用mmap函數分配臨時內存來完成代碼存放,對於函數的尋找須要用到目標地址空間解析和ELF解析函數
如何注入?工具
用ptrace函數attach上目標進程插件
發現裝載共享庫so函數設計
裝載指定的.soxml
讓目標進程的執行流程跳轉到注入的代碼執行對象
使用ptrace函數的detach釋放咪表進程繼承
如何附着在目標進程?---內核函數ptrace可以動態attach、detach、peektext(獲取內存字節)、poketext(向內存寫入地址)
如何讓目標進程調用動態連接庫函數?---內核函數dlopen,可以以制定模式打開指定動態連接庫文件。
對於android的so文件的hook根據ELF文件特性分爲:Got表hook、Sym表hook和inline hook等
Xposed框架;
CydiaSubstrate框架;
ADBI/DDI框架。
這些工具使用流程:配置環境、安裝本地服務、下載使用庫。
handleLoadPackage獲取包加載時的回調並拿到其對應的classLoader
findAndLoadHookMethod對指定類的方法進行hook
MS.hookClassLoad 拿到指定class載入時的通知
MS.hookMethod 使用一個Java方法去替換另外一個Java方法
MS.moveUnderClassLoader 使用不一樣的ClassLoader重載對象
一、在AndroidManifest.xml文件中配置主入口
二、新建立主入口Main.Java類
三、hook系統的resources,hook對應的方法
四、安裝、重啓、驗證
經過hook指定的Activity中的onCreate方法來啓動一個廣告的activity
在惡意設計中,能夠將廣告的activity設置成惡意的activity做爲釣魚activity。
一、在AndroidManifest.xml文件中配置插件名稱與Api版本號
二、新建立一個入口類繼承並實現IXposedHookLoadPackage接口
三、聲明主入口路徑
四、使用findAndLoadHookMethod方法hook劫持登陸信息
五、在XposedInstaller中啓動自定義的模塊
六、重啓驗證去
框架:Cydiasubstrate
函數:MSGetImageByName、MSFindSymbol、MSHookFunction
步驟:
一、在androidmanifest中聲明權限和安裝方式--安裝方式internalOnly和hasCode=「false」
二、新建立項目的cpp文件,導入所需的庫
三、載入配置文件和cydiasubtract入口
四、hook並替換其方法
五、編譯、安裝、重啓驗證
hook的本質:在一個目標進程中經過改變函數方法的指向地址,加入一段自定義的代碼塊
java層的hook檢測:用ps命令查找進程id--用cat/proc……命令查找地址空間中對應的dex文件是否由對應進程(系統)提供。
原生層hook檢測 :相似java層。對於應用程序自身檢測,只須要讀取對應進程的虛擬地址空間目錄/proc/pid/maps文件, 判斷當前進程空間中載入的代碼庫文件是否存在於本身的白名單中
hook過的程序修復:因爲全部的第三方庫都是經過dlopen注入的方式添加到進程中,因此咱們只須要經過dlclose把對應的第三方函數按個刪除。
可是dlclose函數並不能把全部函數徹底刪除,由於dlclose關閉指定句柄的動態連接庫,只有當對應動態連接庫使用次數爲0時才能被系統卸載。
因爲沒法知曉hook的動態庫用何種方式在什麼時候注入,因此也須要採用實時監測。