Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在gdb中搜索进程内存中的特定字节字符串?_Gdb - Fatal编程技术网

如何在gdb中搜索进程内存中的特定字节字符串?

如何在gdb中搜索进程内存中的特定字节字符串?,gdb,Gdb,我试图了解gdb中的find是如何工作的。从表面上看,它的行为是。。。即使不是完全错误,也很奇怪: (gdb) p *(char*)0x464408@50 $5 = "untrusted comment: minisign public key 99312DBDB49" (gdb) find 0x464000, 0x465000, "minisign public key" Pattern not found. 这需要一个WTF。。。字符串位于地址0x464408,但是find没有找到它 让

我试图了解
gdb
中的
find
是如何工作的。从表面上看,它的行为是。。。即使不是完全错误,也很奇怪:

(gdb) p *(char*)0x464408@50
$5 = "untrusted comment: minisign public key 99312DBDB49"

(gdb) find 0x464000, 0x465000, "minisign public key"
Pattern not found.
这需要一个WTF。。。字符串位于地址
0x464408
,但是
find
没有找到它

让我们试着解开绳子,也许吧?也许NUL角色会干扰

(gdb) p/x *(unsigned char*)0x464408@10
$8 = {0x75, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20}

(gdb) find 0x464000, 0x465000, 0x75, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20
Pattern not found.
没有


怎么了?

您必须为字节添加
/b

(gdb) find /b 0x464000, 0x465000, 0x75, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20
0x464408
1 pattern found.
帮助查找
这样说,也许有点远离匆忙的目光:

(gdb)帮助查找
在内存中搜索字节序列。
用法:
查找[/size char][/max count]开始地址,结束地址,expr1[,expr2…]
查找[/size char][/max count]起始地址,+长度,expr1[,expr2…]
大小字符分别是8、16、32、64位值的b、h、w、g之一,
如果未指定,则大小取自表达式的类型
使用当前语言。
注意,这意味着,例如,在类C语言的情况下
搜索非类型化的0x42将搜索“(int)0x42”
通常是四个字节。
最后一个匹配项的地址存储为“$\”的值。
便利变量“$numfound”设置为匹配数。

不过,
find/b,“literal string”
w,i,l,l,n,o,t,w,o,r,k,会做一些人们可能愚蠢地期望不到的事情

因此,您最好事先将字符串转换为十六进制字节
gdb
可以(非常有帮助)为您做到这一点:

(gdb) p/x "literal string"
$5 = {0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x0}