【问题标题】:How to replace a single byte in a binary file using awk如何使用 awk 替换二进制文件中的单个字节
【发布时间】:2021-09-24 02:37:42
【问题描述】:

我正在尝试对 Linux 机器进行逆向工程以刷新我自己的固件,但为此我需要修补一个二进制文件。补丁实际上很简单,我只需要在已知偏移量处更改一个字节。但是,Linux 机器没有 dd、sed、awk 等任何程序。甚至没有 telnet(我通过串行与它通信)。但是,它确实有 sh。有没有办法仅使用 shell 命令替换已知偏移量的字节?

谢谢。

【问题讨论】:

  • 如果它有sh,你为什么要标记为bash?请问哪个?
  • 它有任何脚本语言(Perl、Python、Ruby)吗?它有一个 C 编译器,或者你知道如何交叉编译它吗?
  • 一个 posix 系统应该安装了sed。如果这里不是这种情况,那么您甚至无法确定是否有像echo 这样的基本内容可用(如果我们谈论的是普通的sh 而不是bash,它有一个内置的echo)。要回答这个问题,您必须向我们提供更多关于究竟有什么可用的信息。
  • 抱歉,这是sh,而不是bash。它没有任何脚本语言,即使我可以交叉编译它,我也无法将文件传输过来。但是,我确实有echo
  • 是否有任何编辑器可用,例如ed

标签: unix awk sh


【解决方案1】:

如果您有head -c(posix 未指定-c 选项)、printftail 可用,那么这应该可以:

file=pathToYourFile
address=1234 # `address=1` changes the first byte
newByteOctal=567
{
  head -c "$((address-1))" "$file"
  printf "\\0$newByteOctal"
  tail -c "+$((address+1))" "$file"
} > patchedFiled

如果您没有head -c,但文件非常小并且在偏移量之前没有(!)包含任何空字节,那么您可以将head -c替换为

printf "%.$((offset1based-1))s" "$(< "$file")"

【讨论】:

  • 很遗憾,系统根本没有head,但确实有printf。但是,该文件大约为 1 MB,因此它肯定包含空字节。
  • 也许我忘了提 - 系统有两个独立的部分,它们都有独立的文件系统。其中之一具有您通常需要的所有命令(如headsed 等)。但我需要的是另一个,它没有任何这些命令。这可能是第二个“修剪”系统不符合 posix 标准的原因——为了节省空间。
  • 恐怕仅在sh 中没有办法做到这一点。我能想到的方法必须在某个时候将空字节存储在变量或参数中,这在sh 中是不可能的。如果您提供您实际可以使用的程序列表(echo,...),也许有人会想到一些可行的方法。您不能访问其他文件系统上的二进制文件,例如通过安装它然后使用/mnt/otherfs/bin/head -c?
  • 等一下!在列出系统二进制文件时,我发现我确实有awk!是否可以为此使用awk
  • 可能。我试过LC_ALL=C awk -v RS= -v address=1234 '{printf "%s\567%s", substr($0,0,address-1), substr($0,address+1)}' file &gt; patched,但这有时会开始删除0a字节(\n)以获取更大的文件。现在我没有时间调查这个。但是您可以编辑您的问题以反映当前情况并添加 awk 标签。您不妨添加可用的 awk 版本(检查 awk --versionman awk)。一些 awk 大师可能会找到方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-29
  • 1970-01-01
  • 2010-10-19
相关资源
最近更新 更多