Algoritmo de Engenharia Reversa: Visualização Binária Dinâmica


Introdução

Há alguns meses atrás eu me interessei por um campo na área de Tecnologia que hoje (em minha opinião) é muito mal-explorado. Eu estou falando da Engenharia Reversa.

Eu sei que pode parecer um pouco chato falar disso. Mas como um bom backend, queria compartilhar sobre uma descoberta que eu fiz e compartilhar o que eu fiz sobre isso.

Afinal, o que diabos eu descobri?

Bom, eu descobri um algoritmo. Um algoritmo de engenharia reversa assustadoramente simples que (pelo o que eu entendi) serve para descobrir tipos de arquivos desconhecidos por meio de imagens.

Parece algo muito complexo. Mas, como disse anteriormente, é assustadoramente simples, mas gera resultados muito intrigantes e interessantes

Reverse Engineering Dynamic Binary Visualization

Sim. Nome grande, né?

Esse é o nome do algoritmo, e eu descobri ele por meio de um cara chamado Cristopher Domas, que hoje trabalha na Intel e foi muito reconhecido na época.

Como já disse, o algoritmo serve para analisar arquivos (a princípio, desconhecidos) e descobrir seus tipos ou pelo menos o "formato" do arquivo com esse algoritmo

Como funciona?

Vamos supor que você tenha um arquivo. Por exemplo, um Hello World em JavaScript:

  • Arquivo: hello.js
    console.log("Hello World")
    

Esse arquivo é constituido de (caracteres) bytes, e esses bytes, essencialmente, são simplesmente números que vão de 0 a 255. Então, representando o arquivo hello.js em uma sequência de números, temos:

  • Arquivo: hello.js (bytes em números)
    99 111 110 115 111 108 101 46 108 111 103 40 34 72 101 108 108 111 32 87 111 114 108 100 34 41 10
    

Agora temos a representação "crua" do arquivo. E é aí que o algoritmo trabalha.

Basicamente, o algoritmo simplesmente itera sobre os pares de bytes do arquivo e os trata como coordenadas em uma imagem.

  1. Iterar sobre os pares de bytes no arquivo. Basicamente, é um loop que itera sobre cada par de bytes dentro do arquivo.
    99 111
    111 110
    110 115
    115 111
    ...
    
  2. Tratar cada par como coordenada em uma imagem. Simplesmente pegamos o par que estamos trabalhando e usamos o primeiro item como a coordenada X da imagem e o segundo item como coordenada Y na imagem.
    (x=99,  y=111)
    (x=111, y=110)
    (x=110, y=115)
    (x=115, y=111)
    ...
    

Dessa forma, geramos a imagem. Mas o que essa imagem nos diz?

Analisando as imagens geradas

Bom, o nosso exemplo é muito simples, então vamos pular para algo mais legal, como 1 minuto da trilha sonora de Star Wars:

Imagem Gerada (starwars.wav)

Ou 69 Parágrafos de Lorem Ipsum: Imagem Gerada (lorem.txt)

E também um executável Linux: Imagem Gerada (program)

Claro, não são as imagens mais belas do mundo. Mas o mais interessante disso tudo, é que existem padrões sendo gerados. E com esses padrões é possivel identificar os padrões dos própios bytes no arquivo. Isso ajuda a identificar arquivos desconecidos em uma análise de Engenharia Reversa.

O que eu fiz com isso

Basicamente, eu implementei o algoritmo. Eu nomeei o projeto Domas, em homenagem ao Christopher Domas, quem descreveu o algoritmo.

O repositório do projeto está no meu perfil, se quiserem dar uma estrelinha lá, fiquem à vontade :)

Encerramento

A mensagem que eu quero dar com esse post é que nem sempre os campos subestimados da Tecnologia são ruins (na verdade na vida toda).

Então eu encorajo você leitor a tentar entrar em areas não só como a da Engenharia Reversa, mas como em outras mal-exploradas desse vasto mundo das programações...

Obrigado por ler, nos vemos na próxima.


Por Marcio Dantas

É muito bom saber que aqui no Tabnews há leitores que apreciam essa área da engenharia reversa. Acho que todo dev tem um pouco desse hábito de desmontar as coisas para ver o que tem dentro ou mesmo observar segundo outros aspectos como você fez, marcdantas. Alguns, como o Dilbert (ptbr), outros muito mais. Escovar bits, revertendo aplicações, jogos tem suas vantagens, como criar patches com base nos achados. Aprendemos também com todo esse processo.

Estou atento aos termos de uso de alguns software que vedam a engenharia reversa, mas discordo em parte, quando adquiro o item. A engenharia reversa tem mostrado sua importância quando trazendo à tona as falhas de segurança, backdoors, bugs, easter eggs etc. de software, firmware e hardware. Ultimamente percebo que os fabricantes/desenvolvedores não têm muito o que fazer para limitar isso, passando a criar dispositivos/aplicações mais robustas, à prova de intrusão.

Antes que a NSA publicasse o Ghidra, era um trabalho mais árduo caso não pudesse adquirir uma licença de ferramenta comercial. Muito bom saber que criou sua própria ferramenta exótica code2image! Também segui esse caminho até conhecer algumas existentes. Antes eu criava um arquivo PNM para ver o arquivo como imagem! Hoje, para visualizar o conteúdo como imagem (ligeiramente diferente do que sua aplicação faz), tenho usado a http://binvis.io, hospedada localmente. Com ela consigo inspecionar alguns pacotes binários suspeitos, calculando e exibindo também a entropia do conteúdo em forma de imagem. Logo, para um arquivo não compactado, a representação da entropia realça regiões cujo conteúdo difere-se do restante, tais como seções com dados encriptados, blocos compactados.


A ferramenta que você desenvolveu é bem diferente da que apresentei, exótica. Já pensou em criar um histograma 3D, já que pares de coordenadas, como você os chama, podem ocorrer várias vezes para uma mesma localidade no seu sistema de coordenadas? Calma que não é necessário projetar um gráfico com três eixos. A terceira componente você poderia aproveitar a possibilidade de adotar uma cor de uma paleta predefinida, incrementada à medida que o número de ocorrências para o par de coordenadas se repete.

Cara, que bacana essa visualização gráfica dos arquivos. Fiquei imaginando aqui um anti-virús/malware implementado com uma IA treinada com essas imagens, utilizando esse "conhecimento" para identificar arquivos maliciosos! Parabéns pela implementação!

Sim mano, na realidade é bem possível. Eu até pensei em implementar uma versão em Python com uma IA pra reconhecer os arquivos pelo algoritmo. So que nesse caso, pela IA, seria menos custoso analisar os Bytes diretamente ao inves da imagem. Esse algoritmo é mais pra diversão do que para produção. No video do Youtube que eu coloquei na fonte do post, o Christopher Domas explica outros algoritmos BEM mais complexos que tem mais utilidade no mundo real.

Muito interessante, confesso que você despertou uma imensa curiosidade em mim para aprender a respeito.