xposed流程圖解析

二、Xposed機制介紹
這裏我們採用大量的流程圖來解析。
在這裏插入圖片描述
通過分析android源碼,我們可以得出如上圖的結論:
不論是java層還是c層的代碼,都會進過一個統一的執行函數dvmCallMethodV,之後才判斷是解釋執行還是elf方式執行。

app啓動
圖1 Xposed啓動過程
Xposed通過更改源碼app_proccess中的app_main.c用來替換android 解釋器zgote孵化器。這個孵化器是每個apk啓動過程中都要複製的一個進程。通過更換這個文件。我們便可隨意更改執行流程。
如圖1中,正常的系統源碼通過AndroidRuntime::start()啓動com.android.internal.os.ZygotInit。更改過的代碼執行xposed的替換代碼de.rodv.android.xposed.XposedBridge,之後再調用com.android.internal.os.ZygotInit。這部分是c代碼,de.rodv.android.xposed.XposedBridge和com.android.internal.os.ZygotInit是java代碼。

在這裏插入圖片描述
圖2
de.rodv.android.xposed.XposedBridge位於XposedBridge.java。這裏的java代碼通過回調機制定義了函數hook前後調用相應的接口,我們在編寫hook模塊的時候就是實現的這幾個接口。

在這裏插入圖片描述
圖3.更改執行流程

爲了實現用戶自定義的接口代碼能夠執行,XposedBridge模塊調用了app_process模塊中的類一個關鍵C代碼函數,de_robv_android_xposed_XposedBridge_hookMethod_hookMethodNative函數,這個函數主要作用是把我們之前dvmCallMethodV函數用來判斷執行java和c代碼執行流程的標誌進行更改。如圖3。這樣,執行流程就被劫持了。通過c指針我們成功的跳轉到了自定義的接口回調,也就是用戶自定義的hook代碼。

三 .Xposed進行所有應用內存Got替換操作
如此我們知道,android通過複製zgote的執行流程被控制了。每一個apk執行的過程也被控制了。但是可惜的是,xposed的作者沒有添加關於c代碼層hook的邏輯,劫持僅僅停留在java層的hook。但是,本身這個框架擁有很大的潛力,如果在加載自定hook模塊的同時,對內存進行操作,替換加載在內存中的Elf-got表,就可以實現native層的函數。如圖下:

在這裏插入圖片描述
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
if (off == false)
{
flushConfig();
}
if (!loadPackageParam.packageName.equals(GlobalConfig.Inject_PackageName))
return;
Class clazz = XposedHelpers.findClass(“java.lang.System”, loadPackageParam.classLoader); //使用注入包的類加載器來反射查找System.load函數,從而調用加載自己的框架so
if(clazz == null)
{
XposedBridge.log("[-] not found class: " + “java.lang.System”);
Log.e(GlobalConfig.Log_TAG, "[-] can’t found class: " + “java.lang.System”);
return;
}
Log.e(GlobalConfig.Log_TAG, "[+] found class: " + “java.lang.System”);
Method method = XposedHelpers.findMethodExact(clazz, “load”, String.class);//查找system.load函數
if (method == null)
{
Log.e(GlobalConfig.Log_TAG, "[-] can’t found function: " + method.getName());
}
Log.e(GlobalConfig.Log_TAG, "[+] found function: " + method.getName());
method.invoke(null, GlobalConfig.Inject_SoPath);//加載待注入庫
}
通過實現,我最終在Android沙箱中利用此技術成功的實現了native的實時監控,對比之前採用的substrate,穩定性有了很大的改善。

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