在 Debian 中自定义 strings 的两种常见场景
- 场景一:你指的是 GNU strings 工具(从二进制中提取可打印字符串)。该工具本身不提供“自定义要提取的内容”的开关,但可以通过选项显著调整提取与输出,例如最小长度、编码、输出格式与偏移量等。
- 场景二:你指的是 Debian 软件包中的文本字符串(如程序界面、帮助文本、桌面文件、日志提示等)。这类字符串通常来自程序的源码与翻译文件(如 .po/.mo),需要在打包或安装阶段进行替换或本地化。
场景一 自定义 GNU strings 的输出与过滤
- 基本用法
- 仅显示长度至少为 6 的字符串:
- 命令:
strings -n 6 your_binary
- 输出格式与偏移
- 显示文件偏移量(十六进制):
strings -t x your_binary
- 显示文件偏移量(十进制):
strings -t d your_binary
- 显示文件偏移量(八进制):
strings -t o your_binary
- 字符编码
- 指定编码提取:-e ascii|utf8|ibm(如
strings -e utf8 your_binary)
- 扫描范围与多文件
- 扫描整个文件(包含非文本段):
strings -a your_binary
- 对目录内所有文件执行并带文件名前缀:
strings -a -f /path/to/dir/*
- 组合示例
- 提取长度 ≥ 8 的 ASCII 字符串并显示偏移量:
- 命令:
strings -n 8 -t x -e ascii your_binary
- 批量提取并保存到文件:
- 命令:
strings -a -f /usr/bin/* > all_strings.txt
说明:strings 是只读分析工具,不能改变二进制内部字符串;如需“改变显示内容”,应结合 grep/sed/awk 等做后处理,或在构建阶段替换源字符串。
场景二 自定义 Debian 软件包中的字符串
- 应用级本地化(gettext,适用于你可控源码的应用)
- 安装工具:
sudo apt-get install gettext
- 从源码提取模板:
xgettext --language=Python --keyword=_ -o messages.pot your_app.py
- 初始化中文翻译:
msginit --input=messages.pot --locale=zh_CN --output=messages_zh_CN.po
- 编辑 messages_zh_CN.po,修改或新增翻译条目,然后编译:
- 命令:
msgfmt --output-file=messages_zh_CN.mo messages_zh_CN.po
- 在程序中使用 _(‘要翻译的字符串’),部署时将 .mo 安装到正确路径(如 /usr/share/locale/zh_CN/LC_MESSAGES/your_app.mo)。
- 打包时替换字符串(适用于你维护或打补丁的 Debian 包)
- 在源码树中直接修改需要变更的 .c/.cpp/.py 等源文件中的字符串常量,或使用补丁(quilt)在 debian/patches/ 中维护变更,构建时自动应用。
- 修改界面/文档/帮助文本:替换相应 .ui/.txt/.md 等文件内容。
- 安装后脚本定制:在 debian/yourpkg.postinst 中写入脚本,用 sed/awk 替换配置文件或生成自定义文本(谨慎处理,避免破坏包升级)。
- 构建与校验:使用 dpkg-buildpackage 构建 .deb,用
dpkg-deb -R yourpkg.deb out/ 解包核对文件是否已按预期替换。
实用建议与注意事项
- 使用 strings 做安全或合规审计时,建议:
- 从基础分析开始,逐步增加过滤条件(如最小长度 -n 6/8、偏移量 -t x),并将结果重定向到文件以便复查。
- 与 grep -i “version|firmware|build”、正则等组合,快速定位版本、固件、IP、凭据等关键信息。
- 对未知或可疑二进制,请在隔离环境(虚拟机/沙箱)进行静态分析,避免执行。