You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cheat Engine汇编注入异常:cmp指令未按预期执行求助

Cheat Engine脚本问题:区分自身与敌人血量的cmp指令未生效

尝试编写Cheat Engine脚本实现自身不受伤害但敌人正常受击的效果,基础免伤代码可正常运行,但加入cmp [edi+B08],1和jne指令后,程序始终跳转到原代码执行,无法区分自身与敌人。

注入代码如下:

[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat
alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(exit)

newmem: //this is allocated memory, you have read,write,execute access
//place your code here

cmp [edi+B08],1 // this is not passing
jne originalcode

add [esi+48],500
jmp exit

originalcode:

movsd [esi+48],xmm1


exit:
jmp returnhere

"noita.exe"+589231:
jmp newmem
returnhere:




[DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
"noita.exe"+589231:
db F2 0F 11 4E 48
//movsd [esi+48],xmm1

[edi+B08]是通过内存扫描得到的偏移,原本希望用该值是否为1来区分自身与敌人的血量,但cmp指令未按预期生效,排查方向如下:

  • 寄存器或偏移指向错误:确认edi在代码执行点是否真的指向当前处理的实体对象。可以用CE调试器在cmp指令处暂停,查看edi的数值,再检查[edi+B08]的实际内容,验证是否为实体的标识位。
  • 数据类型不匹配:默认的cmp [edi+B08],1可能未指定数据大小,若[edi+B08]是4字节整数,需明确写cmp dword ptr [edi+B08],1;若是字节则写cmp byte ptr [edi+B08],1,避免因数据类型不匹配导致对比失效。
  • 标识位数值错误:自身的实体标识位可能不是1,而是其他值(比如0、2)。可以在游戏中定位自身血量地址,回溯指针到实体结构,查看B08偏移处的实际数值,再对比敌人的对应值,确认正确的区分标识。
  • 代码执行时机问题:在noita.exe+589231这个注入点,edi可能还未被正确赋值为实体指针,导致访问的是无效内存或错误数据。查看原代码上下文,确认edi的赋值逻辑,确保它指向当前血量所属的实体。

调试建议:

  • 用CE调试器在注入的cmp指令处设置断点,触发血量变化(自身掉血或敌人受击)后暂停,检查edi和[edi+B08]的实际值。
  • 修改cmp指令,明确指定数据类型,测试是否生效。
  • 回溯原代码中edi的来源,确认其指向的正确性。

内容的提问来源于stack exchange,提问作者DevFish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 12:53:02