Use dd
.
Ele pode fazer muito, mas você precisa da seguinte forma:
dd if=<source> of=<destination> bs=<block size> count=<blocks> skip=<offset>
Por exemplo, para copiar o segundo para o quarto kilobyte de um arquivo, você faria:
dd if=in.dat of=out.dat bs=1K count=2 skip=2
Dados os detalhes do que você está tentando fazer, você também pode tentar adicionar conv=sync,noerror
:
dd if=in.dat of=out.dat bs=1K count=2 skip=2 conv=sync,noerror
O noerror
faz com que ele tente continuar quando encontra um erro, e o sync
faz com que o bloco falhe em blocos com zeros. Então, idealmente, você obteria o arquivo desejado, mas com zeros para os blocos que ele não conseguia ler. No entanto, depende do seu disco rígido o que ele realmente fará. Alguns discos rígidos simplesmente desligam quando vêem um erro e você ainda não obtém seus dados.