如何用Linux strings查找特定字符串模式

哎呀,在Linux系统上,如果我们想在二进制文件中查找特定的字符串,有很多种方法。
关于第一份报告。
我们使用字符串和 grep。
这两款产品就像过去的合作伙伴一样协同工作。
你将从字符串中提取的字符通过管道传递到圈中,它会帮助你过滤出你想要的模式。
例如,如果您想在 example.bin 中查找包含“ERROR”的字符串,请执行以下操作:
字符串 example.bin | grep '错误'
这就够了。
如果想要不敏感,添加 -i:
模块 字符串 example.bin | grep -i '错误'
方法二:使用grep直接扫描二进制文件。
您需要添加 -a 或 --text 选项,以便 grep 处理二进制文件而不是文本。
例如直接在example.bin中搜索“Warning”:
grep -a '警告' example.bin
如果不敏感,只需添加-i:
grep -ai '警告' example.bin
第三种方法是使用专门的搜索工具,例如ack或ag。
这两个工具在大型项目中特别有用。
不需要跳过二进制文件,速度也很快。
例如:ack安装:
Debian/Ubuntu: sudo apt install ack-grep CentOS/RHEL:sudo yum install epel-release && sudo yum install ack
然后搜索:
ack '示例' /path/to/directory
Ag 安装(Silver Investigator)类似于:
Debian/Ubuntu: sudo apt install silversearcher-ag CentOS/RHEL: sudo yum install epel-release && sudo yum install the_silver_searcher
然后搜索:
ag '表单' /path/to/directory
方法四,我们还可以连接正则表达式,使用grep -E来帮助扩展的正则表达式匹配多样性。
例如:
字符串 example.bin | grep -E '模式1 |模式2 '
直接使用grep:
grep -aE '错误|警告' example.bin
值得注意的是,性能考虑很重要。
对于大文件使用 ack 或 ag。
不要拉出所有的绳子,那是浪费资源。
注意所描述的问题。
非 ASCII 可能会出现乱码。
先使用字符串提取出来,然后再进行搜索。
您还必须拥有权限。
您必须具有读取目标文件的权限。
使用 chmod 授予权限。

实际场景,在firmware.bin中查找所有字符串“Version”或“Build”:
字符串固件.bin | grep -E '版本|构建'
忽略搜索“严重”错误的原因:
grep -ai '关键' log.bin
使用ag在项目目录下递归查找“TODO”注释:
ag 'TODO' /src/
这样,这些方法就可以让您灵活应对不同场景下的字符串搜索需求,效率高、准确率高。

如何通过Linux strings命令提取特定类型的字符串

老实说,使用 strings+grep+regex 来提取二进制文件中的特定字符串。
问题的要点是“过滤规则必须精确”,并且不排除不需要的规则。

我们先来说说最重要的事情。
去年我们运行了一个恶意软件分析项目并直接使用字符串。
结果,一群不良人物介入了权力。
花了两天时间才正确设置grep的-E参数。
例如,要匹配IP地址,((2 5 [0-5 ]|2 [0-4 ][0-9 ]|[01 ]?[0-9 ][0-9 ]?).){3 }(2 5 [0-5 ]|2 [0-4 ][0-9 ]|[01 ]?[0-9 ][0-9 ]?),否则也可以匹配无效的IP地址,例如0.0.0.3 00。
还有一点是,在处理大文件时使用-n参数至关重要。
去年我分析过3 000级的固件。
没有-n,终端直接卡住了。
如果将其更改为 -n8 字符串,它将立即运行。
还有另一个重要的细节。
匹配URL的时候记得加s吗?对于HTTP/HTTPS要处理s,否则http://和https://会计算错误。

一开始我以为正则表达式越复杂越好,但后来发现是错误的。
在固件分析的情况下,[a-zA-Z0-9 ]+就足够了,但必须添加[\.\-]以匹配点。
因此,域名中的句点也被用作分隔符。
等等,还有一件事,在提取特定前缀时不要错过它,比如匹配 config= 参数。
使用 .config= 来匹配 config=1 2 3 和 abcconfig=xyz。

终止建议:小文件可以直接处理。
大文件可以先使用-n8 字符串进行扫描,然后使用grep来关闭网络。
不要只用一条规则来完成所有事情。
逐步加工是最稳定的。

如何用Linux strings命令提取内存中的字符串

Linux strings 命令用起来相当有趣,但说实话,在操作它之前你需要了解其中的风险。
下面我会一步步讲解,难点的部分我会多说几句。

---
1 .首先创建内存转储文件 这一步是基础。
没有这些文件,就什么也做不了。

1 .使用dd命令 命令是这样写的: 巴什 sudo dd if=/dev/mem of=memory_dump.bin bs=1 M

if=/dev/mem:从物理内存读取数据。

of=memory_dump.bin:保存到此文件。

bs=1 M:每次读取1 MB。
您可以将其更改为更大的尺寸以使其更快,但不能太大,否则会冻结。

注意:必须有root权限,否则会报错。
我以前也尝试过,但是傻眼了,因为权限不够。

风险:操作不当可能导致蓝屏,请勿抖手。
记得有一次同事忘记改bs值,创建了一个1 G的文件。
结果内存满了,系统停止运转。

2 .使用LiME工具 这是一个更专业的,叫LinuxMemoryExtractor,比dd更高级。
巴什 首先编译LiME模块 使 sudo insmod Lime.ko
生成转储文件 ./lime -c -o memory_dump.bin

make:编译代码。

insmod:将模块插入内核。

lime -c -o memory_dump.bin:收集内存并保存到文件。

优点:对系统影响小,适合分析。
但是编译和加载的过程有点技术性,当时我也不明白为什么需要加上-c。

---
2 .使用strings命令提取字符串 现在该文件已可用,下一步是提取其中的字符串。

命令很简单: 巴什 strings memory_dump.bin
功能:列出内存转储中可以看到的所有字符串(默认≥4 个字符)。

参数:
-n8 :只显示≥8 个字符,例如密码。

-t x:偏移量以十六进制显示,方便定位。

示例: 巴什 字符串 memory_dump.bin -n8 -t x
---
3 . 过滤和搜索 如果提取很多但只想查找特定字符串怎么办?
使用 grep 过滤: 巴什 字符串内存转储.bin | grep '密码'
说明: | 是一个管道,它将字符串的输出发送到 grep。

高级游戏玩法:
grep -E 'pattern1 |pattern2 ':使用正则表达式,例如查找密码或密钥。

grep -i 'pattern':忽略大小写,也可以找到密码。

---
4 . 保存结果 摘要 不想一直盯着屏幕?
重定向到文件: 巴什 strings memory_dump.bin > extract_strings.txt
追加模式: 巴什 strings another_dump.bin >> extract_strings.txt
这会将多个转储的结果合并到一个文件中。

---
5 .直接分析/proc/kcore(谨慎使用) 还有另一种方法可以直接分析/proc/kcore,从而无需查找转储文件。

命令: 巴什 sudo 字符串 /proc/kcore | grep '密码'
注意:
权限:必须是root。

数据量:可能非常大,终端卡顿是常有的事。

兼容性:并非所有系统都支持,这取决于发行版本。

风险:直接读取内核内存可能会导致系统崩溃。
我试了一次,终端卡了好久,最后硬重启了。

---
安全提示 此操作涉及私有数据,必须明确: 1 . 合法性:您确定可以这样做吗? 密码、密钥等不违法。
2 、系统影响:转储文件可能会降低系统速度,甚至导致蓝屏。
3 .数据保护:不要随意存储提取的文件,并对敏感信息保密。

---
流程图总结 画一个简单的:
1 获取内存转储 ├─ 使用dd: sudodd if=/dev/mem of=memory_dump.bin bs=1 M └─ 或者使用LiME工具(编译+加载模块)
2 . 提取字符串:strings memory_dump.bin -n8 3 . 过滤搜索:字符串... | grep '密码' 4 .保存结果:>extracted_strings.txt 5 .替代方案(谨慎): sudo strings /proc/kcore | grep '模式'
---
说实话,这东西用得好的话很有用,用得不好就麻烦了。
操作前要三思而后行,不要操之过急。

如何用Linux strings提取特定格式的字符串

字符串 -n8 /bin/ls | grep '错误' | awk '{print $2 }'
这是一个陷阱,不要使用 sed 来替换二进制文件。