android的hook方面知識點


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的動態庫用何種方式在何時注入,所以也需要采用實時監測。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM