portable online imagen hexadecimal shell scripting hex patch edit
HexAlter

shell - online - CLI: escribe el byte en la dirección(hexedit/modifica el binario desde la línea de comando)



hex editor portable (7)

Algunas alternativas:

¿Hay alguna manera directa de modificar un binario desde la línea de comando? Digamos que sé que mi binario contiene 1234abcd y quiero cambiarlo a 12FFabcd o FFFFabcd o quizás incluso a FF34FFabc0 (ya entiendes) :-)

¿Cómo podría lograr eso sin usar herramientas especiales como http://stahlworks.com/dev/swiss-file-knife.html o similar?

Sería genial hacerlo solo desde la línea de comandos con solo las herramientas estándar de Linux.

O tal vez incluso mejor en lugar de buscar la cadena hexadecimal que deseo reemplazar directamente escribiendo FF en el Offset 0x10000, 12 en Offset 0x100001 y así sucesivamente.

¿Alguna idea?

¡Gracias por adelantado!

PD: Debería añadir lo siguiente:

Debe ser programable y ejecutarse directamente desde la línea de comandos. Estoy buscando algo como "binary-which-is-included-in-the-distro --write AB --at-offset 100000 --file thebinary.bin". Estoy bastante seguro de que es posible con "dd", pero no pude rodear la página del manual.


Aquí hay una función Bash replaceByte , que toma los siguientes parámetros:

  • el nombre del archivo,
  • un desplazamiento del byte en el archivo para reescribir, y
  • el nuevo valor del byte (un número).

#!/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


Escribir el mismo byte en dos posiciones diferentes en el mismo archivo con un forro.

printf ''/x00''| tee >(dd of=filename bs=1 count=1 seek=692 conv=notrunc status=none) / >(dd of=filename bs=1 count=1 seek=624 conv=notrunc status=none)

status = none muy útil cuando no quieres estadísticas fuera de dd.


La herramienta xxd, que viene con vim (y por lo tanto es muy probable que esté disponible) permite realizar un volcado hexadecimal de un archivo binario y construir un nuevo archivo binario a partir de un volcado hexadecimal modificado.


Las soluciones basadas en printf+dd no parecen funcionar para escribir ceros. Aquí hay una solución genérica en python3 (incluida en todas las distribuciones modernas) que debería funcionar para todos los valores de bytes ...

#!/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]))

Uso...

set-byte eeprom_bad.bin 0x7D00 0 set-byte eeprom_bad.bin 1000 0xff

Nota: este código puede manejar números de entrada tanto en hexadecimal (prefijado por 0x) como en dec (sin prefijo).


Si no necesita que sea programable, puede probar la utilidad "hexedit". Está disponible en muchas distribuciones de Linux (si no se instala de forma predeterminada, generalmente se puede encontrar en el repositorio de paquetes de la distribución).

Si su distribución no lo tiene, puede compilarlo e instalarlo desde la fuente .


printf ''/x31/xc0/xc3'' | dd of=test_blob bs=1 seek=100 count=3 conv=notrunc

argumentos dd:

  • de | archivo a parche
  • bs | 1 byte a la vez por favor
  • buscar | ir a la posición 100 (decimal)
  • conv = notrunc | no trunca la salida después de la edición (que dd lo hace por defecto)

Un Josh buscando otro;)