CLI:在地址处写入字节(来自命令行的hexedit/modify binary)

Jos*_*osh 39 shell scripting hex patch edit

是否有任何直接的方法来修改命令行中的二进制文件?假设我知道我的二进制包含1234abcd,我想将其更改为12FFabcd或FFFFabcd,甚至可能是FF34FFab0(你明白了):-)

如果不使用任何特殊用途工具(如http://stahlworks.com/dev/swiss-file-knife.html或类似工具),我将如何实现这一目标.

只使用标准的linux工具从命令行执行它会很棒.

或者甚至更好,而不是搜索十六进制字符串,我想直接替换在Offset 0x10000处写入FF,在Offset 0x100001处写入12,依此类推.

任何的想法?

提前致谢!

PS:我应该添加以下内容:

它应该是可编写脚本的,并直接从命令行运行.我正在寻找类似"二进制 - 包含在发行版 - 写入AB --at-offset 100000 --file thebinary.bin"之类的内容.我很确定使用"dd"是可能的,但是我无法绕过手册页.

Jos*_*osh 75

printf '\x31\xc0\xc3' | dd of=test_blob bs=1 seek=100 count=3 conv=notrunc 
Run Code Online (Sandbox Code Playgroud)

dd参数:

  • | 文件补丁
  • bs | 请一次1个字节
  • 寻求 | 转到位置100(十进制)
  • conv = notrunc | 编辑后不截断输出(默认为dd)

一个乔希正在寻找另一个;)

  • 美丽优雅的解决方案!是否也可以使用此命令插入字节?或者将修补后的文件输出到不同的文件名?或者寻找位置基于像文件大小这样的变量? (2认同)

Aut*_*act 8

printf+dd基础的解决方案似乎并没有写出来零工作.这是python3中的通用解决方案(包含在所有现代发行版中),它应该适用于所有字节值...

#!/usr/bin/env python3
#file: set-byte

import sys

fileName = sys.argv[1]
offset = int(sys.argv[2], 0)
byte = int(sys.argv[3], 0)

with open(fileName, "r+b") as fh:
    fh.seek(offset)
    fh.write(bytes([byte]))
Run Code Online (Sandbox Code Playgroud)

用法...

set-byte eeprom_bad.bin 0x7D00 0
set-byte eeprom_bad.bin 1000 0xff
Run Code Online (Sandbox Code Playgroud)

注意:此代码可以处理十六进制(前缀为0x)和十进制(无前缀)的输入数字.

  • 重要的是你在 python3(不是 python2)中运行它,否则你最终会编写列表的文字字符串表示:`[byte]` (2认同)
  • printf+dd 在写出零时起作用,因为必须使用“conv=notrunc”选项。 (2认同)
  • printf '\x00\x00\x00\x00' | '\x00\x00\x00\x00' | dd of=blah bs=1 seek=24 count=4 conv=notrunc 有效(Linux Mint 20) (2认同)

sin*_*raj 6

这是一个Bash函数replaceByte,它采用以下参数:

  • 文件的名称,
  • 要重写的文件中的字节偏移量,和
  • 字节的新值(一个数字).
#!/bin/bash

# param 1: file
# param 2: offset
# param 3: value
function replaceByte() {
    printf "$(printf '\\x%02X' $3)" | dd of="$1" bs=1 seek=$2 count=1 conv=notrunc &> /dev/null
}

# Usage:
# replaceByte 'thefile' $offset 95
Run Code Online (Sandbox Code Playgroud)


Dan*_*ing 1

如果您不需要它可编写脚本,您可以尝试hexedit实用程序。它在许多 Linux 发行版中都可用(如果默认情况下未安装,通常可以在发行版的软件包存储库中找到它)。

如果您的发行版没有它,您可以从源代码构建并安装它