Eu tenho exatamente o mesmo problema que você há anos também.
Para usos não interativos simples, eu gosto de usar o editor de blocos binários BBE . O BBE é tão binário quanto o SED é o texto, incluindo sua sintaxe e simplicidade arcaica; no entanto, ele tem muitos recursos ausentes do que eu geralmente preciso, então eu tenho que combiná-lo com outras ferramentas. Portanto, o BBE é apenas uma solução parcial. Observe também que o BBE não possui atualizações ou aprimoramentos há anos.
Obviamente, é possível usar xxd
antes e xxd -r
depois da edição dos 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 dispositivos de bloco.
(Nota: para Windows, existe pelo menos a linguagem de script cara e proprietária do WinHex, mas isso não nos leva a lugar algum.)
Para uma edição binária mais complicada, normalmente eu também recorro ao Python, mesmo que às vezes seja muito lento para arquivos grandes, que é sua principal desvantagem. Espero que o Pyston (Python empregando LLVM para compilar com código de máquina otimizado) algum dia amadureça o suficiente para ser utilizável, ou melhor ainda, alguém crie e implemente uma linguagem de script de processamento binário compacta, rápida e versátil, gratuita, para a qual o AFAIK não existe U * IX como sistemas ainda.
ATUALIZAR
Por acaso, também uso o homebrew, o open source Intel x86 assembler flat assembler , ou fasm, que evoluiu para muito mais do que apenas um assembler.
Ele possui um poderoso pré-processador de macro baseado em bloco de texto (uma linguagem completa e completa) com uma sintaxe na tradição da linguagem macro borland turbo assembler, mas muito mais avançada.
Além disso, possui uma linguagem de manipulação de dados, que permite incluir arquivos arbitrários em binários, executar todos os tipos de manipulação binária e aritmética (somente número inteiro) em "tempo de compilação" e gravar o resultado em um arquivo de saída. Essa linguagem de manipulação de dados possui estruturas de controle e também está completa.
É muito mais fácil usar do que escrever um programa que faça alguma manipulação binária em C e provavelmente até em python. Além disso, ele carrega muito rápido, pois é um executável de tamanho pequeno com quase nenhuma dependência externa (existem duas versões: ele requer apenas libc ou pode ser executado como um executável estático diretamente no ABI do kernel Linux).
Ele tem algumas arestas, como
não suporta simultaneidade
sendo gravado no assembly x86 de 32 bits (funciona no x86_64), você provavelmente precisará do qemu ou de um emulador similar se quiser executá-lo em qualquer outra coisa que não seja x86 ou x86_64
sua poderosa linguagem de pré-processador macro está completa, significa que é melhor você 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 aumentar, mas não encolher, até que o arquivo de saída tenha sido gravado e terminado com fasm. Isso significa que só é possível gerar arquivos com o tamanho máximo de memória que resta em uma única etapa do fasm.
os dados podem ser gravados apenas em um único arquivo de saída para cada execução do fasm
sim, é homebrew, um muito legal e inteligente embora
chain = ls["-a"] | grep["-v", "\\.py"] | wc["-l"]; chain()
Você já viu isso?