Eu tenho exatamente o mesmo problema que você por anos também.
Para usos não-interativos simples, eu gosto de usar o editor de bloco binário BBE .
O BBE é para o binário como o SED é para o texto, incluindo sua sintaxe arcaica e simplicidade, no entanto, ele tem muitos recursos ausentes do que eu frequentemente preciso, então eu tenho que combiná-lo com outras ferramentas. Então, o BBE é apenas uma solução parcial.
Observe também que o BBE não tem atualizações ou melhorias há anos.
É claro que é possível usar xxd
before e xxd -r
após editar os dados com ferramentas baseadas em texto, mas isso não funcionará quando os dados em questão forem grandes e for necessário acesso aleatório, por exemplo, ao processar o bloco dispositivos.
(Nota: Para Windows, existe pelo menos a linguagem de script WinHex cara e proprietária, mas isso não nos levará a lugar algum.)
Para uma edição binária mais complicada, geralmente também recorro ao Python, mesmo que às vezes seja muito lento para arquivos grandes, o que é a principal desvantagem. Espero que o Pyston (Python que emprega o LLVM para compilar para código de máquina otimizado) algum dia amadureça o suficiente para ser utilizável, ou melhor ainda, alguém irá projetar e implementar uma linguagem de script de processamento binário compacta, rápida e versátil, que ainda não existe para sistemas semelhantes ao U * IX.
UPDATE
Eu também uso o homebrew, o assembler de código aberto Intel x86 flat assembler , ou fasm para curtos, que evoluiu para muito mais do que apenas um montador.
Ele possui um poderoso pré-processador de macro baseado em textblock (ele próprio uma linguagem completa) com uma sintaxe na tradição da linguagem macro turbo assembler da borland, mas muito mais avançada.
Além disso, ele possui uma linguagem de manipulação de dados, que permite incluir arquivos arbitrários binários, fazer todos os tipos de manipulação binária e aritmética (somente inteiro) em "tempo de compilação" e gravar o resultado em um arquivo de saída. Esta linguagem de manipulação de dados tem estruturas de controle e também está completa.
É muito mais fácil de usar do que escrever um programa que faça alguma manipulação binária em C e provavelmente até mesmo em python. Além disso, ele carrega rapidamente, já que é um executável de pequeno porte com quase nenhuma dependência externa (Existem 2 versões: ou requer apenas libc ou pode ser executado como um executável estático diretamente na ABI do kernel Linux).
Ele tem algumas bordas de ruff, como
-
não suporta simultaneidade
-
sendo escrito em um assembly x86 de 32 bits (no x86_64, no entanto), você provavelmente precisará do qemu ou de um emulador similar se quiser executá-lo em algo diferente de x86 ou x86_64
-
é poderosa a linguagem de pré-processamento de macros concluída, isso significa que é melhor ter alguma experiência com linguagens como Lisp, Haskell, XSLT ou, provavelmente, M4 seria a melhor escolha.
-
todos os dados a serem gravados no arquivo de saída são executados em um buffer "simples" na memória, e esse buffer pode crescer, mas não diminuir até que o arquivo de saída tenha sido gravado e terminado em fasm. Isso significa que só é possível gerar arquivos tão grandes quanto a memória principal deixada em uma única execução de fasm.
-
os dados só podem ser gravados em um único arquivo de saída para cada execução de fasm
-
sim, é homebrew, realmente interessante e inteligente