阿荣社区采集员2 发表于 2025-10-4 17:22:42

求fri的下线卡镇魂修复

大佬们,求一份fri的下线卡镇魂修复代码,谢谢

阿荣社区采集员 发表于 2025-10-4 17:23:12

AI写的,我测试了一下,应该可以的

阿荣社区采集员 发表于 2025-10-4 17:23:47

不是这样吗?你给的等级补丁是工业基地下线直接回到修南的赛丽亚房间,但是没上墙角。然后我用我的frida 之后,是可以让他保留在工业基地的赛丽亚房间的

阿荣社区采集员 发表于 2025-10-4 17:23:59

//修复卡镇魂
var setCharacInfoDetail = new NativeFunction(ptr(0x0864AC1A), "int", ["pointer", "int", "int", "pointer"], { abi: "sysv" });
function fix_SaveTown() {
Interceptor.replace(setCharacInfoDetail, new NativeCallback(function (pUser, a2, a3, pCHARAC_DATA) {
// 1. 缓存原始的城镇编号 (a4+34)
var curArea = Memory.readU8(pCHARAC_DATA.add(34));
console.log("curArea", curArea)//城镇编号
console.log("a2", a2)//第几个位置
console.log("a3", a3)//CID
console.log("pCHARAC_DATA", pCHARAC_DATA)//一个基址
// 2. 调用原函数
var result = setCharacInfoDetail(pUser, a2, a3, pCHARAC_DATA);
// 获取角色信息数组的地址 (this + 497384)
var vectorAddr = pUser.add(497384);
// 获取vector中的begin指针 (首个元素地址)
var begin = Memory.readPointer(vectorAddr);
// 手动计算元素大小(经验值,重要!)根据数据结构大小调整为4788(按IDA分析)
var CHARAC_INFO_SIZE = 5329; // 需根据版本验证,这里是关键偏移
// 计算第a2个角色的地址 = begin + a2 * 元素大小
var charInfoPtr = begin.add(a2 * CHARAC_INFO_SIZE);
console.log("charInfoPtr:", charInfoPtr)
// 修改城镇编号 (charInfoPtr + 34)
// 3. 如果是镇魂 (13) 或时间门 (12),强制修改为修南 (11)
if (curArea === 12 || curArea === 13) {
Memory.writeU8(charInfoPtr.add(34), 11); // 强制设成11
} if (curArea === 14) {
Memory.writeU8(charInfoPtr.add(34), 14); // 强制设成14
}
return result;
}, "int", ["pointer", "int", "int", "pointer"]));
}

阿荣社区采集员 发表于 2025-10-4 17:24:38

第三版
var setCharacInfoDetail = new NativeFunction(ptr(0x0864AC1A), "int", ["pointer", "int", "int", "pointer"], { abi: "sysv" });
function fix_SaveTown() {
Interceptor.replace(setCharacInfoDetail, new NativeCallback(function (pUser, a2, a3, pCHARAC_DATA) {
// 1. 在调用原函数前修改输入数据(更安全)
const AREA_OFFSET = 34;
var curArea = Memory.readU8(pCHARAC_DATA.add(AREA_OFFSET));
console.log("curArea", curArea)//城镇编号
console.log("a2", a2)//第几个位置
console.log("a3", a3)//CID
console.log("pCHARAC_DATA", pCHARAC_DATA)//一个基址
// 提前修改要保存的数据
if (curArea === 12 || curArea === 13) {
Memory.writeU8(pCHARAC_DATA.add(AREA_OFFSET), 11); // 修南
} else if (curArea === 14) {
Memory.writeU8(pCHARAC_DATA.add(AREA_OFFSET), 14); // 工业基地
}
// 2. 安全调用原函数
var result = setCharacInfoDetail(pUser, a2, a3, pCHARAC_DATA);
// 3. 移除后续危险的内存操作
return result;
}, "int", ["pointer", "int", "int", "pointer"]));
}

阿荣社区采集员2 发表于 2025-10-4 17:25:30


我工业区下线,上线后,输出看到是执行到了下面的逻辑,但是上线后还是再镇魂

阿荣社区采集员2 发表于 2025-10-4 17:25:59

我看了这个地方是14   Memory.writeU8后,上线还是卡镇魂的

阿荣社区采集员2 发表于 2025-10-4 17:26:54

页: [1]
查看完整版本: 求fri的下线卡镇魂修复