Deseja examinar o conteúdo textual dentro de um arquivo binário ou de dados? O comando `strings` no Linux realiza essa tarefa, extraindo trechos de texto – conhecidos como “strings” – para sua análise.
O Linux oferece uma vasta gama de comandos, alguns dos quais podem parecer soluções em busca de problemas. O comando `strings` certamente se enquadra nessa categoria. Qual é, afinal, o seu propósito? Seria útil um comando que simplesmente exibe as sequências de caracteres imprimíveis de um arquivo binário?
Vamos dar um passo atrás. Arquivos binários, como os de programas, podem conter texto legível. No entanto, como visualizá-lo? Se você usar `cat` ou `less`, é provável que o terminal trave. Ferramentas projetadas para arquivos de texto não funcionam bem com caracteres não imprimíveis.
A maioria dos bytes em arquivos binários não é compreensível por humanos, não sendo possível exibi-los no terminal de maneira inteligível. Não há símbolos universais para valores binários que não correspondam a caracteres alfanuméricos, pontuação ou espaços. Esses são denominados “caracteres imprimíveis”, enquanto os demais são “não imprimíveis”.
Portanto, a busca e visualização de texto em arquivos binários ou de dados são problemáticas. É aqui que o `strings` entra em ação. Ele extrai sequências de caracteres imprimíveis de arquivos, permitindo que outros comandos as utilizem sem lidar com caracteres não imprimíveis.
Como usar o comando `strings`
O comando `strings` é simples e direto em seu uso básico. Basta fornecer o nome do arquivo a ser analisado na linha de comando.
Para exemplificar, usaremos `strings` em um arquivo binário executável chamado “jibber”. Digitamos `strings`, um espaço e “jibber”, pressionando Enter em seguida.
strings jibber
As strings são extraídas e exibidas no terminal.
Definindo o comprimento mínimo das strings
Por padrão, o `strings` busca sequências de quatro ou mais caracteres. Para ajustar esse comprimento mínimo, utilize a opção `-n` (comprimento mínimo).
É importante notar que quanto menor o comprimento mínimo, maior a probabilidade de obter resultados indesejados.
Alguns valores binários têm a mesma representação numérica de caracteres imprimíveis. Se dois desses valores estiverem próximos no arquivo e você especificar um comprimento mínimo de dois, eles serão interpretados como uma string.
Para definir o comprimento mínimo para dois, use o seguinte comando:
strings -n 2 jibber
Agora, strings de duas letras são incluídas. Note que espaços também são considerados caracteres imprimíveis.
Redirecionando a saída para o `less`
Devido à extensão da saída, direcionaremos o resultado de `strings` para o comando `less`. Isso nos permitirá percorrer a listagem e procurar o texto desejado.
strings jibber | less
A listagem é apresentada no `less`, exibindo a parte inicial.
Usando `strings` com arquivos objeto
Arquivos de código-fonte são compilados em arquivos objeto, que são então vinculados a bibliotecas para criar um executável binário. Temos um arquivo objeto chamado `jibber.o`, vamos inspecioná-lo. Note a extensão “.o”.
strings jibber.o | less
O primeiro conjunto de strings é alinhado na oitava coluna se tiverem mais de oito caracteres. Se houver quebras de linha, um “H” é exibido na nona coluna. Essas strings podem ser identificadas como instruções SQL.
Ao rolar a saída, percebemos que essa formatação não é utilizada em todo o arquivo.
É interessante observar as diferenças nas strings de texto entre o arquivo objeto e o executável final.
Pesquisando áreas específicas do arquivo
Programas compilados possuem diferentes áreas de armazenamento de texto. Por padrão, `strings` pesquisa o arquivo inteiro. É como se você usasse a opção `-a` (todos). Para que `strings` pesquise apenas em seções de dados carregadas e inicializadas, utilize a opção `-d` (dados).
strings -d jibber | less
A menos que haja um motivo específico, a configuração padrão (pesquisar o arquivo inteiro) geralmente é suficiente.
Exibindo o deslocamento da coluna
É possível instruir `strings` a exibir o deslocamento (offset) de cada string em relação ao início do arquivo. Utilize a opção `-o` (offset) para isso.
strings -o parse_phrases | less
O deslocamento é apresentado em octal.
Para exibir o deslocamento em uma base numérica diferente (decimal ou hexadecimal), use a opção `-t` (base). Essa opção deve ser seguida por `d` (decimal), `x` (hexadecimal) ou `o` (octal). O uso de `-to` é equivalente a `-o`.
strings -t d parse_phrases | less
Agora os deslocamentos são exibidos em decimal.
strings -t x parse_phrases | less
Os deslocamentos são exibidos em hexadecimal.
Incluindo Espaços em Branco
O comando `strings` considera espaços e tabulações como parte das strings. Outros espaços em branco, como novas linhas e retornos de carro, não são tratados como parte das strings. A opção `-w` (espaços em branco) faz com que `strings` inclua todos os espaços em branco nas strings.
strings -w add_data | less
Podemos ver a linha em branco na saída, que é o resultado dos caracteres de retorno de carro e nova linha (invisíveis) no final da segunda linha.
Não Estamos Limitados a Arquivos
Podemos usar `strings` em qualquer coisa que seja ou possa produzir um fluxo de bytes.
Por exemplo, podemos inspecionar a memória de acesso aleatório (RAM) do seu computador.
É necessário usar `sudo` porque estamos acessando `/dev/mem`, um arquivo de dispositivo que contém uma imagem da memória principal do sistema.
sudo strings /dev/mem | less
A listagem não contém todo o conteúdo da RAM, apenas as strings que podem ser extraídas.
Pesquisando Vários Arquivos ao Mesmo Tempo
É possível usar curingas para selecionar grupos de arquivos. O caractere `*` representa vários caracteres e `?` um único caractere. Além disso, você pode fornecer vários nomes de arquivo na linha de comando.
Vamos usar um curinga para pesquisar todos os executáveis no diretório `/bin`. Como a listagem será extensa, usaremos a opção `-f` (nome do arquivo) para exibir o nome do arquivo no início de cada linha, facilitando a identificação da origem de cada string.
Vamos direcionar a saída para o comando `grep` para encontrar strings que contenham a palavra “Copyright”.
strings -f /bin/* | grep Copyright
Obtemos uma lista com as declarações de direitos autorais de cada arquivo em `/bin`, com o nome do arquivo no início de cada linha.
Desmistificando o `strings`
Não há mistério no comando `strings`; ele é um comando típico do Linux, especializado em uma tarefa específica, e a realiza muito bem.
Ele é apenas mais uma das engrenagens do Linux e ganha vida ao interagir com outros comandos. Ao ver como ele pode fazer a ponte entre arquivos binários e ferramentas como o `grep`, você começa a apreciar a utilidade desse comando aparentemente obscuro.