抱歉,Xposed真的可以爲所欲爲——5.我自己刷的Xposed憑什麼不給我用
標籤: 2018
一句話概括本文
分析定位排查下廚房APP檢測手機是否安裝了Xposed框架的方法,然後一步步
Hook掉對應代碼,以此去掉噁心的重複彈出警告對話框。
引言
因爲有帶飯的習慣,每週上班前的一天都會想好這周要做的菜式,然後京東
到家採購一波食材。昨天下午當我習慣性地打開下廚房,然後:
每打開一個新的頁面就彈一次對話框,哇,是真的煩!我TM
你說我Hook了下廚房,這樣整我沒話說,但是我只是裝Xposed只是Hook
一下微信,這就很煩啦,行行行,那我只能也Hook下下廚房咯,就Hook掉你檢測
是否安裝了Xposed方法總行了吧!於是有了這篇文章~
胡亂分析
先定位一波方法咯,接上手機,打開 monitor ,新版的AS貌似連入口都
隱藏了,你需要到 sdk的tools目錄 下找下,windows下的是 monitor.bat
先獲取一波下廚房的包名:com.xiachufang
接着找到對應的進程:
第一個就不用說了,接着跟蹤一波方法調用,點入下一個頁面彈出
Xposed提示對話框,點擊確定後爲止:
接着搜索:xposed
逐個排除,不難定位到(包名):
這個 XposedDetectionUtil 類十有八九就是判斷是否安裝了Xposed
的工具類了,接着用Jadx反編譯工具,反編譯一波apk,接着用AS打開
反編譯後的工程!
(PS:可能是採用了加固或者什麼手段,不是所有代碼都能正確反編譯
出來的!!!)
反編譯後的項目結構如下:
呃…,有點太過於耿直了吧,類名啥的也不混淆一下…
打開XposedDetectionUtil類,代碼如下:
z
映入眼簾的入手點:
sXposedInstalled和 isXposedInstalled()方法,初步猜測前者是一個標記,
默認true,代表手機裝了xposed,應該是在進行程序的時候通過一些邏輯判斷後
去修改這個標誌變量,然後Activity基類進入前先獲取這個變量,然後決定是否
彈出Xposed警告對話框。
得出最簡單的hook方法就是直接把這個變量的值修改爲true。寫代碼試試~
Hook標誌位靜態變量
代碼非常簡單,修改權限,然後設置下標誌位爲true
模塊安裝上,重啓下,接着打開下廚房,但是程序卻意外閃退了,看下Log:
校驗錯誤異常?猜測是在錯誤的位置修改了本地寄存器的變量,
要另外去折騰smali,腦殼疼(反編譯與逆向分析java.lang.VerifyError總結)
放棄改變量這個套路了,得從另一個入手點切入。
繼續胡亂分析
接下來看下下面的這段代碼:
這裏要注意,靜態代碼塊 和 靜態變量 的初始化都發生在類裝載
的時候,級別是相同的,會按照代碼順序進行初始化。
這段代碼是檢驗手機是否安裝了xposed的一個套路之一,邏輯是:
當 XposedDetectionUtil 類被調用時,加載,然後顯式拋出一個異常,
然後catch這個異常,通過e.getStackTrace獲得一個異常調用的堆棧信息,
然後遍歷這個堆棧,如果出現了包含XposedBridge的類名或者方法,就說明
用戶的手機安裝了xposed。
這裏其實有個小疑問,爲何if裏沒有代碼,是因爲反編譯沒有獲得完整代碼,
還是這樣做就可以了,有知道的看官可以告知下!!!
看到這裏,應該基本會想到一個套路:Hook掉getStackTrace()方法
點進去看下這個方法的具體詳情:
看完之後,很容易Get到幾個點:
- 1.Hook的完整類名是:java.lang.Throwable
- 2.Hook的方法是:getStackTrace,該方法返回的是StackTraceElement[]
- 3.只需要過濾一波返回值,去掉包含XposedBridge的類名或者方法然後重置下即可。
思路又有了,寫一波代碼~
Hook getStackTrace方法
這裏要吐槽一波Kotlin,getStackTrace方法返回的是數組嘛,需要用
as Array<StackTraceElement>
強轉一波,然後呢,Array類裏只有
幾個寒磣的方法:
2333,對的,沒有移除元素的方法,So,需要借用另一個可變的容器來裝,
於是要創建一個可變列表,mutableListOf<StackTraceElement>()
,
然後遍歷這個數組,把不包含XposedBridge的類和方法裝到裏面,
遍歷完以後,還需要把這個可變集合再強轉一波:toArray<StackTraceElement>()
然後重置下返回的結果。
所以有了這樣的一串代碼:
運行下重啓手機,打開下廚房,檢驗下效果:
同時看下Logcat打印的日誌信息:
到此就Hook完成了,抱歉,Xposed真的可以爲所欲爲。
小結
因爲下廚房一直彈安裝了Xposed的警告,所以有了這篇文章。
檢測是否安裝了Xposed可以不止這種套路,更多的可以翻閱:
Android Java 層的anti-Hook 技巧.md,不要有期待,
依舊是隨緣更新,謝謝~
附:Hook部分代碼(都可以在:https://github.com/coder-pig/CPWechatXposed 找到):
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。