GDB:改变正在运行程序的汇编代码

6

我成功地将一条指令更改为 NOP,因为它非常基础:

set *0x08048e3a = 0x90

我试图更改这个地址0x08048e3a,它有一个je 0x8048e52。我想把它改为je 0x8048ea8

但是当我执行set *0x08048e3a = 0x74168048ea8时,它不起作用。(0x7416 = je指令)

谢谢

1个回答

16

0x74168048ea8比一个字长。你应该尝试逐个设置字节,例如:

  set *(char*)0x08048e3a = 0x74
  set *(char*)0x08048e3b = 0x16

等等


1
还要注意,在x86上,CALLJMP指令是PC相对的(也就是说,指令的实际字节编码为从当前指令到跳转目标的偏移量(更精确地说,是从下一条指令开始计算的偏移量))。因此,如果你想要JE 0x8048ea8,实际的指令字节将不会包含0x8048ea8 - Employed Russian
感谢您的回答。我以为16是“je”指令的一部分。但它实际上是跳转的偏移量。 - Francois Valiquette
7
为了节省输入,你可以一次性设置一些字节,例如set *(char*)0x08048e3a@5={0x74,0x16,0x80,0x48,0xea}。该命令的作用是将地址0x08048e3a处开始的第5个字节到第9个字节按顺序设为0x74、0x16、0x80、0x48和0xea。 - Johannes Riecken

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接