android的hook方面知識點

android hook分爲另種:

native層hook---理解ELF文件java

java層---虛擬機特性和Java上的反射的做用android

注入代碼:

存放在哪?框架

用mmap函數分配臨時內存來完成代碼存放,對於函數的尋找須要用到目標地址空間解析和ELF解析函數

如何注入?工具

用ptrace函數attach上目標進程插件

發現裝載共享庫so函數設計

裝載指定的.soxml

讓目標進程的執行流程跳轉到注入的代碼執行對象

使用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:

一、在AndroidManifest.xml文件中配置主入口

二、新建立主入口Main.Java類

三、hook系統的resources,hook對應的方法

四、安裝、重啓、驗證

注入廣告:

經過hook指定的Activity中的onCreate方法來啓動一個廣告的activity

在惡意設計中,能夠將廣告的activity設置成惡意的activity做爲釣魚activity。

使用Xposed進行hook步驟:

一、在AndroidManifest.xml文件中配置插件名稱與Api版本號

二、新建立一個入口類繼承並實現IXposedHookLoadPackage接口

三、聲明主入口路徑

四、使用findAndLoadHookMethod方法hook劫持登陸信息

五、在XposedInstaller中啓動自定義的模塊

六、重啓驗證去

原生程序hook:

框架:Cydiasubstrate

函數:MSGetImageByName、MSFindSymbol、MSHookFunction

步驟:

一、在androidmanifest中聲明權限和安裝方式--安裝方式internalOnly和hasCode=「false」

二、新建立項目的cpp文件,導入所需的庫

三、載入配置文件和cydiasubtract入口

四、hook並替換其方法

五、編譯、安裝、重啓驗證

hook檢測和修復:

hook的本質:在一個目標進程中經過改變函數方法的指向地址,加入一段自定義的代碼塊

java層的hook檢測:用ps命令查找進程id--用cat/proc……命令查找地址空間中對應的dex文件是否由對應進程(系統)提供。

原生層hook檢測 :相似java層。對於應用程序自身檢測,只須要讀取對應進程的虛擬地址空間目錄/proc/pid/maps文件, 判斷當前進程空間中載入的代碼庫文件是否存在於本身的白名單中

hook過的程序修復:因爲全部的第三方庫都是經過dlopen注入的方式添加到進程中,因此咱們只須要經過dlclose把對應的第三方函數按個刪除。

可是dlclose函數並不能把全部函數徹底刪除,由於dlclose關閉指定句柄的動態連接庫,只有當對應動態連接庫使用次數爲0時才能被系統卸載。

因爲沒法知曉hook的動態庫用何種方式在什麼時候注入,因此也須要採用實時監測。

相關文章
相關標籤/搜索