Quando posso editar seqüências de caracteres em um binário executável?

12

Eu tenho um binário executável; vamos chamá-lo a.out. Eu posso ver o binário contém cadeias

$ strings a.out
...
/usr/share/foo
....

Eu preciso mudar a string /usr/share/foopara /usr/share/bar. Posso apenas substituir a string por sed?:

sed -i 's@/usr/share/foo@/usr/share/bar@' a.out

Parece uma coisa segura a se fazer. Isso também funcionará quando as seqüências não tiverem o mesmo comprimento?

Martin Vegter
fonte

Respostas:

17

Não sei se a sua versão do sedserá binária-limpa ou se engasgará com o que ela acha que são realmente longas filas em sua entrada, mas, salvo esses problemas, a edição da string no local deve funcionar. Para ver se existe, compare as versões antiga e nova com cmp -l. Deve informar se as únicas três diferenças entre os dois arquivos são ou não esses 3 bytes.

Editar cadeias de caracteres em um executável compilado realmente funcionará se as cadeias de caracteres tiverem o mesmo comprimento, mas quase sempre também funcionará se você estiver encurtando a cadeia, devido à maneira como as cadeias funcionam em C. Nas cadeias C, tudo depois do NULterminador não conta, portanto, se você escrever um novo NULterminador antes da posição do antigo, reduzirá efetivamente a string.

Em geral, não há como você prolongar uma string usando esse hack.

Celada
fonte
Que tal encurtar a corda com algo parecido sed -i 's@longstring@foo@' a.out? Isso tornará o binário inteiro menor em 7 bytes. Isso não corromperá o binário?
Martin Vegter 9/03/15
Sim, ele corromperá o binário. É por isso que você precisa traduzir a string para o mesmo comprimento, mas coloque um NULterminador em uma posição anterior, como expliquei (embora talvez por pouco tempo). O problema é que você não pode ter um NULbyte na linha de comando, portanto, você deve colocar seu sedprograma em um arquivo e consultá-lo com -f. Por outro lado, a coisa mais segura a se fazer seria usar uma ferramenta projetada para trabalhar com dados binários, em vez de sedprojetar para trabalhar com dados de texto.
Celada
2
Boa resposta. O sed pode fazer muitas coisas, mas, em geral, é para isso que os editores binários foram inventados. Eles podem ser difíceis de usar ao navegar dentro de um arquivo binário grande, mas permitem alterar as coisas byte a byte. Uso hexeditquando tenho que examinar ou alterar um arquivo binário. Você pode usar strings -t x file | lesspara localizar os deslocamentos das cadeias (imprimíveis) que deseja alterar antes de pular para o editor.
22415 Joe
Digamos que eu tenha uma string no meu programa C: "Meu nome era Sr. Robot" e quero substituir 'was' por 'is', então o preenchimento \0terá que ser feito com cuidado, porque se a substituição fizer isso: "Meu nome é \ 0 Mr Robot "e, ao executar operações com a string, o caractere '\ 0' criará problemas, pois o comprimento será reduzido sem intenção.
Nehal J Wani
@NehalJWani não, nesse caso, você teria que mudar todo o restante da string para a frente em um byte, para que sua nova terminação extra NULcontinue no final, adjacente à existente NUL.
Celada