Escolar Documentos
Profissional Documentos
Cultura Documentos
ENGENHARIA REVERSA
Universidade Paulista
Jundiaí - SP RESUMO
ABSTRACT
1
2
1. INTRODUÇÃO
“Use engenharia reversa dinâmica tanto quanto possível para inspecionar tipos
em tempo de execução para determinar para que eles são usados”. (Application,
2017, p. 174).
É possível recriar um sistema que se comporte igual ao original sem saber seu
código fonte, apenas analisando os pacotes trafegados sem o devido tratamento?
1.4 METODOLOGIA
1.5 JUSTIFICATIVA
2. DESENVOLVIMENTO
A análise de pacotes entre outras técnicas não são uma coisa nova na
engenharia reversa. Temos muitos casos de empresas que usaram engenharia
reversa em produtos da concorrência para garantir versões próprias de
funcionamento semelhante. Uma prova disso foi a época dos clones de consoles
feitos no Brasil, que na sua grande maioria não passavam de copias do consoles
originais das grandes empresas.
O Transport Layer Security (TLS), e seu antecessor Secure Sockets Layer (SSL)
foram desenvolvidos para criptografar comunicações na rede de computadores,
sendo usados atualmente em todos os sites que se comunicam através do
protocolo HTTPS.
O jogo base para esse projeto, e que é feito para testes, contém dois exemplos
de servidores, um servidor de autenticação com comunicação criptografada
É possível validar esse exemplo na própria WEB onde temos sites que usam
certificados digitais assinados, neste caso o navegador não faz questão de
validar se o certificado é realmente da origem esperada, apenas se ele é
confiável e está na lista ou no diretório de certificados confiáveis do
sistema/navegador.
destino original, como isso podemos modificar qualquer conteúdo que seja
acessado, por exemplo se alguém estiver em uma rede de uma empresa ou rede
pública, é possível ter os dados visualizados ou alterados em tempo real por
outra pessoa, para exemplificar melhor é possível realizar um teste na WEB
usando um proxy no meio para alterar os dados recebidos do banco Itaú.
Com a ferramenta de proxy Charles proxy versão 4.6.4, pode-se alterar todo o
conteúdo enviado para o navegador.
Com algumas regras simples, é possível alterar o texto exibido no botão “abra
sua conta” além de modificar para onde ele aponta.
(Site do banco Itau como HTML editado em tempo real pela ferramenta Charles proxy)
Uma segunda técnica viável é extrair o certificado usado para criptografia dos
dados direto do cliente da aplicação, isso é possível a partir de engenharia
reversa como exemplificado no tópico Engenharia reversa de software 2.13,
ao fazer a análise da aplicação, que pode ter passado por processos de
ofuscação criptografia e compactação de dados, o que dificultaria o processo,
mas não o impossibilitaria, uma vez que os dados do lado do cliente sempre
poderão por meio de interferência serem alterados como é o caso de cracks
(Programas alterados) de jogos e aplicativos.
A terceira forma seria quebrar por força bruta da criptografia TSL por meio de
fatoração de primos, o que é praticamente inviável então não será abordado
nesse artigo.
No caso do servidor de login que usa TSLv1 ainda existem ataques como
POODLE que permitem o rebaixamento de conexões permitindo a leitura dos
dados trafegados, mas que também não abordaremos já que este não é o foco
do projeto.
Como o jogo base foi criado para testes existe o certificado digital original
disponível e não será necessário passar por nem um destes processos, uma vez
que o objetivo deste projeto é mostrar o problema derivado da interceptação do
tráfego desprotegido ou mal protegido.
No caso do jogo base que usamos existem duas formas de comunicação: uma
usando TSL e outra sem proteção, apenas com tráfego TCP, em Análise na
prática 2.2.2.3 será mostrado o processo usado para compreensão dos dados
trafegados, mas de forma resumida, qualquer dado trafegado depende de uma
análise normalmente manual, isto é, analisar variações dos conjuntos de dado
obtidos a fim de identificar padrões de comportamento em determinadas
situações, como: ao tomar uma ação dentro do jogo, qual pacote é enviado?
Quais campos ele contém? E como esses campos se alteram ao ponto que se
muda o ângulo, direção, habilidade ou outras coisas, assim é possível por meio
de tentativa erro descobrir o que se trata em cada campo transmitido, sem dúvida
a análise manual é um trabalho longo que requer experiencia e tempo, uma vez
que os dados podem estar em diversos tipos e formados diferentes como
inteiros, floats entre outros, que alteram os resultados de saída para cada um
deles.
Neste caso foi ilustrado usando um código simples em JavaScript para facilitar a
compreensão, mas da mesma maneira isso pode ser aplicável a pacotes de
rede, que não necessariamente aumentam o seu tamanho, mas podem trocar
informações de lugar ou usar pedaços de diferentes partes do conteúdo do
pacote para obter a informação necessária. Este é um processo que pode ser
bem simples e fornece um bom resultado, porém temos que lembrar que uma
pessoa treinada com uma base de experiência conseguiria reverter este código
próximo ou igual a sua forma original, uma vez que as informações de execução
ainda estão contidas nele, e que diferente da criptografia não necessita de chave
ou qualquer outro processo para reverter sua informação ao estado original.
Pacote 1 em hexadecimal:
“6F6CE12C20636F6D6F20766F63EA20657374E13F”
imagine que aja uma solução em ambos os lados que de forma progressiva gere
um dicionário, que acumula as palavras mais usadas. Sendo possível trocar as
palavras por referências a este dicionário que ficaria assim:
• olá -> 1;
• como -> 2;
• você -> 3;
• está -> 4;
• estou -> 5;
• bem -> 6;
• obrigado -> 7.
Então agora para enviar essas mesmas mensagens seria usado muito menos
recursos, porque sua saída seria:
Com este exemplo pode-se ter uma ideia mínima de como funciona uma
compressão de pacotes, obviamente existem muitos métodos de compressão
para determinadas situações que podem ter uma maior ou menor compressão
com e sem perda de dados. Esse exemplo é simples e apesar de terem métodos
de compressão que usem dicionários, esse exemplo não aborda uma situação
real.
Este pacote contém um conteúdo mostrado em hexadecimal que não passou por
nem um dos processos mencionados anteriormente e contem alguma
informação referente ao estado atual do jogo de forma limpa.
Neste caso foi separado em pedaços de 4 bytes apenas para facilitar o trabalho
e por suposição de que a maioria dos primitivos usados para esse pacote tenham
4 bytes de tamanho como inteiros, por exemplo.
Como dito antes, o novo pacote foi gerado ao movimentar o personagem, então
não é difícil de acreditar que possa se tratar de um pacote de coordenada do
jogador. Após os 2 bytes de identificação, existem 3 conjuntos de 4 bytes que se
alteraram, é sabido que um jogo normalmente utiliza coordenadas X, Y, Z
respectivamente para sua posição, fica fácil associar esses conjuntos de bytes
que se alteraram a essas coordenadas. É possível dizer então que este pacote
é de coordenas, mas qual seria seu tipo de variável? Inteiro, double, float ou
proprietário?
Esse novo pacote foi gerado ao mover o personagem apenas um pouco
para frente, e mesmo assim os 3 conjuntos de bytes mudaram muito, isso
é um sinal claro de que estamos lidando com float ou double de 4 bytes,
uma vez que permitem valores com casas decimais, o que faz mais sentido
nesse caso.
Nota-se que a variação dos dados após a conversão faz total sentido com
a forma com a qual eles foram gerados, o que confirma tanto a suposição
inicial de que os 3 conjuntos de 4 bytes pertenciam as coordenas quanto
de que suas variáveis eram float e estavam certos.
2.1.3.2. Disassemble
2.1.3.3. Decompilação
É necessário lembrar que alguns programas podem ter passado por processos
de ofuscação que já foi explicado antes, o que torna o processo muito mais
complexo, uma vez que primeiramente seria necessário compreender qual o tipo
de ofuscação foi usado para depois reverte-la e só então iniciar a interpretação
do programa original, literalmente analisar para poder analisar.
(Imagem 1 pacote de disparo dentro do jogo enviado pelo cliente. Autoria própria)
Na imagem acima pode-se ver um pacote enviado pelo cliente do jogo após uma
ação de disparo, esse pacote não possui criptografia, ofuscação, ou
compressão, nele é possível encontrar todas as informações que o cliente quer
informar ao servidor divididos em campos.
Como vimos em Análise na prática 2.2.2.3, é necessário aplicar variações no
jogo para identificar campos que se alteram, como quando é realizado um
disparo com outra arma.
(Pacote enviado pelo cliente e respondido pelo servidor após tradução. Autoria própria)
Alguns campos como rotação ou ângulo não foram traduzidos porque exigem um
conhecimento no desenvolvimento de jogos que não é necessária para prova de
conceito.
Para realizar isso o pacote original de um monstro que existe no jogo é capturado
no lugar onde ele realmente deveria estar.
(Injeção de pacote falso usando o proxy com o comando “S_” com o valor de um pacote original. Autoria própria)
Como resultado o monstro aparece no lugar que o personagem está, que é longe
de onde ele deveria estar, já que o cliente acha que isso veio do servidor.
(Monstro injetado no lado do cliente apenas, não tem ações. Autoria própria)
(Função do servidor alternativo responsável por recarregar as armas do jogo. Autoria própria)
(Função responsável por criar o pacote de recarga que será retornado ao cliente. Autoria própria)
Claro que existem mais recursos criados para esse servidor, como banco de
dados para armazenar valores de monstros e itens obtidos, além de contas dos
jogados e personagens criados. Usando a criptografia TSLv1, o servidor de
autenticação (login) funciona da mesma maneira, reponde a pacotes enviados
pelo cliente, processa e grava no banco de dados.
(Imagens das telas de criação de conta/personagem e mapa usando servidores alternativos. Autoria própria)
(queda de itens, uso de habilidades, comandos/chat e movimentação de monstros semelhante ao servidor original.
Autoria própria)
Analisar protocolos de rede pode não ser uma coisa simples, por mais que neste
caso não tiveram as proteções normalmente encontradas, não se pode
considerar tal facilidade ao realizar teste em um ambiente real, isso exige um
grande conhecimento por parte do pesquisador como citado por Forshaw (2017)
“Ao analisar um protocolo, você deve ter um conhecimento sólido das
tecnologias e algoritmos envolvidos para que possa detectar e até explorar
fraquezas graves.”
4. CONSIDERAÇÕES FINAIS
O projeto se finaliza com um software desenvolvido do zero que por lei pode
ser usado sem problemas legais, por ser totalmente desenvolvido sem o
conhecimento do código original que resultaria em plágio.
REFERÊNCIAS
ATAQUE dos clones: os grandes consoles brasileiros. Games, [s. l.], 30 mar. 2017.
Disponível em: https://www.redbull.com/br-pt/ataque-dos-clones-os-grandes-consoles-
brasileiros-paralelos. Acesso em: 5 maio 2023.
https://extra.globo.com/noticias/celular-e-tecnologia/pesquisador-independente-faz-
engenharia-reversa-do-protocolo-skype-1967430.html. Acesso em: 5 maio 2023.
HOW to analyze IPsec Traffic with Wireshark. [S. l.], [2022]. Disponível em:
https://www.golinuxcloud.com/wireshark-analyse-ipsec-traffic/. Acesso em: 5 maio 2023.
Robert Shimonski. SOBRE o Wireshark: Introdução. In: WIESHAK guia prático: Análise
e resolução de problemas de tráfego de rede. [S. l.: s. n.], 2013.
Canhota Junior, Antonio Jorge Sapage da. ENGENHARIA reversa. 2005. Artigo
(Bacharelado em Ciência da Computação) - UFF – Universidade Federal Fluminense, [S.
l.], 2005. Disponível em:
http://www2.ic.uff.br/~otton/graduacao/informaticaI/apresentacoes/eng_reversa.pdf.
Acesso em: 10 maio 2023.