该命令主要是用来搜索并打印 UNIX 二进制文件中的字符串信息,这样对于想了解可执行文件中相关信息的用户是十分有用的。
以下面的小程序为例:
[C++] 纯文本查看 复制代码 #include <stdio.h>
int main()
{
char url[] = "www.groad.net";
printf ("welcome to ");
system("ls");
printf ("%s", url);
return 0;
}
将程序编译成可执行文件:直接将 strings 作用于该程序:beyes@beyes :~/command/strings> strings exp
/lib/ld-linux.so.2
__gmon_start__
libc.so.6
_IO_stdin_used
printf
system
__libc_start_main
GLIBC_2.0
PTRh@
QVhl
www.
groa
d.nef
[^_]
welcome to
;*2$" strings 默认情况呢下,输出的每行字符串至少 4 个字节,因此可以看到在输出数组中的字符串时,初始化字符串被分为 3 个部分来输出。如果仔细观察,可以看到数组中原本为 d.net 的却输出为 d.nef ( t 输出为 f,处于第 5 个字符位置)。根据 strings 的 man 手册里的说明,在输出的每行中,后面会跟着输出一个非可打印字符,因此 t 被输出成 f 也是便也得到了解释。这种情况多见于初始化区域,如上面对数组进行的初始化。为此,也不能指望 strings 可以打印出完全精确的信息。如果将上面的 www.groad.net 随便改为 www.groad.netttttttttt ,再用 strings 观察时,会发现更多的不可打印字符(乱码),它们看起来倒像是分隔符号。实际上,使用 strings 并不需要纠结于此。
上面的输出只是简略的输出,默认情况下,strings 只会输出已初始化内容及已装载的区段(section),如果想查看全部内容,那么使用 -a 选项:strings -a exp
/lib/ld-linux.so.2
__gmon_start__
libc.so.6
_IO_stdin_used
printf
system
__libc_start_main
... ...
.shstrtab
.interp
.note.ABI-tag
.note.gnu.build-id
.gnu.hash
... ...
_Jv_RegisterClasses
__TMC_END__
_ITM_registerTMCloneTable
_init 上面的输出结果中包含了所有的区段名等信息。
可以利用 strings 找出应用程序相应的版权信息:beyes@beyes :~/command/strings> strings /bin/ls |grep Copyright
Copyright %s %d Free Software Foundation, Inc.
使用 -o 选项打印出文本字串在文件中的偏移:beyes@beyes :~/command/strings> strings -o exp
524 /lib/ld-linux.so.2
1131 __gmon_start__
1150 libc.so.6
1162 _IO_stdin_used
1201 printf
1210 system
1217 __libc_start_main
1241 GLIBC_2.0
1610 PTRh@
1625 QVhl
2171 www.
2201 groa
2211 d.nef
2454 [^_]
2540 welcome to
2727 ;*2$" |