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

能否在dbg等反汇编器中删除并添加指令?

在x64dbg/OD类反汇编器中删除、添加指令的操作方法

关于删除指令

你没法直接“删除”指令——因为程序的内存布局是连续固定的,删除某段指令会导致后续所有指令的地址偏移,直接破坏整个程序的执行逻辑。实际操作中,你可以用两种方式实现“移除指令逻辑”的效果:

  • 用NOP填充覆盖:把要删除的指令对应的内存全部写成NOP(0x90),比如一条5字节的call指令,就填5个0x90。这样这段内存依然被占用,但不会执行任何有效操作,相当于跳过了原指令的逻辑。
  • 跳转跳过目标代码:修改原代码的控制流,直接跳过要删除的指令段。比如原代码序列是:
    00401000  push ebp
    00401001  mov ebp, esp
    00401003  call 00401050  ; 要移除的调用指令
    00401008  mov eax, ebx
    
    你可以把00401003处的call指令改成jmp 00401008,直接跳到原指令的下一条,彻底绕过这段不需要的代码。

关于添加指令

直接在原代码段插入指令会覆盖后续的原有指令,导致程序崩溃。常用的两种合法添加方式都依赖内存重定向:

  • 利用空闲内存区域:先在程序内存里找未被使用的空闲区域(比如PE文件的空白节、未映射的内存页,x64dbg里可以通过“内存映射”窗口查看),把新增指令写入这个区域,然后修改原代码的控制流,先跳转到这个空闲区域执行新增指令,执行完成后再跳回原代码的下一条指令。
    举个例子:
    1. 找到空闲内存地址00402000,写入新增指令:
      00402000  push eax
      00402001  mov eax, 0x123456
      00402006  pop eax
      00402007  jmp 00401003  ; 跳回原代码的下一条指令位置
      
    2. 把原代码起始位置00401000的指令改成jmp 00402000,这样程序执行到这里时,会先跑新增的代码,再回到原流程。
  • 创建代码洞穴(Code Cave):如果没有现成的空闲内存,你可以修改程序的PE结构——要么给现有节扩展空间,要么新增一个可执行的节,然后把新增指令放在这个“洞穴”里,再通过跳转实现流程切换。这种方法需要你对PE文件结构有基础了解,操作时要注意调整节表的内存大小、文件偏移等参数。

关键操作细节

  • 所有内存修改前,需要先把目标内存页的属性改成可写(x64dbg里右键内存区域 -> 内存 -> 设置内存访问属性,勾选“可写”),因为默认代码段是只读的,无法直接修改。
  • 修改完成后,如果想让修改永久生效,需要用工具的“补丁”功能(比如x64dbg里右键 -> 补丁 -> 应用补丁到文件),把内存中的修改同步到磁盘上的程序文件,否则重启程序后所有修改都会丢失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 21:33:16