在 Linux 下使用 strings 命令“找不到字符串”,通常不是命令坏了,而是目标文件里本来就没有你以为存在的“可见字符串”,或者查找方式不对。下面按常见原因逐个说明。
strings 主要用来提取二进制文件中的可打印字符,例如:
.so 动态库如果你对以下文件用 strings,可能几乎什么都没有:
cat / grep 就行).gz、.zip、.png)strip 过的二进制(符号没了,但字符串通常还在)✅ 检查文件类型:
file yourfile
strings 默认只扫一部分数据段,可能漏掉:
✅ 强制扫描整个文件:
strings -a yourfile
或:
strings --all yourfile
strings 默认只显示长度 ≥ 4 的字符串。
例如:
"OK""IP"都看不到。
✅ 降低最小长度:
strings -n 1 yourfile
strings 默认只认可打印 ASCII(和部分扩展 ASCII)。
如果字符串是:
就会“看不到”。
✅ 尝试 UTF-16:
strings -e l yourfile # 16-bit little endian
strings -e b yourfile # 16-bit big endian
strings -e L yourfile # 32-bit little endian
很多程序不在二进制里直接写完整字符串,例如:
char buf[64];
sprintf(buf, "user_%d", id);
这种字符串 strings 永远找不到。
常见于:
这时:
strings file
输出可能几乎为空。
有时候以为是:
"hello world"
实际是:
"hello" "world"
或被宏替换。
✅ 结合 grep:
strings -a file | grep -i hello
例如函数名:
main
foo_bar
被 strip 后就没了。
✅ 查看符号:
nm file
objdump -t file
readelf -s file
file yourfile
strings -a -n 1 yourfile | grep -i "关键词"
strings -e l yourfile | grep -i "关键词"
如果你愿意,可以把:
file 输出)发出来,我可以直接帮你判断为什么找不到。