11

使用 gdb 将整数或十六进制写入内存地址非常简单:

(gdb) set {int}0x08040000 = 42
(gdb) set {int}0x08040000 = 0xffffffff

但是我怎样才能以同样简单的方式将字符或整个字符串写入内存呢?现在我不得不求助于将字符串翻译成十六进制然后输入,这很耗时。

4

2 回答 2

18

假设您有以下程序:

int main(void){
    char[] person = "Bob";
    char[] p2 = "Alice";

    printf("Hello %s\n");
}

使用 GDB,您可以在 main 中设置断点,并通过以下方式更改人名:

(gdb) set main::person = { 'S', 'a', 'm', 0x00 }

或更直观地说

(gdb) set main::person = "Sam"

如果要直接设置内存,请使用:

set {char [4]} 0x08040000 = "Ace"

我假设由于您使用 gdb 戳内存,因此您知道自己在做什么,因此您知道如何为字符串设置空字节等。请记住,如果您尝试更改数组的值并尝试放入一个比最初分配的字符串长的字符串,你很有可能会破坏内存。(尝试将 main::person 设置为“Dilbert”的示例将导致问题

于 2013-10-21T20:09:18.663 回答
10

采用strcpy()

(gdb) p malloc(20)
$3 = (void *) 0x6ce81808
(gdb) p strcpy($3, "my string")
$4 = 1827149832
(gdb) x/s $3
0x6ce81808: "my string"
于 2013-10-21T20:14:55.120 回答