Xposed倉庫地址
https://repo.xposed.info/module/com.sll.luahook
Github地址
https://github.com/ihbing/LuaXposed
原理
借用LuaJ引擎實現,主要對以下幾個Api進行了封裝
globals.set("Log", CoerceJavaToLua.coerce(Log.class));
globals.set("LocalLog", CoerceJavaToLua.coerce(LocalLog.class));
globals.set("NewXCMethodHook", new NewXCMethodHook());
globals.set("NewXCMethodReplacement",new NewXCMethodReplacement());
globals.set("ParametersBuilder", CoerceJavaToLua.coerce(ParametersBuilder.class));
globals.set("XposedHelper", CoerceJavaToLua.coerce(XposedHelpers.class));
globals.set("XposedBridge", CoerceJavaToLua.coerce(XposedBridge.class));
Hook Toast消息例子
簡單版
--入口函數
function handleLoadPackage(lpparam)
XposedBridge:hookAllMethods(XposedHelper:findClass("android.widget.Toast",nil),'makeText',NewXCMethodHook(function(param)
--替換吐司內容爲Hello,World!
param.args[2]='Hello,World!'
end,function(param) end))
end
詳細版
glpparam=nil
--入口函數,與原生Xposed入口函數一致
function handleLoadPackage(lpparam)
glpparam=lpparam
start()
end
function start()
--打印日誌
XposedBridge:log('start ::')
--將日誌輸出到文件,文件目錄爲/sdcard/luaxposed/+包名+/線程名.txt
LocalLog:logString(glpparam.packageName,"start","::")
--構建Hook參數
local paramsBuilder=ParametersBuilder.new()
--吐司實現函數參數結構:Toast.makeText(android.content.Context,java.lang.CharSequence,int)
paramsBuilder:addParameterType('android.content.Context')
paramsBuilder:addParameterType('java.lang.CharSequence')
paramsBuilder:addParameterType('int')
--設置函數攔截回調
paramsBuilder:setCallback(NewXCMethodHook(function(param)
--函數執行之前,param爲被Hook函數參數詳情
local arg0 = param.args[2]
LocalLog:logString(glpparam.packageName,"before",arg0)
param.args[2]=param.args[2]..',,,,test3'
end,function(param)
--函數執行之後
local result = param:getResult()
LocalLog:logString(glpparam.packageName,"after","result:"..tostring(result))
end))
--執行注入代碼,跟原生Xposed一樣調用方式
XposedHelper:findAndHookMethod(XposedHelper:findClass("android.widget.Toast",nil),"makeText",paramsBuilder:toParams())
XposedBridge:log('end ::')
LocalLog:logString(glpparam.packageName,"end","::")
end