在逆向分析android App過程當中,咱們時經常使用的用的Java層hook框架就是Xposed Hook框架了。一些應用程序廠商爲了保護自家android App不被Xposed Hook框架給hook。因而想盡各類方法檢測本身產品是否被Xposed Hook給Hook。筆者最近逆向分析阿里系的產品,發現阿里系的產品可以檢測自否給Xposed Hook了。本文就帶領給位一塊兒看看官阿里系產品是如何作的這一點的,本文就選擇阿里的支付寶做爲咱們分析對象。html
1. 編寫一個簡單的支付寶的Xposed hook 模塊, 模塊代碼以下:java
2.安裝XPosed hook mo模塊,重啓設備,打開支付寶,就會看到以下一個對話框:非法操做的,你的手機不安全。這說明支付寶檢測本身被Hook了。android
0.分析工具和分析對象git
樣本:Alipay_wap_main_10.0.18 github
工具:AndroidKiller, JEB2.2.7緩存
源碼:XPosed 框架源碼安全
1. 爲了快速找到代碼Xposed的檢測代碼位置,咱們就不從對話框做爲分析入口啦,咱們直接使用androidKiller打開文件Alipay_wap_main_10.0.18.apk, 而後在工程中搜索xposed相關的關鍵字,例如:xposed框架
根據搜索結果,咱們找到看了兩個security相關的類。咱們使用JEB工具對這兩個類進行分析,咱們暫且分析CheckInject類。函數
咱們看到這裏得到經過反射得到一個類de.robv.android.xposed.XposedHelpers 的一個對象,因而咱們能夠確認發現代碼就這裏。 工具
3. 因爲Smali代碼是通過混淆的代碼,不便於讀者閱讀,因而筆者將代碼整理以下:
經過反射獲取de.robv.android.xposed.XposedHelpers類的一個對象obXposedHelper,而後調用CheckKeywordInFiled 檢測obXposedHelper成員fieldCache,methodCache,constructorCache是否有支付寶包的關鍵字,CheckInject.CheckKeywordInFiled, 這個函數代碼 。筆者也這個函數整理以下:
fieldCache, methodCache,constructorCache然是XposedHelpers的靜態成員,類型是HashMap<String, Field>
經過反射遍歷這些HashMap 緩存字段, 如字段項的key中包含支付寶的關鍵字"alipy" "taobao",等信息, 者認爲是檢測有Xposed 注入
4.咱們來繼續分析Xposed hook框架是如何將hook信息存儲到fieldCache,methodCache,constructorCache這些緩存字段當中的(咱們須要下載XPosed 源碼分析,github有下載)。咱們最一般調用findAndHookMethod 函數hook一個函數, 因此咱們分析這個函數,函數代碼以下:
這個函數咱們暫時還沒法看到存儲相關的代碼,這個主要實現依賴函數findMethodExact, 因而咱們繼續分析
咱們發現 methodCache.put(fullMethodName, e); 將方法名和方法Method 存儲在方法緩存中嗎。
5.CheckInject類類中除了有XPosed 檢測, 還有SO注入檢測機制的代碼和手機檢測是否Root的代碼。筆者也將這些代碼整理分享給各位看官:
● Root檢測代碼以下
檢測依據是:獲取default.prop 中文件ro.secure的值1 且 /system/bin/ 或者/system/xbin 有su程序可認定程序被root了
● So注入檢測
因爲實現比較簡單,就不貼代碼,直接闡述原理吧。SO注入檢測原理:讀取當前進程的maps文件, 遍歷每一行, 是否進程中使用so名中包含關鍵"hack|inject|hook|call" 的信息,「hack|inject|hook|call」 字符信息使用Base64加密, 以下:
結論:
1.支付寶的Xposed hook 檢測原理: Xposed Hook 框架將Hook信息存儲在fieldCache, methodCache,constructorCache 中, 利用java 反射機制獲取這些信息,檢測Hook信息中是否含有支付寶App中敏感的方法,字段,構造方法。
2.支付寶的SO檢測原理: 檢測進程中使用so名中包含關鍵"hack|inject|hook|call" 的信息。
3.支付寶的Root檢測: 是否含有su程序和ro.secure是否爲1
安全建議:
像這些 "de.robv.android.xposed.XposedHelpers","fieldCache","methodCache","constructorCache" 想這些敏感字符串信息能夠進行一些簡單加密。防止用戶直接根據關鍵字搜索找到關鍵函數。
同時對dex相關內容進行加密,DEX加密以後反編譯的難度大大增長,這裏支持下朋友公司幾維安全的APK加密產品,歡迎你們體驗他們的移動加密產品 http://www.kiwisec.com/product/compiler.shtml