如何无需重新编译,用Bash编写脚本编辑可执行文件?
如何编写脚本修改二进制可执行文件中的单个单词
嘿,这个需求得先敲个警钟:直接修改二进制可执行文件风险不小,哪怕是副本,也得确保你清楚操作的后果——尤其是像bash这种复杂程序,稍有不慎就会让整个程序彻底失效。不过只要遵守关键规则,还是能实现的。
核心前提(必须遵守!)
替换的新旧字符串长度必须完全相同。二进制文件的结构依赖固定的字节偏移,长度变化会打乱后续所有数据的位置,直接导致程序崩溃。比如把bash换成dash(都是4个字符)没问题,但换成zsh(3个)或者zshh(5个)绝对不行。
方案1:用xxd + sed(系统默认工具,无需额外安装)
xxd可以把二进制文件转成十六进制文本,用sed替换后再转回去,适合大多数Linux系统。
脚本示例
#!/bin/bash # 配置你的参数 OLD_WORD="bash" NEW_WORD="dash" TARGET="/path/to/your/bash_copy" # 先检查长度是否一致 if [ ${#OLD_WORD} -ne ${#NEW_WORD} ]; then echo "❌ 错误:新旧单词长度必须完全相同!" exit 1 fi # 1. 把二进制转成十六进制文本 xxd "$TARGET" > temp.hex # 2. 替换对应的十六进制串(用xxd把字符串转成十六进制避免编码问题) sed -i "s/$(echo -n "$OLD_WORD" | xxd -p)/$(echo -n "$NEW_WORD" | xxd -p)/g" temp.hex # 3. 把修改后的十六进制转回到二进制 xxd -r temp.hex "$TARGET" # 清理临时文件 rm temp.hex echo "✅ 替换完成!赶紧测试修改后的文件能不能正常运行~"
关键细节
echo -n:避免给字符串额外加换行符,保证十六进制转换准确。xxd -p:输出纯十六进制内容,不带地址和行号,方便sed替换。
方案2:用bbe(专门的二进制编辑工具)
bbe是Binary Block Editor,专门为二进制文件设计,语法更直观,需要先安装:
# Debian/Ubuntu sudo apt install bbe # RHEL/CentOS sudo yum install bbe
脚本示例
#!/bin/bash OLD_WORD="bash" NEW_WORD="dash" TARGET="/path/to/your/bash_copy" if [ ${#OLD_WORD} -ne ${#NEW_WORD} ]; then echo "❌ 错误:新旧单词长度必须完全相同!" exit 1 fi # 直接替换二进制中的字符串,-o指定输出文件(这里直接覆盖原文件) bbe -e "s/$OLD_WORD/$NEW_WORD/g" "$TARGET" -o "$TARGET" echo "✅ 替换完成!"
最后必做的测试
替换完一定要验证文件是否正常:
# 给副本加执行权限(如果还没有) chmod +x /path/to/your/bash_copy # 运行副本 ./path/to/your/bash_copy # 执行几个简单命令测试,比如 echo "Hello World" ls -l
如果一切正常,说明替换成功;如果出现崩溃或异常,立刻用备份恢复!
内容的提问来源于stack exchange,提问作者Alex_DeLarge
相关产品推荐
相关产品推荐

