local a = gg.getListItems() local processedSoNames = {} -- 用于存储已处理的SO库名称 local soCache = {} -- 缓存SO库的基地址 for i = 1, #a do for k, v in pairs(gg.getRangesList()) do if a[i].address >= v["start"] and a[i].address <= v["end"] then local soName = v["name"]:match('[^/]*$') -- 获取SO库基地址(如果缓存中没有则获取并缓存) if not soCache[soName] then soCache[soName] = gg.getRangesList(soName)[1].start end local soStart = soCache[soName] local py = a[i].address - soStart -- 获取ARM(64)操作码 local asmCode = gg.disasm(6, a[i].address, a[i].value) -- 移除分号及后面的所有内容 asmCode = asmCode:match("^([^;]*)") or asmCode -- 处理操作码格式 if not asmCode:match("^~") then asmCode = "~A8 " .. asmCode end -- 移除多余的空格,确保多个连续空格只保留一个 asmCode = asmCode:gsub("%s+", " ") -- 去除首尾空格 asmCode = asmCode:gsub("^%s*(.-)%s*$", "%1") -- 如果这个SO库还没有输出过t的定义,先输出t的定义 if not processedSoNames[soName] then print("local t = {\"" .. soName .. "\"}") processedSoNames[soName] = true end print("local tt = {0x" .. string.format("%X", py) .. "}local ttt = S_Pointer(t,tt,true)") print("setvalue(ttt,4, \"" .. asmCode .. "\", false)") break -- 找到匹配的内存范围后跳出内层循环 end end end