一句話歸納本文java
分析定位排查下廚房APP檢測手機是否安裝了Xposed框架的方法,而後一步步 Hook掉對應代碼,以此去掉噁心的重複彈出警告對話框。python
引言git
由於有帶飯的習慣,每週上班前的一天都會想好這周要作的菜式,而後京東 到家採購一波食材。昨天下午當我習慣性地打開下廚房,而後:github
每打開一個新的頁面就彈一次對話框,哇,是真的煩!我TMwindows
你說我Hook了下廚房,這樣整我沒話說,可是我只是裝Xposed只是Hook 一下微信,這就很煩啦,行行行,那我只能也Hook下下廚房咯,就Hook掉你檢測 是否安裝了Xposed方法總行了吧!因而有了這篇文章~數組
先定位一波方法咯,接上手機,打開 monitor ,新版的AS貌似連入口都 隱藏了,你須要到 sdk的tools目錄 下找下,windows下的是 monitor.bat微信
先獲取一波下廚房的包名:com.xiachufang框架
接着找到對應的進程:ide
第一個就不用說了,接着跟蹤一波方法調用,點入下一個頁面彈出 Xposed提示對話框,點擊肯定後爲止:工具
接着搜索:xposed
逐個排除,不難定位到(包名):
這個 XposedDetectionUtil 類十有八九就是判斷是否安裝了Xposed 的工具類了,接着用Jadx反編譯工具,反編譯一波apk,接着用AS打開 反編譯後的工程! (PS:多是採用了加固或者什麼手段,不是全部代碼都能正確反編譯 出來的!!!)
反編譯後的項目結構以下:
呃...,有點太過於耿直了吧,類名啥的也不混淆一下... 打開XposedDetectionUtil類,代碼以下:
sXposedInstalled和 isXposedInstalled()方法,初步猜想前者是一個標記, 默認true,表明手機裝了xposed,應該是在進行程序的時候經過一些邏輯判斷後 去修改這個標誌變量,而後Activity基類進入前先獲取這個變量,而後決定是否 彈出Xposed警告對話框。
得出最簡單的hook方法就是直接把這個變量的值修改成true。寫代碼試試~
代碼很是簡單,修改權限,而後設置下標誌位爲true
模塊安裝上,重啓下,接着打開下廚房,可是程序卻意外閃退了,看下Log:
校驗錯誤異常?猜想是在錯誤的位置修改了本地寄存器的變量, 要另外去折騰smali,腦袋疼(反編譯與逆向分析java.lang.VerifyError總結) 放棄改變量這個套路了,得從另外一個入手點切入。
接下來看下下面的這段代碼:
這裏要注意,靜態代碼塊 和 靜態變量 的初始化都發生在類裝載 的時候,級別是相同的,會按照代碼順序進行初始化。
這段代碼是檢驗手機是否安裝了xposed的一個套路之一,邏輯是:
當 XposedDetectionUtil 類被調用時,加載,而後顯式拋出一個異常, 而後catch這個異常,經過e.getStackTrace得到一個異常調用的堆棧信息, 而後遍歷這個堆棧,若是出現了包含XposedBridge的類名或者方法,就說明 用戶的手機安裝了xposed。
這裏其實有個小疑問,爲什麼if裏沒有代碼,是由於反編譯沒有得到完整代碼, 仍是這樣作就能夠了,有知道的看官能夠告知下!!!
看到這裏,應該基本會想到一個套路:Hook掉getStackTrace()方法 點進去看下這個方法的具體詳情:
看完以後,很容易Get到幾個點:
思路又有了,寫一波代碼~
這裏要吐槽一波Kotlin,getStackTrace方法返回的是數組嘛,須要用 as Array<StackTraceElement>
強轉一波,而後呢,Array類裏只有 幾個寒磣的方法:
2333,對的,沒有移除元素的方法,So,須要借用另外一個可變的容器來裝, 因而要建立一個可變列表,mutableListOf<StackTraceElement>()
, 而後遍歷這個數組,把不包含XposedBridge的類和方法裝到裏面, 遍歷完之後,還須要把這個可變集合再強轉一波:toArray<StackTraceElement>()
而後重置下返回的結果。
因此有了這樣的一串代碼:
運行下重啓手機,打開下廚房,檢驗下效果:
同時看下Logcat打印的日誌信息:
到此就Hook完成了,抱歉,Xposed真的能夠隨心所欲。
由於下廚房一直彈安裝了Xposed的警告,因此有了這篇文章。 檢測是否安裝了Xposed能夠不止這種套路,更多的能夠翻閱: Android Java 層的anti-Hook 技巧.md,不要有期待, 依舊是隨緣更新,謝謝~
附:Hook部分代碼(均可以在:github.com/coder-pig/C… 找到):
object XiaChuFangHook{
fun hook(lpparam: XC_LoadPackage.LoadPackageParam) {
findAndHookMethod("java.lang.Throwable", lpparam.classLoader, "getStackTrace", object : XC_MethodHook() {
override fun afterHookedMethod(param: MethodHookParam) {
val result = mutableListOf<StackTraceElement>()
for (stackTraceElement in (param.result as Array<StackTraceElement>)) {
val className = stackTraceElement.className
val methodName = stackTraceElement.methodName
if(className != null && methodName != null) {
if(!className.contains("XposedBridge") && !methodName.contains("XposedBridge")) {
result.add(stackTraceElement)
}
}
}
param.result = toArray<StackTraceElement>(result)
super.afterHookedMethod(param)
}
})
}
}
複製代碼
來啊,Py交易啊
想加羣一塊兒學習Py的能夠加下,智障機器人小Pig,驗證信息裏包含: Python,python,py,Py,加羣,交易,屁眼 中的一個關鍵詞便可經過;
驗證經過後回覆 加羣 便可得到加羣連接(不要把機器人玩壞了!!!)~~~ 歡迎各類像我同樣的Py初學者,Py大神加入,一塊兒愉快地交流學♂習,van♂轉py。