Android hook 技術淺析
前言
xposed框架
xposed,主頁:http://repo.xposed.info/module/de.robv.android.xposed.installer
是個開源的框架,在github上有原始碼的,直接下載apk後安裝啟用就可以使用,很多地方有這方面的教程,針對不同的手機架構,有大牛做了針對性的修改。可以在論壇中進行搜尋
通過替換/system/bin/app_process程式控制zygote程式,使得app_process在啟動過程中會載入XposedBridge.jar這個jar包,從而完成對Zygote程式及其建立的Dalvik虛擬機器的劫持。
Xposed在開機的時候完成對所有的Hook Function的劫持,在原Function執行的前後加上自定義程式碼。
很多人將這個框架用在對android的私有化定製上面,其實在android安全測試方面這個框架提供了很大的便利,xposed主要是對方法的hook,在以往的重打包技術中,需要對smali程式碼的進行修改,修改起來比較麻煩。
利用xposed框架可以很容易的獲取到android應用中的資訊,比如加密私鑰、salt值等等,不需要飯編譯獲取金鑰轉換演算法、不需要了解金鑰儲存機制,直接hook函式,獲取輸入輸出就可以。
原理
在Android系統中,應用程式程式都是由Zygote程式孵化出來的,而Zygote程式是由Init程式啟動的。Zygote程式在啟動時會建立一個Dalvik虛擬機器例項,每當它孵化一個新的應用程式程式時,都會將這個Dalvik虛擬機器例項複製到新的應用程式程式裡面去,從而使得每一個應用程式程式都有一個獨立的Dalvik虛擬機器例項。這也是Xposed選擇替換app_process的原因。
Zygote程式在啟動的過程中,除了會建立一個Dalvik虛擬機器例項之外,還會將Java執行時庫載入到程式中來,以及註冊一些Android核心類的JNI方法來前面建立的Dalvik虛擬機器例項中去。注意,一個應用程式程式被Zygote程式孵化出來的時候,不僅會獲得Zygote程式中的Dalvik虛擬機器例項拷貝,還會與Zygote一起共享Java執行時庫。這也就是可以將XposedBridge這個jar包載入到每一個Android應用程式中的原因。XposedBridge有一個私有的Native(JNI)方法hookMethodNative,這個方法也在app_process中使用。這個函式提供一個方法物件利用Java的Reflection機制來對內建方法覆寫。有能力的可以針對xposed的原始碼進行分析,不得不說,作者對於android的機制和java的瞭解已經相當深入了。
簡單例項
很簡單的一個android登入程式碼:
很簡單的就是判斷下使用者輸入的使用者名稱和密碼是正確,這裡做個簡單的演示,將使用者輸入的使用者名稱和密碼資訊hook出來不管正確與否
簡單說下xposed模組的開發,首先需要的是匯入api,具體的可以參考:https://github.com/rovo89/XposedBridge/wiki/Using-the-Xposed-Framework-API
在manifest中定義
宣告這個是xposed模組,名稱為hook test 並且使用api版本號是82
下面建立執行時候的hook程式碼:
看程式碼中的註釋,主要是三個方法的呼叫,handleLoadPackage,主要是獲取到android包的相關資訊,這裡由於只是對logintest進行hook,做下簡單的判斷。
findAndHookMethod 是主要的hook入口,裡面幾個引數分別為包名,classloader,hook的函式名,引數型別(這個比較容易出錯,比如list型別寫為List.class),回撥函式
回撥函式中比較重要的:beforeHookedMethod和afterHookedMethod,一個是在函式執行前劫持掉,一個是hook後放行,例項中對使用者輸入的欄位進行劫持列印,後面將引數之改為正確登入使用者名稱和密碼,這樣在app中輸入任何字元都能登入成功
frida Hook框架
Frida是一款基於python + javascript 的hook框架,通殺android\ios\linux\win\osx等各平臺,由於是基於指令碼的互動,因此相比xposed和substrace cydia更加便捷,本文重點介紹Frida在android下面的使用。
Frida的官網為:http://www.frida.re/
安裝
安裝Frida非常簡單,在pc端直接執行
pip install frida
即可
在Android裝置需要匯入frida的服務端,需要root你的手機
執行
裝置上執行frida-server:
電腦上執行adb forward tcp轉發:
27042埠用於與frida-server通訊,之後的每個埠對應每個注入的程式。
執行如下命令驗證是否成功安裝:
$ frida-ps-R
正常情況應該輸出程式列表如下:
Hook模組的編寫
hook的主要模組是js編寫的,利用javascript的api與server進行通訊
下面結合一個真例項子進行簡單的介紹,首先是測試程式碼:
反編譯獲取app中的核心函式
對於上面的js程式碼,其實就是呼叫app中的某個函式,比如sign值生成函式,加密解密函式,不需要自己單獨的去分析演算法流程,分析key值在哪,直接呼叫app的相應函式,讓app幫我們完成這些工作。
這裡我們分析的app是友寶,這是一款飲料售貨機,當時抓包看到提貨的時候是隻有個訂單id的,猜想是不是遍歷訂單的id,支付成功但是沒有取貨的訂單會不會響應請求,自己掉貨出來。
下面對友寶的訂單進行分析過程
1.抓取支付訂單成功連結
分析:
sign是校驗值,主要是防止訂單偽造的,orderid是產生的支付訂單id,這個主要是防止偽造用
2.反編譯友寶app
找到morder/shipping所在的包為:com/ub/main/d/e.class
其中localStringBuffer儲存的就是url中的引數資訊,該請求查詢到的程式碼在a()
生成簽名的函式在com/ub/main/d/e.class中的b函式
最後加上sign值,傳送請求
3.可以反編譯出他的sign計算方法,也可以直接呼叫b函式來產生sign值,後來發現app會自動取時間戳,我們就不需要給他array型的引數
直接呼叫a函式,把orderId給他,讓他直接return一個值出來就好了,就有了上面的js程式碼
4. 自動化的批量處理
看程式碼
構造了一個類,後面直接fuzz uid就可以了,提取裡面的sign值拼接到post資料中去。
可以產生的post請求和抓到的資料包的請求是完全一樣的,但是並沒有測試成功,分析原因有可能是訂單id和使用者的id有所繫結。
不過學習到了怎樣通過frida對app進行分析。
複雜引數的hook
如果遇到函式的引數型別是陣列、map、ArrayList型別的,首先目標MyClass類的fun1函式,宣告如下:
解決方法:
用Xposed自身提供的XposedHelpers的findClass方法載入每一個類,然後再將得到的類傳遞給hook函式作引數!
具體實現可參考連結,大牛講的很清楚。
參考連結
https://xianzhi.aliyun.com/forum/read/611.html
http://www.freebuf.com/articles/terminal/56453.html
http://bbs.pediy.com/showthread.php?t=202147&page=2
相關文章
- Android技術分享| Context淺析AndroidContext
- GraphQL 技術淺析
- 淺析蜜罐技術
- 淺談API HOOK技術(一) (轉)APIHook
- 淺談API HOOK技術(二) (轉)APIHook
- 爬蟲技術淺析爬蟲
- Libco Hook 機制淺析Hook
- 愛奇藝 Android PLT hook 技術分享AndroidHook
- 淺析寬頻接入技術
- 淺析Java Web框架技術JavaWeb框架
- Hook技術之Hook ActivityHook
- TSDB - VictoriaMetrics 技術原理淺析
- RPO攻擊技術淺析
- Android應用方法隱藏及反除錯技術淺析Android除錯
- Linux零複製技術淺析Linux
- 技術分享 | MySQL : SSL 連線淺析MySql
- 資料交換利器 Protobuf 技術淺析
- 三維模型調色技術淺析模型
- [專業術語]淺析當代 LBS 技術
- Android日常學習:Android Hook技術小實踐AndroidHook
- 淺析三維模型輕量化技術方法模型
- 雲端高效能技術架構淺析架構
- Android框架淺析Android框架
- 深度學習技術發展趨勢淺析深度學習
- 淺析Linux中的零拷貝技術Linux
- ip cef 命令介紹及CEF技術淺析
- Android so注入(inject)和Hook技術學習(二)——GAndroidHook
- Android免清單註冊啟動Activity Hook技術AndroidHook
- 搞懂分散式技術17:淺析分散式事務分散式
- 淺析人臉識別技術應用場景
- 淺析GPU通訊技術(上)-GPUDirectP2PGPU
- “懶”的妙用——淺析圖片懶載入技術
- 淺析Android外掛化Android
- Android Binder機制淺析Android
- 【Android原始碼】PackageManagerService 淺析Android原始碼Package
- 【Android原始碼】WindowManagerService 淺析Android原始碼
- Android 淺析 RxJava (一) 使用AndroidRxJava
- APK檔案淺析-AndroidAPKAndroid