定製Xposed框架(乾貨)

由於很多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 更改前: de/robv/android/xposed /XposedBridge
CLASS_ZYGOTE_SERVICE 更改前:de/robv/android/xposed /services/ZygoteService
CLASS_FILE_RESULT 更改前:de/robv/android/xposed /services/FileResult
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 de.robv.android.xposed .XposedBridge 改成你之前定義的包名
XPOSED_CLASS_DOTS_TOOLS de.robv.android.xposed. XposedBridge$ToolEntryPoint
xposed_service.cpp 改成你修改後的XposedBridge包名
IMPLEMENT_META_INTERFACE 更改前: de.robv.android.xposed .IXposedService
xposed_shared.h 改成你修改後的APK包名
XPOSED_DIR 更改前: /data/user_de/0/de.robv.android.xposed.installer /
XPOSED_DIR 更改前: /data/data/de.robv.android.xposed.installer /
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框架的源碼 由於網上資料過少經歷了不少坑 很多都是自己摸索出來了 我覺得應該有不少人有這種需求所以寫了這篇文章 希望能夠幫助到你 有什麼問題可以私信我

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