【问题标题】:Change mov to set constant 0更改 mov 以设置常量 0
【发布时间】:2017-03-25 10:09:39
【问题描述】:

这是一条可执行指令:

mov dword_1006530C, esi -> 89 35 0C 53 06 10

如何更改十六进制以将零移动到地址?

【问题讨论】:

  • 你能澄清一下吗?你到底想做什么?
  • 您的意思是将值零作为 32 位位戳写入绝对地址 0x1006530C?如果是这样,那么您将需要一些关于周围代码的额外上下文,因为没有足够的代码空间来就地修补当前指令。顺便说一句,地址是常量还是您需要在要修补的磁盘可执行文件中保留重定位记录?
  • 最终目标是修补可执行文件。我是这个领域的新手,但我的猜测是我只能更改属于该指令的字节。也许我可以检查寄存器,看看在那个执行点是否有一个值为 0 的寄存器并将 esi 更改为那个?那会有点冒险,但如果没有可行的简单解决方案?
  • mov dword_1006530C, edi 的十六进制是什么?
  • 如果你手头有一个零值的寄存器,这将是一个字节的变化(指令的第二个字节)。

标签: assembly x86 reverse-engineering ida


【解决方案1】:

没有足够的空间来编写将零写入该地址的指令序列。
单独编码为立即数的地址将占用四个字节。只留下两个字节用于: a) 保存寄存器 b) 将其归零 c) 执行存储 d) 恢复寄存器。

如果您在其他寄存器中有一个零,您可以将指令更改为

mov DWORD [1006530ch], <reg>

您可以使用NASM快速找出此类代码的机器码:只需将代码写入文件,在开头添加BITS 32即可。
组装它并使用十六进制编辑器检查输出文件。
例如mov DWORD [1006530ch], edi89 3D 0C 53 06 10

如果您没有准备好零,唯一的解决方案是将指令替换为 jmp 到文本部分中的一个空闲位置(总是有一个空闲位置),您可以在其中粘贴您的机器代码和最后跳回原来的程序流程。

【讨论】:

  • 使用mov r/m32, imm32 会更短(但仍然不够短),而不是保存/恢复寄存器并将其归零。但是,是的,结论是正确的:如果您在 reg 中没有零,则无法就地执行。
猜你喜欢
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
  • 2018-08-25
  • 2015-05-29
  • 2021-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多