--[[ 三角洲行动国服 / libtersafe.so mrpcs 初始化破坏 + 检测点过校验 版本 v3: 严格对齐原脚本已验证语义(闪退回退版) 回退说明: 0x3ADDF0 恢复线程体死循环; 0x2EB9C4 恢复 NOP 自旋; 撤回 0x37B204 调用点新增补丁; 0x376DC8 恢复原跳转目标。 保留升级: 入口 MOV W0,#0;RET 确定返回值, 载荷预编码不依赖汇编器。 ]] local PATCHES = { {"1C552C", "52800000"}, {"20B17C", "F9401EC8"}, {"2E0454", "52800000D65F03C0"}, {"2E49A0", "1400000C"}, {"2EB7E0", "52800000D65F03C0"}, {"2EB9C4", "D503201F"}, {"375F24", "52800000"}, {"3764F4", "D503201F"}, {"376BD8", "D503201F"}, {"376DC8", "1400006A"}, {"37B2CC", "14000006"}, {"37C96C", "52800000D65F03C0"}, {"3ACF84", "D503201F"}, {"3ACFF4", "D503201F"}, {"3ADDF0", "14000000"}, {"3ADE14", "52800000D65F03C0"}, {"3DF0F0", "52800000D65F03C0"}, {"3DF2E0", "D503201F"}, {"3FD4A0", "AA1F03E0"}, {"3FD4A4", "D65F03C0"}, {"3FF570", "52800000"}, {"3FF574", "D65F03C0"}, {"40DF84", "14000035"}, {"40E060", "D503201F"}, {"41480C", "52800000D65F03C0"}, {"419D64", "AA1F03E0"}, {"41CE98", "D503201F"}, {"42A5D8", "52800000D65F03C0"}, {"43B264", "D503201F"}, {"43B424", "D503201F"}, {"443BD4", "D503201F"}, {"443BE4", "1400001B"}, {"443CA0", "D503201F"}, {"467200", "52800000D65F03C0"}, {"475318", "52800000"}, {"4A1D78", "14000009"}, } -- 基址: 所有映射段的最小 start = so 基址 (vaddr=0 段必映射) local lib = "libtersafe.so" local ranges = gg.getRangesList(lib) local base = nil for _, v in ipairs(ranges) do if base == nil or v.start < base then base = v.start end end if not base then gg.toast("libtersafe.so 未找到") return end -- 防版本漂移: 校验最大偏移落在 so 映射范围内 local maxOff = 0x4A1D78 for _, p in ipairs(PATCHES) do local o = tonumber(p[1], 16) if o > maxOff then maxOff = o end end local maxEnd = base for _, v in ipairs(ranges) do if v["end"] > maxEnd then maxEnd = v["end"] end end if base + maxOff >= maxEnd then gg.toast("libtersafe.so 偏移越界, 版本可能不匹配") return end local items = {} for _, p in ipairs(PATCHES) do local off = tonumber(p[1], 16) local hex = p[2] -- 每 8 个 hex 字符 = 一条 4 字节指令; b 为字符偏移(0, 8, ...) for b = 0, #hex - 8, 8 do items[#items + 1] = { address = base + off + math.floor(b / 2), flags = 4, value = tonumber(hex:sub(b + 1, b + 8), 16), } end end local ok, err = gg.setValues(items) if ok then gg.toast(string.format("tersafe patch ok: %d", #PATCHES)) else gg.toast("tersafe patch fail: " .. tostring(err)) end