在 GDB 中调试内核时如何为 writing/modifying 内存地址正确键入内存 instructions/opcodes
How to type memory instructions/opcodes properly for writing/modifying memory address while debugging kernel in GDB
假设我从地址 0x809fff00
:
开始反汇编 4 条指令
(gdb) disas /r 0x809fff00, +0x10
Dump of assembler code from 0x809fff00 to 0x809fff10:
0x809fff00: 00 35 0c 00 sll a2,t4,0x14
0x809fff04: 00 00 00 00 nop
0x809fff08: 00 00 00 00 nop
0x809fff0c: 00 00 00 00 nop
我想修改地址 0x809fff00,操作码为 01 02 03 04,小端。我应该怎么做?
例如在 C 中,我会这样做:
地址 0x809fff00 = “\x04\x03\x02”
如何在 GDB 中使用 set
命令?
既然你已经知道了操作码,那就很简单了。您只需使用 set
在该地址设置您想要的任何字节。唯一的技巧是您希望一次设置 4 个字节,因此您需要指示 set
将地址视为指向 DWORD 的指针。您可以使用 C 风格的转换来做到这一点:
set *(unsigned int*)0x809fff10 = 0x04030201
(显然,这假设 unsigned int
在您的平台上是 4 字节类型。如果不是,请适当更改它。)
假设我从地址 0x809fff00
:
(gdb) disas /r 0x809fff00, +0x10
Dump of assembler code from 0x809fff00 to 0x809fff10:
0x809fff00: 00 35 0c 00 sll a2,t4,0x14
0x809fff04: 00 00 00 00 nop
0x809fff08: 00 00 00 00 nop
0x809fff0c: 00 00 00 00 nop
我想修改地址 0x809fff00,操作码为 01 02 03 04,小端。我应该怎么做?
例如在 C 中,我会这样做: 地址 0x809fff00 = “\x04\x03\x02”
如何在 GDB 中使用 set
命令?
既然你已经知道了操作码,那就很简单了。您只需使用 set
在该地址设置您想要的任何字节。唯一的技巧是您希望一次设置 4 个字节,因此您需要指示 set
将地址视为指向 DWORD 的指针。您可以使用 C 风格的转换来做到这一点:
set *(unsigned int*)0x809fff10 = 0x04030201
(显然,这假设 unsigned int
在您的平台上是 4 字节类型。如果不是,请适当更改它。)