Como comparar arquivos binários no Linux


0
Laptop Linux mostrando um prompt bash
fatmawati achmad zaenuri/Shutterstock.com

Como você pode verificar se dois binários do Linux são os mesmos? Se forem arquivos executáveis, quaisquer diferenças podem significar um comportamento indesejado ou malicioso. Aqui está a maneira mais fácil de verificar se eles diferem.

Comparando arquivos binários

O Linux é rico em maneiras de comparar e analisar arquivos de texto. o diff O comando irá comparar dois arquivos para você e destacar as diferenças. Ele pode até fornecer algumas linhas de cada lado das alterações para fornecer algum contexto em torno das linhas alteradas. E a colordiff O comando adiciona cor para facilitar ainda mais a análise visual das diferenças.

Desenvolvedores e autores usam diff para destacar as diferenças entre as diferentes versões dos arquivos de código-fonte do programa ou textos de rascunho. É rápido e fácil, e você não precisa de nenhuma habilidade técnica para ver as diferenças entre strings de texto.

No mundo dos arquivos binários, as coisas não são tão simples. Arquivos binários não são compostos de texto simples. Eles são compostos de muitos bytes contendo valores numéricos. Se for um arquivo compactado, como um arquivo TAR ou um arquivo ZIP, esses valores representam os arquivos compactados armazenados dentro do arquivo compactado, juntamente com as tabelas de símbolos necessários para a descompactação e extração dos arquivos.

Se o arquivo binário for um arquivo executável, os valores numéricos dos bytes do arquivo serão interpretados como instruções de código de máquina para a CPU, metadados, rótulos ou dados codificados. Alterações em um arquivo binário ou em um arquivo de biblioteca provavelmente levarão a diferenças de comportamento quando o binário for executado ou usado por outro aplicativo.

É fácil falsificar a data e hora de criação ou modificação de um arquivo. Isso significa que pode haver duas versões de um arquivo com o mesmo nome, tamanho de arquivo — se as alterações substituirem byte de conteúdo existente por byte — e carimbos de data. E, no entanto, um dos arquivos pode ter sido alterado.

Algoritmos de hash seguros

Um algoritmo de hash seguro é um algoritmo baseado em matemática. Ele cria um valor de 64 bits verificando todos os bytes em um arquivo e aplicando uma transformação matemática a eles para gerar o valor de hash. Em qualquer dia, o mesmo arquivo sempre produzirá o mesmo hash. Mesmo uma diferença de um byte resultará em um hash radicalmente diferente.

Você verá frequentemente o hash de um arquivo exibido em sua página de download. Você deve gerar um hash para o arquivo depois de baixá-lo. Se for diferente do hash exibido na página da Web, você sabe que o arquivo está comprometido. Ele foi adulterado e substituído pelo arquivo genuíno – para fazer com que as pessoas baixem o arquivo corrompido – ou foi corrompido em trânsito.

Em nosso computador de teste, temos duas cópias do mesmo arquivo, uma biblioteca compartilhada. Os arquivos foram renomeados para que possam estar no mesmo diretório. Em teoria, esses arquivos devem ser os mesmos. Afinal, eles deveriam ser a mesma versão da biblioteca compartilhada.

ls -l *.so

Dois arquivos binários que parecem iguais

Os arquivos têm o mesmo tamanho, os mesmos carimbos de data e hora. Para o observador casual, eles parecerão iguais. Vamos usar o sha256sum comando e gere um hash para cada arquivo.

sha256sum binary_file1.so
sha256sum binary_file2.so

Gerando hashes para os dois arquivos binários

Os hashes são completamente diferentes, indicando claramente que existem diferenças entre os dois arquivos. Se o site mostrar o hash do arquivo genuíno, você poderá descartar o arquivo que não corresponde.

Encontrando as diferenças

Se você quiser ver as mudanças, existem maneiras de fazer isso também. Você não precisa ser capaz de descompilar o arquivo, nem entender assembly ou código de máquina apenas para ver as modificações. Entendendo o que essas mudanças significa, e qual é o seu propósito, é claro, exigiria um conhecimento técnico mais profundo. Mas simplesmente saber o quão substanciais são as alterações pode ser um indicativo do que aconteceu com o arquivo.

Se usarmos diff nos dois arquivos binários, obteremos uma resposta um pouco abaixo do esperado.

diff binary_file1.so binary_file2.so

Usar diff com dois arquivos binários fornece muito pouca informação

Já sabíamos que os arquivos eram diferentes. Vamos tentar cmp .

cmp binary_file1.so binary_file2.so

Usar cmp com dois arquivos binários fornece um pouco mais de informação, mas não muito

Isso nos diz um pouco mais. O primeiro byte que difere entre os dois arquivos é o byte número 13451. Ou seja, contado desde o início do arquivo binário, o byte 13451 é diferente nos dois arquivos binários. Portanto, 13451 é o deslocamento da primeira diferença, desde o início do arquivo.

Por acaso, em todo o arquivo, haverá bytes que contêm o valor hexadecimal de 0x10. Este é o valor que o Linux usa em arquivos de texto como o caractere de fim de linha. o cmp O comando encontrou 131 bytes com esse valor entre o início do arquivo binário e o local da primeira diferença. Então ele pensa que está na linha 132. Realmente não significa nada neste contexto.

Se adicionarmos o -l (verbose) começaremos a obter informações úteis.

cmp -l binary_file1.so binary_file2.so

Usando a opção -l com cmp para listar os bytes alterados

Todos os bytes diferentes são listados. O número do byte ou deslocamento, o valor do primeiro arquivo e o valor do segundo arquivo são mostrados, com um byte por linha de saída.

Os valores de byte são mostrados em octal, em vez do formato hexadecimal usual usado com arquivos binários. No entanto, aprendemos outra coisa. Todos os bytes alterados estão em uma sequência contínua. Seus deslocamentos são incrementados em um para cada byte.

o hexdump tool irá despejar um arquivo binário para a janela do terminal. Se usarmos o -C (canônica) a saída listará em cada linha o deslocamento, os valores de 16 bytes nesse deslocamento e, se houver, a representação ASCII dos valores de byte.

hexdump -C binary_file1.so

A saída canônica hexdump de um arquivo binário

Podemos usar a saída de hexdump como entrada para diffde locação diff funciona como se estivesse lendo dois arquivos de texto.

diff <(hexdump binary_file1.so) <(hexdump binary_file2.so)

Usando diff e hexdump para obter as diferenças entre dois arquivos

diff localiza as linhas que são diferentes e mostra os valores de bytes hexadecimais do primeiro arquivo acima dos valores do segundo arquivo. O deslocamento da primeira linha é 0x3480 ou 13440 em decimal. Mais cedo, cmp nos disse que a primeira mudança ocorreu no byte 13451, que é 0x348B. Isso realmente combina com o que vemos aqui.

A saída de diff está em blocos de dois bytes. O primeiro par de bytes são os bytes 0 e 1 do deslocamento de 0x3480, o segundo bloco contém os bytes 2 e 3 do deslocamento. O bloco 6 conterá os bytes 0xA e 0xB, ou 10 e 11 em decimal. Esses são os bytes 13450 e 13451. E podemos ver que eles são os primeiros bytes que diferem. Os primeiros cinco pares de bytes são os mesmos em ambos os arquivos.

No entanto, porque diff está contando da base zero, o que cmp as chamadas 13451 serão do byte 13540 para diff. E para tornar as coisas ainda mais confusas, a ordem dos bytes em cada bloco de dois bytes é invertida por diff. Os bytes são realmente listados nesta ordem: 1 e 0, 3 e 2, 5 e 4, 7 e 6, e assim por diante.

O comando também é computacionalmente caro – dois hexdumps e um diff tudo de uma vez—especialmente se os arquivos que estão sendo comparados forem grandes.

Mas se hexdump -C pode enviar uma versão ASCII do arquivo binário para a janela do terminal, por que não redirecionamos a saída para arquivos de texto e comparamos esses dois arquivos de texto com diff?

hexdump -C binary_file1.so > binary1.txt
hexdump -C binary_file2.so > binary2.txt
diff binary1.txt binary2.txt

Redirecionando hexdump para criar dois arquivos de texto e usando diff para comparar os arquivos de texto

A diferença entre os dois arquivos é exibida em dois pequenos extratos. Há uma representação ASCII ao lado deles. Haverá um par de extrações para cada diferença entre os arquivos. Neste exemplo, há apenas uma diferença.

Isso é muito bom, mas não seria ótimo se houvesse algo que fizesse tudo isso por você?

VBinDiffName

O programa VBinDiff pode ser instalado a partir dos repositórios usuais para todas as principais distribuições. Para instalá-lo no Ubuntu, use este comando:

sudo apt install vbindiff

Instalando o VBinDiff no Ubuntu

No Fedora, você precisa digitar:

sudo dnf install vbindiff

Instalando VBinDiff no Fedora

Os usuários do Manjaro precisam usar pacman.

sudo pacman -Sy vbindiff

Instalando VBinDiff no Fedora

Para usar o programa, passe o nome dos dois arquivos binários na linha de comando.

vbindiff binary_file1.so binary_file2.so

Passando dois arquivos binários para VBinDiff na linha de comando

O aplicativo baseado em terminal é aberto, mostrando os dois arquivos em uma exibição de rolagem.

VBinDiff exibindo dois arquivos binários

Você pode usar a roda de rolagem do mouse ou as teclas “UpArrow”, “DownArrow”, “Home”, “End”, “PageUp” e “PageDown” para percorrer os arquivos. Ambos os arquivos rolarão.

Aperte a tecla “Enter” para pular para a primeira diferença. A diferença é destacada em ambos os arquivos.

VBinDiff destacando diferenças entre dois arquivos binários

Se houvesse mais diferenças, pressionar “Enter” exibiria a próxima diferença. Pressionar “q” ou “Esc” sairá do programa.

Qual é a diferença?

Se você estiver trabalhando em um computador que pertence a outra pessoa e não tiver permissão para instalar nenhum pacote, poderá usar cmp, diffe hexdump. Se você precisar capturar a saída para processamento adicional, essas também são as ferramentas a serem usadas.

Mas se você tiver permissão para instalar pacotes, o VBinDiff torna seu fluxo de trabalho mais fácil e rápido. E, de fato, usar VBinDiff com um único arquivo binário é uma maneira fácil e conveniente de navegar pelos arquivos binários, o que é um bom bônus.

RELACIONADO: Como espiar dentro de arquivos binários a partir da linha de comando do Linux


Like it? Share with your friends!

0

What's Your Reaction?

hate hate
0
hate
confused confused
0
confused
fail fail
0
fail
fun fun
0
fun
geeky geeky
0
geeky
love love
0
love
lol lol
0
lol
omg omg
0
omg
win win
0
win

0 Comments

Your email address will not be published. Required fields are marked *