Isso é puramente por curiosidade acadêmica, mas muitas vezes encontrei arquivos no Windows (Win10Pro64) e também no Android que não são ofuscados, mas contêm vários NULcaracteres entre cada caractere relevante real, dificultando a leitura como estão no Windows (pelo menos no Android, o aplicativo explorador que uso - X-plore - parece remover automaticamente ao iniciar como texto no modo de edição). Aqui está um exemplo:
relate perguntas
-
Caixas desenhadas à mão
-
O script não é mais executado após a atualização para o python 3.7.3
-
Perda de formatação ao colar de alguns aplicativos não MS para aplicativos do MS Office 365
-
MS Word – como inserir uma coluna na borda direita de cada página
-
Como posso adicionar uma margem (vertical) (ou seja, preenchimento) entre o cabeçalho da página e o conteúdo na segunda página com o cabeçalho da tabela de repetição nos relatórios do Telerik
Este é um arquivo binário que contém caracteres fora do conjunto de caracteres ASCII imprimíveis .
Como esses caracteres são " não imprimíveis ", o Notepad++ os exibe como um bloco descritivo. Você provavelmente verá outros, conforme mostrado abaixo. Aqui você vê todos os valores do binário 0 /
0x00
a 255 /0xFF
(que é o maior valor que pode ser armazenado em um único byte).Os valores mostrados nas linhas 1, 2 e 3 são normalmente chamados de " Caracteres de controle " e são usados para influenciar o terminal, posicionamento do cursor, etc... a
NUL
tem o valor 0 /0x00
. OBS
caractere de controle é " Backspace " e instrui o aplicativo a remover um caractere e mover o cursor um espaço para trás. Digno de nota são os caracteres " ausentes " ou invisíveis entreBS
eVT
... aqui estão os caracteres " Horizon Tab " e " Line Feed " - o primeiro é bastante auto-explicativo, e o último fará o texto fluir para o próximo linha.Nas linhas 4 e 5 você pode ver todo o conjunto de caracteres ASCII imprimíveis. Um espaço (
) tem os valores binários 32 /
0x20
, um ponto de exclamação tem os valores 33 /0x21
, etc... A caixa quadrada engraçada no final da linha 5 é oDEL
caractere de controle - 127 /0x7F
.Todos os valores incluindo e acima de 128 são " ASCII estendido " ou também não imprimíveis, e são exibidos a partir da linha 6 como seu valor bruto - por exemplo:
x80
. Não há uma boa maneira de determinar como interpretá-los - alguns aplicativos DOS usaram alguns desses caracteres para produzir quadros em torno de " janelas ", caixas ou áreas no terminal .Para obter mais informações, consulte a seção " Grupos de caracteres " da página wiki.
Visualizando o mesmo arquivo acima em um " Editor Hex ", você normalmente verá os valores binários brutos ao lado da representação ASCII.
Quando o arquivo contém dados diferentes de texto simples (por exemplo: é um aplicativo ou outro arquivo binário), você verá muitos caracteres não impressos, porque eles nunca foram destinados ao consumo humano... Nesses arquivos, o os dados são dispostos em binário, geralmente seguindo uma estrutura ou formato estrito. Em alguns casos, os dados representam grandes números (concatenando um número de bytes juntos), em outros casos, eles podem representar " código de máquina " ou instruções brutas que são apresentadas diretamente a um processador.
Você pode ver strings dentro desses arquivos binários, mas isso é mais " por acidente " do que de propósito - o próprio aplicativo precisa saber o que imprimir na tela quando você vir uma mensagem, e será isso.
Existem algumas maneiras comuns pelas quais as strings são codificadas em arquivos binários.
1. Corda C
Esse formato usa caracteres de 8 bits e termina a string com um
NUL
caractere. A string fica imediatamente visível no arquivo, conforme mostrado abaixo - observe a terminaçãoNUL
.2. UTF-16
Este formato utiliza caracteres de 16 bits (ou seja: dois bytes concatenados) e pode representar uma parte dos pontos de código descritos pelo Unicode . Aqui, você vê que a string está um pouco visível, se você ler entre os
NUL
caracteres... Este formato é muito comum em aplicativos que têm como alvo o Windows.Você pode ver a string
Logical Disks
na segunda linha?Arquivos binários também podem armazenar outros recursos dentro deles - por exemplo, imagens, sons, XML, JSON, arquivos, etc... o aplicativo pode então extrair os recursos para o disco em tempo de execução, se necessário, ou pode frequentemente processá-los diretamente da memória.
Muitas vezes é possível extrair esses recursos usando ferramentas de forma automatizada, mas em alguns casos o arquivo não é projetado para um padrão aberto/comum, sendo necessária alguma intervenção manual.
Ao criar um arquivo para armazenar dados, você pode armazenar uma série de bytes. 1 byte é qualquer número entre 0 e 255. Em muitos formatos de arquivo, basta usar qualquer número entre 0 e 255 para armazenar dados.
Mas, à medida que os sistemas se tornam mais complexos e avançados, os desenvolvedores às vezes precisam armazenar números muito maiores que 255. 2 bytes = 256*256 = 65535, 4 bytes = 256*256*256*256 = 4294967296. Portanto, combinando 4 bytes, pode-se armazenar valores de 0 a 4294967295.
Você pode até combinar 8 ou mais bytes para formar um número, o que geralmente acontece em aplicativos de 64 bits, nos quais você precisa de 64 bits (8x8 bytes).
Como os números armazenados geralmente são baixos, a maioria dos bytes é 0, também conhecido como NUL. Portanto, em um arquivo, você vê muitos NUL porque são todos valores baixos em construções de 64 bits.
Por que alguém não otimizaria o arquivo? Porque a maioria dos programadores usa funções que armazenam os dados para eles, e eles mantêm todos os cenários em mente, incluindo o armazenamento de grandes números.
Essa é uma convenção muito popular para armazenar strings: geralmente os programas saberão a localização do início da string e saberão que a string terminou porque o caractere
NUL
(ouNULL
ou\0
) foi encontrado.Se você comparar isso com o CSV, poderá considerá-lo como a vírgula que separa cada coluna. Exceto que aqui é um caractere especial que não pode ser digitado nem impresso e não tem outra utilidade senão delimitar finais de string.
Você pode pensar que isso é frágil e é de fato uma causa de inúmeros problemas de segurança. Mas ainda hoje, muitas strings ainda são delimitadas dessa maneira.
No entanto, na captura de tela, isso pode ter um significado diferente, específico do aplicativo que você está usando. No geral, os dados binários não são feitos para serem lidos com um editor de texto :)