Cadenas que no generan texto encontrado usando grep

Cadenas que no generan texto encontrado usando grep

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 stringsno 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 stringspara 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, stringsde 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 -ay -npara 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 pythonejecutable:

$ 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

stringsimprime las secuencias de caracteres imprimibles que tienen al menos 4 caracteres de longitud. Entonces, si busca grepalgo de menos de 4 caracteres, procesarlo stringsprimero hará que se pierda. Utilícelo strings -n 1para establecer la longitud mínima en 1.

información relacionada