好友
阅读权限 25
听众
最后登录 1970-1-1
本帖最后由 dety 于 2026-11-8 10:41 编辑
最近在研究一个游戏时碰到一个老问题:用 CE 找到数值,改完马上被写回,锁定也没用,甚至改写入的汇编都没效果。后来分析了下,这个位置大概率是动画显示层的数据——它是被算出来渲染用的,真正的逻辑代码每帧大量回写,所以你改显示层等于白改。
以前碰到这种情况基本就放弃了,这次换了个思路解决了,分享给碰到同样情况的朋友。
问题背景
以某个游戏(红警3新版本的超武倒计时)为例,倒计时显示值可以正常搜到,四字节,数值就是从 360 秒开始递减,到 0 就就绪。但是:
改数值,瞬间被写回 CE 锁定,无效 对写入代码下断,能看到大量代码在刷,关键词里带 AptAnimationTarget 这类动画相关的字样,基本就是显示层了
思路:找"结束帧"而不是显示值
游戏内部有个一直跑的帧计数器,从开局每帧 +1,是个越来越大的数。逻辑层不会在倒计时里一直算"还剩几秒",而是释放技能的那一刻算一个目标帧: 结束帧 = 当前帧 + 冷却帧数 释放完技能后这个结束帧就固定不动了,直到下次释放才更新一次。倒计时显示层其实是拿"结束帧 - 当前帧"反算出来的。
也就是说:结束帧才是真逻辑在用的数据,显示值只是它的"投影"。改投影没用,改源头才有用。
具体操作(CE)
四字节,先扫一次未知数值 释放技能,扫"变动的值" 之后倒计时过程中一直扫"未变动的值" 多筛几轮,最后剩十几个结果 对每个结果用"找出是什么访问了这个地址",没访问的删掉。重点看:访问代码里有 cmp 比较的、访问量很大且持续增长的,基本就是要找的 不放心可以对它下个写入断点,释放技能时断下来就稳了
改法
找到访问断点后显示反汇编,会看到经典的标志位判断:
[Asm] 纯文本查看 复制代码
cmp [esi+20], ecx ; 结束帧 vs 当前帧; 当前帧 >= 结束帧 则 eax = 1(就绪),否则 xor eax 清零
两种改法任选:
把异或清零那段改成强制 mov eax,1 或者直接在函数头强制赋值返回,跳过下面所有逻辑
效果就是无倒计时释放技能。注意这类代码一般是多个实例共用的,改之前先"找出指令访问的地址"确认一下影响范围,别一刀切。
另外实测把结束帧改 0 也能生效,但不要锁定。锁定为 0 会导致重开局后取不到结束帧,必须重进游戏才恢复。
适用范围
这个方法本质上是针对"显示层数据被逻辑层持续重写"的场景,倒计时、CD、刷新时间这类机制理论上都能套。核心思想就一句话:改不动显示值,就去倒推它依赖的那个固定不动的源头数据。
我自己做的时候顺手录了个完整操作过程的演示视频,对着看比干读文字直观,放这里了:
https://www.bilibili.com/video/BV1AM4q62EFW
纯技术交流,有问题欢迎讨论,有说得不对的地方大佬轻拍。
免费评分
查看全部评分
发帖前要善用【论坛搜索 】 功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。