抱歉,Xposed真的可以爲所欲爲——5.我自己刷的Xposed憑什麼不給我用

抱歉,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
映入眼簾的入手點:

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部分代碼(都可以在: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,驗證信息裏包含:
PythonpythonpyPy加羣交易屁眼 中的一個關鍵詞即可通過;

驗證通過後回覆 加羣 即可獲得加羣鏈接(不要把機器人玩壞了!!!)~~~
歡迎各種像我一樣的Py初學者,Py大神加入,一起愉快地交流學♂習,van♂轉py。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章