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