聊聊Xposed檢測

轉:http://www.360doc.com/content/19/0601/18/29401987_839659591.shtml

 

這兩天看到有部分人稱微信大規模封號,主要被封的是Xposed和各類微信插件的使用者,部分人說自己只是安裝了Xposed,但並未使用微信相關的任何插件也被封了。由此有人開始說微信侵犯用戶隱私,隨意掃描用戶的手機等等。

本人一直是Xposed的使用者,主要是用來使用自己寫的扒Android8.1上“吉字節”等單位改回“GB”的插件。另外也有使用修改微信UI以及防撤回的與微信相關的插件,但並未受到此次封號的影響。普通用戶不太清楚開發方面的事,以爲檢測Xposed框架是件很複雜的事,今天就來聊聊Xposed的簡單檢測方法。

檢測

Xposed重寫了zygote,zygote啓動時會加載Xposed相關組件,因此由zygote孵化出來的每個進程都會有Xposed的相關代碼。根據這一原理,我們可以通過以下幾種方式檢測。

Xposed Installer

Xposed利用Xposed Installer這一App安裝Xposed和管理模塊,其包名爲de.robv.android.xposed.installer,檢測這一包名是最簡單直觀的對Xposed檢測的方法。

堆棧信息

拋出一個異常並捕獲,將堆棧信息打印出來。

1
2
3
4
5
6
7
8
// .....省略部分
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:440)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:108)

可以看到每個App是先執行的XposedBridge.jar的main方法,之後再調用的Zygote的main方法。通過檢測堆棧中是否包含Xposed等字樣即可知道是否安裝了Xposed。

maps

Xposed的組件需要被加載,必然在內存空間留下痕跡。通過遍歷/proc/<pid>/maps/proc/self/maps)的內容可以發現如下內容。因此也可以據此來判斷。

1
7de6c41000-7de6c42000 r--s 00019000 b3:18 139265 /system/framework/XposedBridge.jar

更精準的檢測

以上方法只能檢測用戶是否安裝使用了Xposed,這是一個風險點,但我們並不能因爲用戶使用了Xposed就將其封禁。通過Xposed的實現方式,我們可以採取更精準的方式去檢測。

de.robv.android.xposed.XposedBridge中有一個disableHooks字段用於標記對於當前應用是否要進行hook。通過獲取這個字段的值就可以知道是否在我們App上啓用hook了,甚至可以通過將其設置爲true停掉Xposed。

1
2
3
4
5
6
Field disableHooksFiled = ClassLoader.getSystemClassLoader()
        .loadClass("de.robv.android.xposed.XposedBridge")
        .getDeclaredField("disableHooks");
disableHooksFiled.setAccessible(true);
Object enable = disableHooksFiled.get(null);  // 當前狀態
disableHooksFiled.set(null, true);            // 設置爲關閉

另一個更爲精準的方式見這篇文章,Xposed將需要hook的字段、方法、構造函數等緩存在了幾個HashMap中,通過遍歷這幾個看是否有與自己相關的內容就可知道自己是否有被hook了,具體的原理和方法可以看一下這篇文章。

反檢測與反反檢測

上面提到的那些檢測方法實際上都可以被繞過的,hook掉調用的那些檢測方法並返回虛假的信息就可以輕鬆繞過。例如上文提到檢測maps文件,那麼我們可以需要類似下面這樣的僞代碼遍歷maps文件的每一行並判斷是否包含Xposed的相關組件。

1
line.contains("Xposed")

那麼可以hookString.contains方法,如果發現你想判斷的內容包含Xposed等關鍵字就直接返回false即可。

面對這些反檢測的手段,第一我們可以增加檢測的維度,加大繞過檢測的難度,從Java層和C層進行多方面的檢測。第二我們可以設置一些蜜罐,例如面對上面這種反檢測的手段,如果我們調用"Xposed".contains("Xposed")的返回值是false,那必然說明其使用了這種反檢測手段。

結語

攻防真的很無聊。

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