比如说我在地址0xdeadbeef处有一个32元素的unsigned char数组。我想在内存中覆盖数组的内容。我不是用-g编译的,所以不能只做一个"设置[变量名] = [我的值]"。
是否可以一次性设置内存的内容?
我看过有人尝试set *((unsigned char*) 0xdeadbeef) = "abcdefghijklmnop"
,但这似乎不起作用。
或者,如果它不可能(例如,因为gdb如何知道将其转换为十六进制ascii表示?),是否可以同时提供多个字节,单词等?例如,我可以只计算我希望数组表示的十六进制值,但是我可以一次性地提供它吗?类似于:set 0xdeadbeef = 0x4142434445464748495051
答案 0 :(得分:2)
(发布此问题只是一个“官方”答案)
卡尔在评论中的陈述是完全正确的。您可以在gdb中执行以下操作: call strcpy(0xdeadbeef, "mystring")
这适用于静态链接的C库(memset,strncpy等)中包含的任何函数。
答案 1 :(得分:1)
可以使用一个命令编写char数组,而不使用strcpy()
之类的标准函数。
set *(char [CHAR_ARRAY_SIZE] *) <WRITE_ADDRESS> = "YOUR_CHAR_ARRAY"
其中CHAR_ARRAY_SIZE
是YOUR_CHAR_ARRAY
的大小加上多余的NULL字节。
例如
set *(char [15] *) 0x20018000 = "Write a string"