Quando posso editar strings em um binário executável?

14

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

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

Eu preciso alterar a string /usr/share/foo para /usr/share/bar . Posso apenas substituir a string por sed ?:

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

Isso parece uma coisa segura para fazer. Isso também funcionará quando as strings não tiverem o mesmo tamanho?

    
por Martin Vegter 08.03.2015 / 02:31

1 resposta

17

Eu não sei se sua versão de sed será binária limpa ou se vai se engasgar com o que ela acha que são realmente linhas longas em sua entrada, mas, salvo esses problemas, editar a string in-place deve funcionar. Para ver se isso acontece, compare as versões antiga e nova com cmp -l . Ele deve informar se as três únicas diferenças entre os dois arquivos são aqueles 3 bytes.

Editar strings em um executável compilado realmente funcionará se as strings forem do mesmo tamanho, mas quase sempre também funcionará se você estiver encurtando a string, devido à maneira como as strings trabalham em C. Em strings C, tudo depois que o NUL terminator não conta, então se você escrever um novo NUL terminator antes da posição do antigo, você efetivamente encurtará a string.

Em geral, não há como alongar uma string usando esse hack.

    
por 08.03.2015 / 02:37