
Estou procurando determinadas strings em arquivos executáveis (Windows).
Primeiro comecei com
grep -a string file
já que trata arquivos binários como arquivos de texto. O problema é que não há uma saída organizada, as quebras de linha acontecem por acaso (quando os bytes corretos estão em ordem) etc.pp.
Então pensei em usar strings:
strings file | grep -i string
Para minha surpresa, 'strings' não encontra strings que consegui encontrar usando 'grep -a'. No entanto, 'strings' é bom porque exibe cada item de tudo o que encontra em uma nova linha.
Como faço para obter o melhor dos dois mundos? Significa que quero realmente encontrar tudo e também obter resultados sensatos do que foi encontrado.
Responder1
Questrings
não encontra os mesmos padrões que sua string provavelmente é causado pela strings
localização de padrões com pelo menos 4 caractereseseguido por um caractere não imprimível. De man strings
para GNU strings
:
For each file given, GNU strings prints the printable character
sequences that are at least 4 characters long (or the number given
with the options below) and are followed by an unprintable character.
Além disso, strings
por padrão, verifica apenas seções inicializadas e carregadas de arquivos de objeto, o que pode reduzir ainda mais o número de linhas de saída.
Você pode tentar as opções -a
e -n
para alterar esse comportamento:
strings -n 1 -a file | grep -i string
Isso deve lhe render mais cordas e provavelmente tudo o que você espera.
Diferença na saída do meu python
executável:
$ strings $(which python) | wc
31923 68075 474068
$ strings -n 1 $(which python) | wc
501231 531837 1541204
$ strings -n 1 -a $(which python) | wc
501398 531995 1541762
Responder2
Por que não:
grep -a string file | strings
strings
imprime as sequências de caracteres imprimíveis com pelo menos 4 caracteres. Portanto, se você grep
precisar de algo menor que 4 caracteres, o processamento via strings
primeiro fará com que ele seja perdido. Use strings -n 1
para definir o comprimento mínimo como 1.