前言
最近由于練車和專案緊的原因未更新博文,今天給大家講解 GG修改器是如何實作跨行程讀寫應用記憶體的,
關于跨行程讀寫應用記憶體的文章和案例我翻遍了csdn,簡書,github,gitee,發現沒有一篇文章,于是決定發布一篇博文來粗略講解一下原理,有基礎的朋友完全可以上手開發,
進入話題
此技術核心用到了java反射技術和AIDL(IPC)管道通信技術,
大體邏輯
使用root拉起一個java的su行程 -> 創建IPC管道 -> 回呼主行程連接Service
如何創建su行程
在linux中有兩個命令,可以創建java行程,dalvikvm和app_process,建議使用app_process,因為app_process底層也是dalvikvm,具體創建行程命令和引數可百度查詢,
如何在SU行程創建IPC管道
在拉起su行程之后,
- 反射呼叫ActivityThread.systemMain()方法,獲取ActivityThread物件
- 反射呼叫ActivityThread.getSystemContext()方法,得到ContextImpl物件
- 反射呼叫 ActivityManagerNative.getDefault()方法, 或 反射呼叫ActivityManager.getService()方法,得到IActivityManager物件
- 反射得到IActivityManager物件的broadcastIntenot方法(注意,API 21+ broadcastIntent有12個形參,API 24+ broadcastIntent有13個形參)
- 最后呼叫broadcastIntent方法,傳入引數,完成創建IPC服務(broadcastIntent的引數請查看安卓原始碼)
- 注意:記得阻塞SU行程,否則運行完成會直接退出
// api24 +
int broadcastIntent(in IApplicationThread caller, in Intent intent,
in String resolvedType, in IIntentReceiver resultTo, int resultCode,
in String resultData, in Bundle map, in String[] requiredPermissions,
int appOp, in Bundle options, boolean serialized, boolean sticky, int userId);
// api 21+
public int broadcastIntent(IApplicationThread caller, Intent intent,
String resolvedType, IIntentReceiver resultTo, int resultCode,
String resultData, Bundle map, String requiredPermission,
int appOp, boolean serialized, boolean sticky, int userId) throws RemoteException;
如何讓JNI擁有Root環境
當我們創建好su行程后,可以使用System.load函式加載動態so庫,這時候這個so就是root環境,就實作了跨行程讀寫記憶體,再通過ipc就能實作主行程的主動呼叫su行程函式
注:我們拉起的su行程是無法創建UI視圖的,在主行程結束后,請kill掉su行程,某些情況下,su行程不會因為主行程的死亡而死亡,而是繼續運行,
我也準備使用此技術開發一款安卓端使用LUA進行編程的IDE,專案取名為《LIDE》,準備支持功能如下:
- lua輕量級安卓應用開發
- root直接讀寫行程記憶體
- root無沖突觸控
- 可注入LUA腳本或so或apk到行程中運行(可繞過ptrace反除錯,防止檢測)
- 代碼高亮編輯器(代碼高亮和提示,語法檢查)
- 可視化布局工具(支持xml)
- 可加載動態so庫,鏈接函式到lua
- 可呼叫java庫
- 模塊化的開發邏輯
- 可撰寫XPosed模塊
- 表盤式應用除錯工具
- 支持虛擬機中使用
專案正在開發中,有興趣或愿意加入開發者團隊的朋友請私聊我
轉載或參考文本請注明出處:https://blog.csdn.net/qq_38944721/article/details/114363535?utm_source=app&app_version=4.5.2
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/266409.html
標籤:其他
