
Estoy buscando ciertas cadenas en archivos ejecutables (Windows).
Primero comencé con
grep -a string file
ya que trata los archivos binarios como archivos de texto. El problema es que no hay una salida ordenada, los saltos de línea ocurren por casualidad (cuando los bytes correctos vienen en orden), etc.pp.
Entonces pensé en usar cadenas:
strings file | grep -i string
Para mi sorpresa, 'cadenas' no encuentra cadenas que pude encontrar usando 'grep -a'. Sin embargo, 'cadenas' es agradable porque genera cada elemento de lo que encuentra en una nueva línea.
¿Cómo obtengo lo mejor de ambos mundos? Lo que significa que realmente quiero encontrar todo y también obtener resultados razonables de lo que se encontró.
Respuesta1
Lo más probable es que eso strings
no encuentre los mismos patrones que su cadena.strings
encuentra patrones de al menos 4 caracteres de largo.yseguido de un carácter no imprimible. 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.
Además de eso, strings
de forma predeterminada, solo escanea las secciones inicializadas y cargadas de los archivos objeto, lo que podría reducir aún más la cantidad de líneas de salida.
Puedes probar las opciones -a
y -n
para cambiar ese comportamiento:
strings -n 1 -a file | grep -i string
Eso debería proporcionarle más hilos, y probablemente todo lo que espera.
Diferencia en la salida de mi python
ejecutable:
$ 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
Respuesta2
Por qué no:
grep -a string file | strings
strings
imprime las secuencias de caracteres imprimibles que tienen al menos 4 caracteres de longitud. Entonces, si busca grep
algo de menos de 4 caracteres, procesarlo strings
primero hará que se pierda. Utilícelo strings -n 1
para establecer la longitud mínima en 1.