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

如何将汇编mov指令中源操作数EAX替换为立即数常量

x86指令替换崩溃修复方案

核心崩溃原因

你遇到的崩溃本质是两条32位x86指令的字节长度不匹配:

  • 原有指令 mov dword ptr ds:[0x73A9C8], eax 仅占5字节(opcode A3 + 4字节目标地址)
  • 目标指令 mov dword ptr ds:[0x73A9C8], 1 需要占10字节(opcode C7 05 + 4字节目标地址 + 4字节立即数1)
    直接硬塞长指令、盲目扩展函数长度时,要么会覆盖后续正常执行的原有指令,要么移动代码后没有修正所有指向该函数内部的相对偏移(比如跳转指令、函数内地址引用),就会触发程序崩溃。

正确修改步骤

如果你可以接受修改eax寄存器的原值(该指令执行后eax不会被后续逻辑使用)

可以用指令组合替代,尽量少改动原有代码结构:

  • 第一步:将原有5字节指令替换为 mov eax, 1(刚好占5字节,opcode B8 01 00 00 00)
  • 第二步:在该指令的下一条位置新增原存储指令 mov dword ptr ds:[0x73A9C8], eax,如果下一条是有用的原有指令,将这部分被覆盖的原有指令移到函数末尾的空白填充区(一般是int3或者0x00填充的未使用空间),末尾加jmp指令跳回原函数正常执行的位置即可。

如果你需要保留eax寄存器的原值

必须使用10字节的完整mov立即数指令,按以下规范操作:

  • 先确认该函数所在代码段是否有足够的可执行空白空间,或者手动在程序的代码段新增一段可执行权限的空间
  • 将原有mov [0x73A9C8], eax指令开始的10字节空间全部替换为目标指令 mov dword ptr ds:[0x73A9C8], 1
  • 所有被覆盖的原有后续指令,全部移到提前找好的空白空间中,末尾加跳转指令回到原函数的后续执行位置
  • 修正所有指向该函数内部被移动过位置的引用:包括函数内的jmp/call/je等相对跳转指令,以及所有外部指向该函数内部的指针
  • 修改完成后在IDA中重新分析函数,确认没有红色报错标识后再导出修改后的二进制文件

验证步骤

修改完成后先在调试器中对修改位置下断点运行,确认0x73A9C8地址的值被正确写入1,且后续函数执行流程没有跳转异常,再运行完整程序测试功能。

内容的提问来源于stack exchange,提问作者smo Monkeyy-3

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:27:01