這兩天看到有部分人稱微信大規模封號,主要被封的是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,那必然說明其使用了這種反檢測手段。
結語
攻防真的很無聊。
|