-- 飞吧龙骑士 - GG Lua 脚本: dump 运行时解密后的 global-metadata.dat -- 用法: 游戏进入主界面后, 在 GameGuardian 中加载本脚本运行 -- 输出: /sdcard/global-metadata.dump.dat local OUT = "/sdcard/global-metadata.dump.dat" gg.clearResults() gg.toast("开始搜索内存中的 AF 1B B1 FA ...") gg.searchBytes("AF 1B B1 FA") local count = gg.getResultsCount() if count == 0 then gg.toast("未找到魔数,请确认已进主界面") return end gg.toast("命中 " .. count .. " 处,验证中...") -- 验证 header 并取第一个合法结果 local results = gg.getResults(math.min(count, 50)) local validAddr, size = nil, 0 for _, r in ipairs(results) do local a = r.address local h = gg.getValues({ { address = a + 4, flags = gg.TYPE_DWORD }, -- version { address = a + 16, flags = gg.TYPE_DWORD }, -- stringLiteralDataOffset { address = a + 20, flags = gg.TYPE_DWORD }, -- stringLiteralDataCount }) local version = h[1].value local slo = h[2].value local slc = h[3].value if version and version > 0 and version <= 0x40 and slo and slo > 0 and slc and slc > 0 then local sz = slo + slc if sz > 0x100000 and sz < 0x40000000 then validAddr, size = a, sz gg.toast("验证通过 version=0x" .. string.format("%X", version) .. " size=" .. sz) break end end end if validAddr == nil then gg.toast("没有验证通过的结果,换个时机再试") return end -- 分块 dump (按 DWORD 读, 加速) local f = io.open(OUT, "wb") if not f then gg.toast("无法写入 " .. OUT) return end local bit = bit or require("bit") local CHUNK = 8192 -- 每次读 8192 个 DWORD (32KB) local dwCount = math.floor(size / 4) local i = 0 while i < dwCount do local n = math.min(CHUNK, dwCount - i) local addrs = {} for j = 0, n - 1 do addrs[j + 1] = { address = validAddr + (i + j) * 4, flags = gg.TYPE_DWORD } end local vals = gg.getValues(addrs) local buf = {} for j = 1, n do local v = vals[j].value buf[j] = string.char( bit.band(v, 0xFF), bit.band(bit.rshift(v, 8), 0xFF), bit.band(bit.rshift(v, 16), 0xFF), bit.band(bit.rshift(v, 24), 0xFF)) end f:write(table.concat(buf)) i = i + n if i % (CHUNK * 20) == 0 then gg.toast(string.format("dump 中 %.1f%%", i / dwCount * 100)) end end -- 剩余不足 4 字节的尾巴 local remain = size - dwCount * 4 if remain > 0 then local addrs = {} for j = 0, remain - 1 do addrs[j + 1] = { address = validAddr + dwCount * 4 + j, flags = gg.TYPE_BYTE } end local vals = gg.getValues(addrs) for j = 1, remain do f:write(string.char(bit.band(vals[j].value, 0xFF))) end end f:close() gg.toast("完成 -> " .. OUT .. " (" .. size .. " 字节)")