【发布时间】:2013-10-30 10:46:39
【问题描述】:
使用 gdb 将整数或十六进制写入内存地址非常简单:
(gdb) set {int}0x08040000 = 42
(gdb) set {int}0x08040000 = 0xffffffff
但是我怎样才能以同样简单的方式将字符或整个字符串写入内存呢?现在我不得不求助于将字符串翻译成十六进制然后输入,这很耗时。
【问题讨论】:
使用 gdb 将整数或十六进制写入内存地址非常简单:
(gdb) set {int}0x08040000 = 42
(gdb) set {int}0x08040000 = 0xffffffff
但是我怎样才能以同样简单的方式将字符或整个字符串写入内存呢?现在我不得不求助于将字符串翻译成十六进制然后输入,这很耗时。
【问题讨论】:
假设你有以下程序:
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”的示例会导致问题
【讨论】:
使用strcpy()
(gdb) p malloc(20)
$3 = (void *) 0x6ce81808
(gdb) p strcpy($3, "my string")
$4 = 1827149832
(gdb) x/s $3
0x6ce81808: "my string"
【讨论】: