Como posso imprimir todas as strings ASCII imprimíveis (por exemplo, com mais de quatro caracteres) contidas em um arquivo binário?
Eu usei strings -a -w file.bin >>output
.
Como posso imprimir todas as strings ASCII imprimíveis (por exemplo, com mais de quatro caracteres) contidas em um arquivo binário?
Eu usei strings -a -w file.bin >>output
.
O comando
strings
é o que você procura para ver todas as strings ASCII em um arquivo binário.ASCII é um conjunto de caracteres que atribui caracteres para cada valor de byte de 0 a 127. Destes, 33 (correspondentes aos valores de byte 0 a 31 e 127) são caracteres de controle (alguns dos quais (
\n
,\t
) frequentemente usados em texto, também\r
para Texto da Microsoft, mais raramente\b
para manipulação de negrito/sublinhado em alguns aplicativos,\e
para sequências de escape de representação gráfica) e o restante imprimível (um dos quais (espaço no valor do byte 32) não gráfico).Então, se realmente se trata de encontrar strings de 4 caracteres ASCII ou mais, então isso pode ser uma questão de encontrar sequências de 4 ou mais bytes no intervalo de 0 a 127, o que você poderia fazer com Perl com:
(aqui impressa uma nova linha delimitada (a nova linha está em ASCII)).
Agora, em um determinado arquivo binário, não é porque os bytes têm valores entre 0 e 127 que eles deveriam ser texto codificado em ASCII . Em particular, o byte 0 que representa o caractere de controle ASCII NUL raramente é encontrado no texto, tanto que a presença desse valor de byte costuma ser um indicador claro de que o arquivo contém dados binários em vez de texto.
Portanto, removê-lo da lista junto com caracteres de controle diferentes de nova linha e talvez tabulação pode ter maior probabilidade de fornecer sequências de bytes destinadas a serem cadeias de caracteres ASCII.
(ao qual você pode querer adicionar
\e
,\10
(BS,\b
é para algo diferente em perl)).Observe que esses caracteres de controle (
\t
,\n
,\e
,\b
) serão impressos como estão no terminal se você não redirecioná-los para um arquivo.Você poderia fazer:
Para imprimir uma representação de string JSON dessas strings. Por exemplo, no conteúdo do
/bin/ls
meu sistema, isso mostraria coisas como:Em vez de:
Quando enviado para um dispositivo terminal, o caractere de controle de nova linha, também conhecido como avanço de linha (representado como
\n
uma string JSON) é normalmente traduzido para a sequência de retorno de carro + nova linha de caracteres de controle, o primeiro dos quais move o cursor para o início da linha ( retorna o carro) e o segundo move-o uma linha para baixo (alimenta uma linha) em praticamente todos os terminais. É assim que o Unix garante que a nova linha seja representada como o delimitador de linha que deveria ser.