由於很多APP開始針對XP做對應的檢測如微信 支付寶 釘釘等 所以使用定製化的方式隱藏框架
常見檢測方法
一. 由於Xposed的hook,是通過so修改被hook的方法爲native來實現的,所以檢測方也可以通過檢測方法是否變成了native來達到檢測的目的 Throwable.class.getDeclaredMethod(“getStackTrace” 是否Nativ方法
二. StackTraceElement getClassName 檢測是否存在 de.robv.android.xposed. com.android.internal.os.ZygoteInit com.saurik.substrate. getMethodName檢測 handleHookedMethod main invoked
三. 檢查XposedHelper的成員fieldCache,methodCache,constructorCache
四. 檢查xposed的文件
五. 檢查 安裝包
六. 檢查 /system/lib 是否有xposed文件 /system/lib/libxposed_art.so /system/lib64/libxposed_art.so
七. 檢查 /system/framework/XposedBridge.jar
八. 通過 代碼拋出一個異常,在堆棧中檢查是否含有 de.robv.android.xposed.XposedBridge 之類的
檢查com.android.internal.os.ZygoteInit 是否出現了兩次
九. 檢查環境變量CLSAAPATH=/system/framework/XposdedBridge.jar
十. 檢查 /proc/self/maps 通過讀取 shell 命令 /proc/pid(應用進程id)/maps 可以拿到當前上下文的so和jar列表,查找Xposed相關
十一. 通過loadClass 檢測 de.robv.android.xposed.XposedHelpers de.robv.android.xposed.XposedBridge
幾種隱藏方案
1 java層檢測XP特徵值 可以根據應用獲取XP特質值的方法定製HOOK修改隱藏 或者通用性HOOK代碼解決 但只限於Java層 so中讀取Xp文件就無效了
2 so 層檢測如果能逆向代碼在java層中找到上傳的方法 也可以HOOK形式隱藏 缺點每個APP都得找而且檢測代碼一變就得改 及其不靈活
3 定製化XP框架 修改所有特徵值也可以達到隱藏的目的
定製Xp是最好的解決辦法 網絡有一些相關資料 但都沒有乾貨或者不全 網上暴露出來的基本上只教了XposedInstall XposedBridge的修改 在往下native層 Xposdtools 的修改資料幾乎沒有或者說跟沒有差不多 所以有了這篇文章
在開始之前你必須去按照這篇博客 點這裏 這個也行 先去編譯android源碼之後編譯下官方的Xp (坑很多 要配的環境非常多 要有足夠的耐心 )
上一步完成後就可以開始進行對應的修改
1 XposedInstaller.apk
負責安裝Xp環境 其實就是下載與手機cpu架構SDK對應的zip 然後刷入手機和管理模塊
環境 androidstudio 網絡對應的資料都有我就隨便寫寫
包名 隨便改一個 AS直接改就行
名稱 隨便改一個
XposedApp.java | 修改 |
---|---|
BASE_DIR_LEGACY | /data/data/ 修改後的包名 |
BASE_DIR | data/user_de/0/ 修改後的包名 |
XPOSED_PROP_FILES | /su/xposed/XP的配置文件.prop 隨便改個名字 |
2 XposedBridge-art.jar
給開發者提供對應的API支持 底層實現 jni調用libxposed-art.so 的native方法
環境 androidstudio 網絡也有資料隨便寫寫
原始包名:de.robv.android.xposed 隨便改一個
原始名稱:XposedBridge.jar 隨便改一個
XposedInit.java | 修改 |
---|---|
INSTALLER_PACKAGE_NAME | 改成你上面修改的APK包名 |
3 Xposed
給Xpbridge提供API支持和調用了很多android-art的方法以及最重要的替換android zygote(app_process)
libxposed_common.h | 改成你修改後的XposedBridge包名 |
---|---|
CLASS_XPOSED_BRIDGE | 更改前: |
CLASS_ZYGOTE_SERVICE | 更改前: |
CLASS_FILE_RESULT | 更改前: |
xposed.h | 修改 |
---|---|
XPOSED_PROP_FILE | /system/Xp的配置文件.prop 改成你之前APK時候改的 |
XPOSED_JAR | /system/framework/開發者jar包名稱.jar |
XPOSED_LIB_ART | libxposed_art.so 隨便改個名字如 libtest_art.so |
XPOSED_CLASS_DOTS_ZYGOTE | |
XPOSED_CLASS_DOTS_TOOLS |
xposed_service.cpp | 改成你修改後的XposedBridge包名 |
---|---|
IMPLEMENT_META_INTERFACE | 更改前: |
xposed_shared.h | 改成你修改後的APK包名 |
---|---|
XPOSED_DIR | 更改前: /data/user_de/0/ |
XPOSED_DIR | 更改前: /data/data/ |
ART.mk libxposed_art.cpp | 修改成你定義的AS右鍵直接改名稱 記得把.mk文件裏的也改了 |
---|---|
libxposed_art | libtest_art.so |
4 Xposed-Tools
Xp框架的編譯器 打包出可以刷機的zip 以下兩個是打包腳本和刷機包腳本文件內容改成你對應的就好了 這點網上根本沒有資料 全靠自己一個文件一個文件看巨坑
如果有源碼不準備刷機安裝Xp單獨改buid.pl就好了
flash-script.sh不改刷機就會報錯 缺少xpsoed.prop
build.pl flash-script.sh | 改成你修改後的XposedBridge包名 |
---|---|
xposed.prop | 修改成你定義的XP配置文件 |
XposedBridge.jar | 修改成你定義的開發者jar文件名稱 |
libxposed_art | 修改成你定義的so名稱 libtest_art |
思維導圖
5 編譯與運行
把Xposed項目複製到android源碼/frameworks/base/cmds 下
在去下載與你編譯的android源碼對應的xpsoed版ART 進行替換
xposedtools 開始編譯 靜靜等待就好了 我這裏編譯了 android5.1 android 6.1 arm arm64 x86手機可用的刷機包
數據線連接手機把對應的刷機包push到手機裏 adb reboot recovery 選擇刷機包安裝即可 手機重啓收即可看到
注意要使用定製版本的Xp 項目裏的jar包一定得是你定製後的其他不用動
總結
在做之前認真複習了一遍zygote和Xposed框架的源碼 由於網上資料過少經歷了不少坑 很多都是自己摸索出來了 我覺得應該有不少人有這種需求所以寫了這篇文章 希望能夠幫助到你 有什麼問題可以私信我