You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何无需重新编译,用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:53:41