Cómo usar el comando strings en Linux

¿Quiere ver el texto dentro de un archivo binario o de datos? El comando de cadenas de Linux extrae esos fragmentos de texto, llamados «cadenas», para ti.

Linux está lleno de comandos que pueden parecer soluciones en busca de problemas. El comando de cuerdas definitivamente cae en ese campo. ¿Cuál es su propósito? ¿Existe algún punto en un comando que enumera las cadenas imprimibles desde un archivo binario?

Demos un paso atrás. Los archivos binarios, como los archivos de programa, pueden contener cadenas de texto legible por humanos. ¿Pero cómo puedes verlos? Si usa cat o menos, es probable que termine con una ventana de terminal colgada. Los programas que están diseñados para trabajar con archivos de texto no funcionan bien si se introducen caracteres no imprimibles a través de ellos.

La mayoría de los bytes dentro de un archivo binario no son legibles por humanos y no se pueden imprimir en la ventana del terminal de una manera que tenga sentido. No hay caracteres ni símbolos estándar para representar valores binarios que no se correspondan con caracteres alfanuméricos, puntuación o espacios en blanco. En conjunto, estos se conocen como caracteres «imprimibles». El resto son caracteres «no imprimibles».

Por lo tanto, intentar ver o buscar cadenas de texto en un archivo binario o de datos es un problema. Y ahí es donde entran las cuerdas. Extrae cadenas de caracteres imprimibles de archivos para que otros comandos puedan usar las cadenas sin tener que lidiar con caracteres no imprimibles.

Usando el comando strings

El comando strings no tiene nada de complicado y su uso básico es muy sencillo. Proporcionamos el nombre del archivo que deseamos que las cadenas busquen en la línea de comando.

  Cómo instalar la actualización de Linux 5.0 en Ubuntu 18.04 LTS

Aquí, usaremos cadenas en un archivo binario, un archivo ejecutable, llamado «jibber». Escribimos cadenas, un espacio, «jibber» y luego presionamos Enter.

strings jibber

Jibber de cadenas en una ventana de terminal

Las cadenas se extraen del archivo y se enumeran en la ventana de terminal.

salida de cadenas en una ventana de terminal

Configuración de la longitud mínima de la cuerda

De forma predeterminada, las cadenas buscarán cadenas de cuatro caracteres o más. Para establecer una longitud mínima más larga o más corta, use la opción -n (longitud mínima).

Tenga en cuenta que cuanto menor sea la longitud mínima, mayores serán las posibilidades de que vea más basura.

Algunos valores binarios tienen el mismo valor numérico que el valor que representa un carácter imprimible. Si dos de esos valores numéricos están uno al lado del otro en el archivo y especifica una longitud mínima de dos, esos bytes se informarán como si fueran una cadena.

Para pedirle a las cadenas que usen dos como longitud mínima, use el siguiente comando.

strings -n 2 jibber

strings -n 2 jibber en una ventana de terminal

Ahora tenemos cadenas de dos letras incluidas en los resultados. Tenga en cuenta que los espacios se cuentan como un carácter imprimible.

salida de cadenas con cadenas de dos letras en una ventana de terminal

Tubería de cuerdas a través de Less

Debido a la longitud de la salida de las cadenas, la canalizaremos menos. Luego podemos desplazarnos por el archivo en busca de texto de interés.

strings jibber | less

cuerdas jibber |  menos en una ventana de terminal

La lista ahora se nos presenta en menos, con la parte superior de la lista mostrada primero.

cadenas de salida en menos en una ventana de terminal

Usar cadenas con archivos de objeto

Normalmente, los archivos de código fuente del programa se compilan en archivos de objeto. Estos están vinculados con archivos de biblioteca para crear un archivo ejecutable binario. Tenemos el archivo de objeto jibber a mano, así que echemos un vistazo dentro de ese archivo. Tenga en cuenta la extensión de archivo «.o».

jibber.o | less

jibber.o |  menos en una ventana de terminal

El primer conjunto de cadenas se envuelve en la columna ocho si tienen más de ocho caracteres. Si se han ajustado, aparece un carácter «H» en la columna nueve. Puede reconocer estas cadenas como sentencias SQL.

  Cómo jugar juegos de Sega DreamCast en Linux

cadenas de salida en menos en una ventana de terminal

El desplazamiento por la salida revela que este formato no se utiliza en todo el archivo.

cadenas de salida en menos en una ventana de terminal

Es interesante ver las diferencias en las cadenas de texto entre el archivo objeto y el ejecutable terminado.

Búsqueda en áreas específicas del archivo

Los programas compilados tienen diferentes áreas dentro de sí mismos que se utilizan para almacenar texto. De forma predeterminada, las cadenas buscan texto en todo el archivo. Esto es como si hubiera usado la opción -a (todo). Para que las cadenas busquen solo en secciones de datos cargadas e inicializadas en el archivo, use la opción -d (datos).

strings -d jibber | less

cuerdas -d jibber |  menos en una ventana de terminal

A menos que tenga una buena razón para hacerlo, también puede usar la configuración predeterminada y buscar en todo el archivo.

Impresión de la compensación de cadena

Podemos hacer que las cadenas impriman el desplazamiento desde el inicio del archivo en el que se encuentra cada cadena. Para hacer esto, use la opción -o (desplazamiento).

strings -o parse_phrases | less

cadenas -o parse_phrases |  Menos

El desplazamiento se da en Octal.

cadenas con el desplazamiento en octal en una ventana de terminal

Para que el desplazamiento se muestre en una base numérica diferente, como decimal o hexadecimal, use la opción -t (base). La opción radix debe ir seguida de d (decimal), X (hexadecimal) u o (octal). Usar -to es lo mismo que usar -o.

strings -t d parse_phrases | less

strings -td parse_phrases |  menos en una ventana de terminal

Las compensaciones ahora se imprimen en decimal.

salida de cadenas con compensaciones en decimal en una ventana de terminal

strings -t x parse_phrases | less

strings -tx parse_phrases |  menos en una ventana de terminal

Las compensaciones ahora se imprimen en hexadecimal.

salida de cadenas con compensaciones en hexadecimal en una ventana de terminal

Incluyendo espacios en blanco

strings considera que los caracteres de tabulación y espacio son parte de las cadenas que encuentra. Otros caracteres de espacio en blanco, como nuevas líneas y retornos de carro, no se tratan como si fueran parte de las cadenas. La opción -w (espacio en blanco) hace que las cadenas traten todos los caracteres de espacio en blanco como si fueran parte de la cadena.

strings -w add_data | less

cadenas -w add_data |  menos en una ventana de terminal

Podemos ver la línea en blanco en la salida, que es el resultado del retorno de carro (invisible) y los caracteres de nueva línea al final de la segunda línea.

  Cómo encontrar la información de la tarjeta gráfica en Linux

salida de cadenas en una ventana de terminal

No estamos limitados a archivos

Podemos usar cadenas con cualquier cosa que sea, o pueda producir, un flujo de bytes.

Con este comando, podemos mirar a través del memoria de acceso aleatorio (RAM) de nuestra computadora.

Necesitamos usar sudo porque estamos accediendo a / dev / mem. Este es un archivo de dispositivo de caracteres que contiene una imagen de la memoria principal de su computadora.

sudo strings /dev/mem | less

sudo strings / dev / mem |  menos en una ventana de terminal

La lista no es el contenido completo de su RAM. Son solo las cadenas que se pueden extraer de él.

cadenas de salida en menos en una ventana de terminal

Buscando muchos archivos a la vez

Se pueden usar comodines para seleccionar grupos de archivos que se buscarán. El carácter * representa varios caracteres y el? carácter representa cualquier carácter individual. También puede optar por proporcionar muchos nombres de archivo en la línea de comando.

Usaremos un comodín y buscaremos en todos los archivos ejecutables en el directorio / bin. Debido a que la lista contendrá resultados de muchos archivos, usaremos la opción -f (nombre de archivo). Esto imprimirá el nombre del archivo al comienzo de cada línea. Luego podemos ver en qué archivo se encontró cada cadena.

Estamos canalizando los resultados grepy buscando cadenas que contengan la palabra «Copyright».

strings -f /bin/* | grep Copyright

cadenas -f / bin / * |  grep Copyright en una ventana de terminal

Obtenemos una lista ordenada de las declaraciones de derechos de autor para cada archivo en el directorio / bin, con el nombre del archivo al comienzo de cada línea.

salida de cadenas que muestra declaraciones de derechos de autor en una ventana de terminal

cuerdas desenredadas

Las cuerdas no tienen ningún misterio; es un comando típico de Linux. Hace algo muy específico y lo hace muy bien.

Es otro de los engranajes de Linux y realmente cobra vida cuando funciona con otros comandos. Cuando ve cómo puede ubicarse entre archivos binarios y otras herramientas como grep, comienza a apreciar la funcionalidad de este comando un poco oscuro.