抱歉,Xposed真的能夠隨心所欲——5.我本身刷的Xposed憑什麼不給我用

一句話歸納本文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類,代碼以下:

z 映入眼簾的入手點:

sXposedInstalledisXposedInstalled()方法,初步猜想前者是一個標記, 默認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部分代碼(均可以在: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,驗證信息裏包含: PythonpythonpyPy加羣交易屁眼 中的一個關鍵詞便可經過;

驗證經過後回覆 加羣 便可得到加羣連接(不要把機器人玩壞了!!!)~~~ 歡迎各類像我同樣的Py初學者,Py大神加入,一塊兒愉快地交流學♂習,van♂轉py。

相關文章
相關標籤/搜索