【问题标题】:find and overwrite string in a binary file using a script使用脚本查找并覆盖二进制文件中的字符串
【发布时间】:2020-03-09 12:33:00
【问题描述】:

二进制文件file.f1

其中有字符串abc我想用adcd覆盖它

perl -pi -e s/abc/abcd/ file.f1

有效,但它插入而不是覆盖它,这会导致使用它的程序出错

我不确定如何在不让事情变得更复杂的情况下做到这一点, 我更喜欢它使用 sed、grep、python、perl 等工具,这些工具在 UNIX 系统上默认可用

我不是很有经验的用户,对这些工具很陌生

编辑-希望现在清楚

bin文件里面的数据是这样的

[abc def xyz]

在做perl -pi -e s/abc/abcd/ file.f1

它变成 [abcd def xyz]

我想要的是用额外的[空格]覆盖它,这样它就变成了

[abcd ef xyz]

【问题讨论】:

  • 这取决于它是什么类型的二进制文件。二进制文件通常非常严格。没有通用的答案。添加或删除字节可能是一个非首发。
  • 您不想更改二进制文件中的字节。至少您不想更改文件的长度。二进制文件通常在文件的字节中编码长度、类型等。将abc 更改为abcd,其中'd' 最初用作2137 元素数组中的元素数——这将导致读取该文件的代码出现真正的问题。在进行任何更改之前,您必须知道文件的使用方式。
  • 我可以使用具有“覆盖模式”的 gui 十六进制编辑器应用程序来做同样的事情,但我想创建一个脚本来自动化相同的过程
  • @DavidRankin-ReinstateMonica 我明白了,因为我已经在十六进制编辑器中修改了文件,我知道如果 abcd 被覆盖它会导致下一个字符串重叠,这很好,因为值用空格分隔,假设有 [abc def] 所以我可以添加 'abcd+[space]' 这将导致 [abcd ef] 和 'def' 之后的值对程序并不重要
  • 您是否有机会共享示例输入文件(可能只有几行十六进制格式)?这将使提供解决方案变得更加容易。

标签: bash shell replace binary


【解决方案1】:
perl -pi -e 's/blue/red/g' $file_name

末尾的g 是必需的。另一个可以使用的工具是 sed 用于这些类型的任务。

Another post about using perl

【讨论】:

    【解决方案2】:

    您正在尝试patch 一个二进制文件。 Perl RE 没有为这种类型的进程设置。虽然它们会在最长时间内工作,但特定的序列可能会欺骗 RE 引擎,它假定文件是文本。 小心使用

    要获得替换,请使源字符串与目标字符串的长度匹配

    perl -pi -e 's/abc./abcd/' file.f1
    

    Perl 将用 abcd 替换以 abc 开头的前 4 字节字符串。如果您怀疑第 4 个字符可能很特殊(例如换行符或类似字符),请使用单行模式。它将允许'。匹配任何字符。

    perl -pi -e 's/abc./abcd/s' file.f1
    

    【讨论】:

    • 有没有办法指定多个字符
    • 对于 Perl RE,每个 '.'在源中将匹配单个字符。确保将替换字符串延长相同的长度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 2021-06-12
    • 2021-12-01
    • 1970-01-01
    • 2013-11-30
    • 2011-10-11
    相关资源
    最近更新 更多