Buscar

[crimesciberneticos com]_Apostila_EngReversa_Malware

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 187 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 187 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 187 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Engenharia Reversa e 
Análise de Malware 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Ronaldo Pinheiro de Lima 
crimesciberneticos.com@gmail.com 
www.crimesciberneticos.com 
mailto:crimesciberneticos.com@gmail.com
http://www.crimesciberneticos.com/
 
 
 
Conteúdo 
1. Introdução .............................................................................................................................................................. 6 
1.1. Tipos de códigos maliciosos .................................................................................................................................... 6 
1.2. Engenharia reversa de malware ............................................................................................................................. 8 
1.3. Análise estática e dinâmica (comportamental) ....................................................................................................... 9 
1.4. Ferramentas ............................................................................................................................................................ 9 
1.5. Antireversing e anti-antivirus ................................................................................................................................ 19 
1.5.1. Polimorfismo ................................................................................................................................................. 19 
1.5.2. Metamorfismo .............................................................................................................................................. 20 
1.5.3. Packers........................................................................................................................................................... 20 
1.5.4. Cryptors ......................................................................................................................................................... 21 
1.5.5. Binders, Joiners ou Wrappers ........................................................................................................................ 21 
1.5.6. Strings Ofuscadas .......................................................................................................................................... 21 
2. Estruturas Internas dos Softwares .........................................................................................................................23 
2.1. Níveis de abstração ............................................................................................................................................... 23 
2.2. Engenharia Reversa ............................................................................................................................................... 25 
2.3. A Arquitetura x86 .................................................................................................................................................. 26 
2.4. Memória Principal (RAM) ...................................................................................................................................... 27 
2.5. Instruções .............................................................................................................................................................. 28 
2.6. Opcodes e Endianness (Ordenação) ...................................................................................................................... 28 
2.7. Operandos ............................................................................................................................................................. 29 
2.8. Registradores ........................................................................................................................................................ 29 
2.9. A pilha (Stack) ....................................................................................................................................................... 32 
2.10. Chamadas de Funções (FunctionCalls) ................................................................................................................ 32 
2.11. Layout da Pilha (stack layout) ............................................................................................................................. 33 
2.12. Exemplo de código em C e Assembly ................................................................................................................... 36 
2.13. Mais informações: linguagem assembly e arquitetura Intel x86 ........................................................................ 37 
2.14. Lab-02-01 Entendo na prática o funcionamento da pilha com o OllyDbg ........................................................... 39 
3. Laboratório para Análise de Malwares ...................................................................................................................44 
3.1. Máquina virtual ..................................................................................................................................................... 44 
3.2. Preparação do ambiente ....................................................................................................................................... 45 
3.3. Lab-03-01 Uso de máquina virtual e simulação de rede com FakeNet ................................................................. 48 
4. Trabalhando com Executáveis ................................................................................................................................53 
4.1. Identificação do arquivo ........................................................................................................................................ 53 
4.2. Unpacking Automático .......................................................................................................................................... 53 
4.3. Strings ................................................................................................................................................................... 54 
4.4. Strings criptografadas ........................................................................................................................................... 54 
4.5. Debugging ............................................................................................................................................................. 55 
4.6. Lab 04-01 Análise de executável malicioso com strings criptografadas ............................................................... 55 
 
 
 
4.7. Lab 04-02 Análise de executável malicioso com uso dedescompilador................................................................. 69 
5. Análise Dinâmica ...................................................................................................................................................78 
5.1. Monitorando processos com Process Explorer ...................................................................................................... 78 
5.2. Monitorando com Process Monitor....................................................................................................................... 79 
5.3. Monitoramento de Tráfego de Rede ..................................................................................................................... 80 
5.4. Monitoramento do registro e arquivos com Regshot ............................................................................................ 81 
5.5. O uso das ferramentas de análise dinâmica na prática ........................................................................................ 81 
5.6. Lab 05-01 Análise dinâmica com Process Explorer e Process Monitor .................................................................. 82 
5.7. Lab 05-02 Análise de executável malicioso com uso de técnicas diversas ............................................................ 88 
6. WindowsInternals .................................................................................................................................................89 
6.1. Níveis de privilégio do processador – Protection Rings ......................................................................................... 89 
6.2. Transição entre os níveis de privilégio ................................................................................................................... 89 
6.3. Kernel Mode .......................................................................................................................................................... 90 
6.4. User Mode ............................................................................................................................................................. 91 
6.5. Windows APIs ........................................................................................................................................................ 92 
6.5.1. Win32 API ...................................................................................................................................................... 93 
6.5.2. Native API ...................................................................................................................................................... 93 
6.6. Lab 06-01 Entendendo as APIs do Windows na prática ........................................................................................ 95 
6.7. Formato Portable Executable (PE) ......................................................................................................................... 95 
6.7.1. Conceitos Básicos .......................................................................................................................................... 96 
6.7.2. MS-DOS Header ............................................................................................................................................. 97 
6.7.3. PE Header ...................................................................................................................................................... 99 
6.7.4. Section Table ............................................................................................................................................... 102 
6.7.5. PE Sections .................................................................................................................................................. 103 
6.8. O Loader – Como um arquivo PE é carregado na memória ................................................................................ 105 
7. Trabalhando com DLLs ......................................................................................................................................... 107 
7.1. Estrutura Básica de uma DLL ............................................................................................................................... 107 
7.2. Enumerando Exports da DLL ............................................................................................................................... 108 
7.3. Executando DLLs.................................................................................................................................................. 110 
7.4. Restrições de Processo Host ................................................................................................................................ 111 
7.5. Debugging DLL .................................................................................................................................................... 113 
7.6. Component Object Model (COM) ........................................................................................................................ 113 
7.7. Lab 07-01 Análise de DLL maliciosa .................................................................................................................... 116 
7.8. Lab 07-02 Injeção e debugging de DLL com o Immunity Debugger .................................................................... 116 
8. Memory Forensics ............................................................................................................................................... 121 
8.1. Aquisição da memória......................................................................................................................................... 121 
8.2. Análise de Memória ............................................................................................................................................ 123 
8.3. Lab 08-01 Aquisição e análise de dump de memória .......................................................................................... 124 
9. Trabalhando com Rootkits ................................................................................................................................... 125 
9.1. O surgimento dos Rootkits .................................................................................................................................. 125 
 
 
 
9.2. Tipos de rootkits .................................................................................................................................................. 126 
9.3. User-mode Rootkits ............................................................................................................................................. 126 
9.3.1. API Hooking ................................................................................................................................................. 127 
9.3.2. Técnicas de Hooking .................................................................................................................................... 128 
9.4. Ferramentas de detecção de Rootkits ................................................................................................................. 129 
9.5. Lab 09-01 Demonstração de INT 3 Hooks com PyDbg ........................................................................................ 130 
9.6. Kernel-mode Rootkits .......................................................................................................................................... 131 
9.6.1. O Kernel do Windows (NTOSKRNL.EXE) ...................................................................................................... 132 
9.6.2. Device Drivers .............................................................................................................................................. 133 
9.6.3. Windows Hardware Abstraction Layer (HAL) .............................................................................................. 134 
9.6.4. Kernel Drivers no Windows ......................................................................................................................... 135 
9.6.5. Os Rootkits em Kernel-Mode ...................................................................................................................... 136 
9.6.6. Análise de Kernel-Mode Rootkit ................................................................................................................. 138 
9.7. Lab 09-02 Análise de kernel-mode rootkit com o WinDbg .................................................................................. 141 
9.7.1. Configurando Kernel-Mode Debugging com WinDbg e VirtualBox ............................................................. 142 
9.8. Referências de comandos e uso do WinDbg ....................................................................................................... 146 
10. Técnicas contra Engenharia Reversa ................................................................................................................... 147 
10.1. Packers .............................................................................................................................................................. 147 
10.1.1. Anatomiados Packers ............................................................................................................................... 147 
10.1.2. O código de Unpacking .............................................................................................................................. 148 
10.1.3. Identificando Programas com Packers ...................................................................................................... 150 
10.1.4. Métodos de Unpacking ............................................................................................................................. 150 
10.1.5. Unpacking Manual .................................................................................................................................... 152 
10.1.6. Analisando sem realizar o Unpacking total ............................................................................................... 157 
10.1.7. Lab 10-01 Unpacking manual de UPX alterado ......................................................................................... 158 
10.2. Anti-Debugging ................................................................................................................................................. 158 
10.2.1. Detecção de debugger através da Windows API ....................................................................................... 158 
10.2.2. Checagem manual de estruturas ............................................................................................................... 160 
10.2.3. Identificando o comportamento do Debugger.......................................................................................... 163 
10.2.4. Interferindo na funcionalidade do Debugger ............................................................................................ 164 
10.2.5. Vulnerabilidades do Debugger .................................................................................................................. 165 
10.3. Visão geral de Anti-Disassembly ....................................................................................................................... 165 
10.4. Visão geral de Anti-VM ..................................................................................................................................... 167 
10.5. Lab 10-02Análise de malware que emprega técnicas anti-debugging ............................................................. 168 
11. Trabalhando com Documentos Maliciosos ......................................................................................................... 169 
11.1. Etapas genéricas da análise de documentos maliciosos ................................................................................... 169 
11.2. Análise de documento Microsoft Office ............................................................................................................ 170 
11.2.1. OfficeMalScanner ...................................................................................................................................... 170 
11.2.2. Ferramentas e recursos para análise de documentos Office .................................................................... 171 
11.3. Lab 11-01 Análise de documento Office malicioso ............................................................................................ 171 
11.4. Análise de PDF ................................................................................................................................................... 171 
11.5. Lab 11-02 Análise de PDF malicioso .................................................................................................................. 173 
12. Trabalhando com Web Malware ........................................................................................................................ 174 
12.1. JavaScript .......................................................................................................................................................... 174 
12.2. PHP .................................................................................................................................................................... 176 
12.3. Applet Java ........................................................................................................................................................ 177 
 
 
 
12.4. Flash e Action Script .......................................................................................................................................... 178 
12.5. Lab 12-01 Análise de web malware diversos .................................................................................................... 179 
Apêndice A: Sandbox e Multi-AV Scanners .............................................................................................................. 180 
Apêndice B: Coleta de Malware ............................................................................................................................... 182 
Referências Bibliográficas ........................................................................................................................................ 184 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
É terminantemente proibida a reprodução total ou parcial desta obra, por qualquer meio ou 
processo, sem a expressa autorização do autor. 
 
 
Revisão 1.7 – novembro/2016 
Engenharia Reversa e Análise de Malware | 6 
Ronaldo Pinheiro de Lima | www.crimesciberneticos.com 
 
1. Introdução 
 
Código malicioso ou malware (do inglês “malicious software”) foi um termo criado para 
definir genericamente qualquer software que tenha intenção de realizar alguma atividade no 
computador sem o consentimento ou conhecimento do proprietário, dessa forma beneficiando outra 
pessoa. Geralmente essa atividade maliciosa gerará algum dano ou prejuízo a vítima e envolverá 
captura de teclas digitadas no teclado, cliques do mouse, comunicação de rede, alterações de 
configurações no navegador e sistema operacional, etc. 
1.1. Tipos de códigos maliciosos 
 
Conforme foram surgindo foram identificadas determinadas características e funcionalidades 
comuns em certos grupos de malwares e assim criaram-se categorias para distingui-los. Devido ao 
dinamismo e à velocidade com que surgem novas pragas digitais muitas vezes é difícil saber se um 
malware se encaixa em uma categoria, em várias ou em nenhuma conhecida. Porém é consenso a 
existência de determinados tipos comuns que veremos a seguir. 
 
Vírus: é o tipo mais antigo de malware e tem se tornado menos popular nos dias atuais, 
porém às vezes o termo ainda é utilizado de forma genérica para descrever todos os tipos de 
malwares. Eles fazem cópias de si mesmos infectando outros arquivos legítimos do computador, ou 
seja, se tornam parte de outros programas (geralmente executáveis). Uma característica importante é 
que os vírus geralmente dependem da ação do usuário para se tornarem ativos e infectarem outros 
computadores, diferente da maioria dos malwares atuais que utilizam Internet ou a rede local para 
se replicarem. 
 
 Worm: fundamentalmente é similar ao vírus, porém possui uma diferença significativa, 
worms se auto replicam automaticamente pela rede sem necessitar da ação do usuário, conseguem 
fazer isso explorando vulnerabilidades do sistema operacional e outros softwares. Devido a essa 
característica eles podem se propagarem de forma incontrolável em pouquíssimo período de tempo. 
 
 Trojanhorse: em português cavalo de Troia, foi na mitologia grega uma grande estátua, 
utilizada como instrumento de guerra pelos gregos para obter acesso à cidade de Troia. A estátua do 
cavalo foi recheada com soldados que, durante a noite, abriram os portões da cidade possibilitando 
Engenharia Reversa e Análise de Malware | 7 
Ronaldo Pinheiro de Lima | www.crimesciberneticos.coma entrada dos gregos e a dominação de Troia. Daí surgiram os termos "Presente de Grego" e 
"Cavalo de Troia". No mundo dos malwares, um trojan é um programa normalmente recebido como 
um "presente" (por exemplo, vídeos, fotos, jogos, etc.), que além de executar funções para as quais 
foi aparentemente projetado, também executa outras funções normalmente maliciosas e sem o 
conhecimento do usuário. 
 
 Trojan-Downloader: é um tipo de Trojan que existe somente para fazer download de outros 
códigos maliciosos. Downloaders, ou Loaders como são conhecidos no meio hacker, geralmente são 
instalados pelos atacantes quando eles obtêm acesso ao sistema pela primeira vez. O downloader irá 
baixar e instalar outros malwares automaticamente. 
 
 Trojan-Banker: esse tipo de Trojan é muito comum no Brasil, 95% dos malwares 
produzidos no país são desse tipo [1], são especializados em furtar dados referentes ao Internet 
Banking. Tentam se passar por aplicativos ou sites dos bancos brasileiros para conseguirem capturar 
senhas e demais credenciais de acesso a contas bancárias. 
 
[1] http://oglobo.globo.com/tecnologia/bbr-ajuda-mas-malware-ainda-pode-infectar-aparelhos-3678255 
 
Backdoor: código malicioso que se instala no computador para permitir o acesso remoto do 
atacante. Permite ao atacante se conectar e executar comandos no computador infectado sem que o 
usuário tenha conhecimento. 
 
Bot/Botnet: similar a backdoor, permite ao atacante se conectar remotamente ao computador 
infectado, porém seu uso é diferente. Assim que um computador é infectado por um bot, ele se 
conecta automaticamente a um servidor de comando-e-controle (command-and-control, C&C ou 
C2) e ficar aguardando instruções. Esse servidor C&C é comandado pelo atacante que através que 
instruções ordena que toda a rede de computadores infectados com os bots (a botnet) realizem 
determinadas atividades maliciosas como, por exemplo, capturarem teclas digitadas, acessarem 
determinado web site para sobrecarregá-lo e derrubá-lo (ataque DDoS), instalar malwares 
adicionais, etc. 
 
Rootkit: malware designado para ocultar sua presença e de outros códigos maliciosos no 
sistema operacional. Utiliza-se de técnicas avançadas para dificultar a detecção por parte do 
usuário, geralmente faz isso alterando funções internas do sistema operacional fazendo com que 
passe despercebido pelas ferramentas anti-malware. 
Engenharia Reversa e Análise de Malware | 8 
Ronaldo Pinheiro de Lima | www.crimesciberneticos.com 
 
 
O uso de códigos maliciosos está diretamente relacionado às fraudes cometidas pela 
Internet, para essas fraudes ou golpes também foram criados alguns termos que valem a pena 
conhecer: 
 
PhishingScam: é um golpe que se utiliza de engenharia social com o envio de mensagem 
não solicitado (spam) para se passar por uma instituição conhecida, como um banco, empresa ou 
site popular, e que procura induzir o usuário a acessar páginas falsas ou instalar códigos maliciosos 
projetados para furtar dados pessoais e financeiros. As palavras inglesas phishing (de "fishing", 
pescaria) e scam (golpe) vêm de uma analogia criada pelos fraudadores, onde "iscas" (e-mails) são 
usadas para "pescar" senhas e dados financeiros de usuários na Internet. No meio hacker, os 
indivíduos especializados em desenvolver códigos maliciosos ou sites fraudulentos para furtar 
informações bancárias é conhecido como "banker" e o especializado somente em cartões de crédito 
é o "carder". 
 
 SpearPhishing: no phishing comum são enviados e-mails para tentar “pescar” senhas e 
outros dados bancários das pessoas em geral, já no spearphishing (“pescaria com arpão”) são 
enviados e-mails direcionados a alvos específicos, a mensagem é cuidadosamente montada para que 
se passe por verdadeira dentro de uma empresa ou órgão. 
1.2. Engenharia reversa de malware 
 
Engenharia reversa é o processo de extrair conhecimento de algo feito pelo homem. 
Geralmente é utilizada para obter informação de algo que foi perdido ou esteja faltando, muitas 
vezes o dono dessa informação não tem a intenção de compartilhá-la ou a informação foi destruída. 
Em muitas indústrias a engenharia reversa é utilizada para descobrir segredos de projetos dos 
concorrentes para desenvolverem produtos similares ou superiores, o produto é dissecado pedaço 
por pedaço até descobrirem o que cada parte faz. 
Software é uma das tecnologias mais complexas feita pelos homens da atualidade, e a 
engenharia reversa de software consiste em abrir um programa e olhá-lo internamente. Portanto a 
engenharia reversa de malware é o processo de abrir um software malicioso, dissecá-lo e entender o 
que cada parte do programa faz sem ter acesso ao seu código-fonte original, já que o criador 
possivelmente não irá querer compartilhá-lo conosco. 
Engenharia reversa de malware requer uma combinação de habilidades e conhecimentos, 
como por exemplo: desenvolvimento de softwares, sistemas operacionais, arquitetura de 
Engenharia Reversa e Análise de Malware | 9 
Ronaldo Pinheiro de Lima | www.crimesciberneticos.com 
 
computadores, programação baixo nível, formato de arquivos, etc. Porém o mais importante pré-
requisito é a curiosidade e a vontade de aprender. 
1.3. Análise estática e dinâmica (comportamental) 
 
Existem duas abordagens distintas, contudo complementares, que podemos utilizar para 
analisar um malware. A primeira delas é chamada de análise estática, com ela analisamos um 
artefato, na verdade um arquivo, sem executá-lo ou executando apenas pequenos trechos de seu 
código com ajuda de debuggers. Nesse tipo de análise utilizamos diversas ferramentas para 
conseguir extrair o máximo de informações possíveis do malware, geralmente essa abordagem 
exige do analista um conhecimento maior dos formatos de arquivos envolvidos, do funcionamento 
interno do sistema operacional e da linguagem assembly, porém dessa forma conseguimos extrair 
informações mais detalhadas e avançadas do malware. 
Já na análise dinâmica, também chamada de comportamental, executamos o arquivo e 
monitoramos seu comportamento, interação e efeitos no sistema operacional hospedeiro, deixamos 
o malware agir e observamos. Para isso contamos com a ajuda de diversas ferramentas que 
capturam tráfego de rede, execução de processos, modificações no registro, sistema de arquivos, 
etc., e no final da execução, ou após um determinado período de tempo definido por nós, são 
exibidos os relatórios com os resultados. 
Vale dizer que a análise dinâmica é fácil ser automatizada, os sites que analisam malwares 
fazem isso, já a análise estática é muito difícil, a maior parte do trabalho é feito manualmente por 
um analista. As empresas desse ramo, universidades ou mesmo as forças policiais (FBI) geralmente 
possuem gigantescas base de dados com milhões de amostras que são analisadas automaticamente 
pelo método dinâmico e os arquivos que fogem do padrão são separados e analisados manualmente 
por uma pessoa através do método estático. 
Um método não é melhor que o outro, eles são complementares. Às vezes é muito útil 
utilizar a abordagem dinâmica para provar ou tirar uma dúvida do que foi encontrado com a análise 
estática. Também podemos utilizar a análise estática para conseguir mais detalhes do que foi 
apresentado com a abordagem dinâmica. Por isso é importante conhecer os dois métodos. 
1.4. Ferramentas 
 
São poucas as ferramentas criadas especialmente para a engenharia reversa e análise de 
malware, mas mesmo assim existem inúmeras criadas com outros propósitos que são muito úteis na 
hora de lidar com um arquivo malicioso. Elas são categorizadas de acordo com suas 
Engenharia Reversa e Análise de Malware | 10 
Ronaldo Pinheiro de Lima | www.crimesciberneticos.com 
 
funcionalidades, muitas são bem completas e se encaixam em mais de uma categoria, vejamos 
abaixo as características de cada uma e no decorrer do curso as conheceremos com maisdetalhes. 
Lembrando que todos os softwares utilizados são gratuitos e estão disponíveis na internet para 
qualquer um fazer download. 
 
Identificadores de Arquivos 
 
Quando pretendemos analisar um arquivo suspeito não temos nenhuma informação prévia 
sobre ele, não sabemos o formato do arquivo, para qual sistema operacional foi compilado ou se ele 
possui alguma proteção. Não podemos confiar no nome do arquivo e nem em sua extensão, pois 
isso é usado como engenharia social para enganar os menos atentos. Existem ferramentas, 
classificadas genericamente como identificadores de arquivos, que podemos utilizar para obter um 
perfil inicial do arquivo. 
Elas recebem o arquivo suspeito como entrada e exibem informações detalhadas como: 
formato do arquivo, compilador, linguagem de programação, proteções, cabeçalhos, sessões do 
arquivo, etc. Algumas ainda dão dicas de como remover as proteções e permitem a instalação de 
plug-ins. 
 
Segue uma lista das mais utilizadas: 
 
- PEiD 
Ferramenta gratuita para detecção de packers e compiladores. Inclui mais de 600 assinaturas para 
detectar packers, cryptors e compiladores em arquivos do formato PE (executável do Windows). 
Suporta a instalação de plug-ins como o KryptoANALyzer (KANAL). O KANAL pode ser 
utilizado para encontrar algoritmos de criptografia conhecidos em arquivos PE. Embora o projeto 
do PEiD tenha sido descontinuado ainda é possível fazer o download da ferramenta. 
Download: http://www.peid.info/. 
 
- Exeinfo PE 
Assim como o PEiD é uma ferramenta gratuita que também identifica packers e compiladores de 
arquivos PE. Projeto atualizado que apresenta bons resultados e possui 617 assinaturas de detecção. 
Uma vantagem é que ele quando identifica um packer dá dica de como encontrar o unpacker. 
Permite ainda a integração com o PEiD através de plug-in. 
Site para download: http://www.exeinfo.xwp.pl/. 
 
http://www.peid.info/
http://www.exeinfo.xwp.pl/
Engenharia Reversa e Análise de Malware | 11 
Ronaldo Pinheiro de Lima | www.crimesciberneticos.com 
 
- RDG Packer Detector 
Como o próprio nome diz identifica packers, cryptors, compiladores e algoritmos de criptografia. É 
uma ferramenta menos conhecida, porém bastante poderosa. Compatível com Windows 7 e 
arquivos PE de 32 e 64 bits. 
Download: http://www.rdgsoft.8k.com/. 
 
- file 
Comando nativo de distribuições Linux para identificação de arquivos. Ideal para saber o tipo de 
um arquivo desconhecido, às vezes consegue identificar a presença de packers. Possui versão 
gratuita para Windows. 
Download (Windows): http://gnuwin32.sourceforge.net/packages/file.htm. 
 
Monitoramento do Sistema 
 
Esse tipo de ferramenta está relacionado com a análise dinâmica do malware, envolve 
tarefas como “sniffar” a rede, monitorar o sistema operacional (SO), explorar e expor o que o 
malware está fazendo. A maioria dessas ferramentas exibe informações coletadas pelo SO sobre o 
malware e seu ambiente, devido à quase totalidade de comunicação do malware com o mundo 
exterior ser feita através do SO, ele pode ser manipulado para extrair essa informação. Ferramentas 
de monitoramento do sistema podem monitorar atividade de rede, acesso a arquivos, acesso ao 
registro, criação de processos, além de objetos do SO como mutex, eventos e outros. 
 
Segue uma lista das mais utilizadas: 
 
- Autoruns 
Autoruns é um utilitário com uma longa lista de locais de inicialização automática de programas no 
Windows. Malwares frequentemente se instalam em uma variedade de locais, incluindo o registro, 
menu iniciar, e outros. Autoruns procura por vários locais possíveis e apresenta um relatório em 
uma interface gráfica. Use o Autoruns na análise dinâmica para ver onde o malware se instalou. A 
ferramenta faz parte da SysinternalsSuite. 
Download: http://www.sysinternals.com/. 
 
- Capture BAT 
É uma ferramenta de análise dinâmica para monitorar o malware enquanto ele ainda está rodando. 
Capture BAT irá monitorar o sistema de arquivos, registro e atividades do processo. Você pode usar 
http://www.rdgsoft.8k.com/
http://gnuwin32.sourceforge.net/packages/file.htm
http://www.sysinternals.com/
Engenharia Reversa e Análise de Malware | 12 
Ronaldo Pinheiro de Lima | www.crimesciberneticos.com 
 
listas de exclusão (incluindo muitas já predefinidas) para remover os resultados não desejados e 
focar somente no malware que está analisando. Apesar de o Capture BAT não ter uma interface 
gráfica muito sofisticada como o Process Monitor, é uma ferramenta open source, então você pode 
modificá-la. 
Download: http://www.honeynet.org/project/CaptureBAT. 
 
- Process Explorer 
É um poderoso gerenciador de tarefas do Windows que é utilizado para prover informações sobre os 
processos que estão executando no sistema. Process Explorer pode mostrar as DLLs de processos 
individuais, handles, eventos, strings e muito mais. Faz parte da SysinternalsSuite. 
Download: http://www.sysinternals.com/. 
 
- Process Hacker 
É um poderoso gerenciador de tarefas similar ao Process Explorer, porém com muitas 
funcionalidades adicionais. Ele pode buscar por strings e expressões regulares na memória, injetar 
ou descarregar DLL, carregar um driver, criar ou iniciar um serviço e muito mais. 
Download: http://processhacker.sourceforge.net/. 
 
- Process Monitor 
Process Monitor (procmon) é uma ferramenta de análise dinâmica útil para visualizar em tempo real 
atividades no sistema de arquivos, registro e processos. Você pode utilizar filtros para remover 
informações não desejadas do relatório. Faz parte da SysinternalsSuite. 
Download: http://www.sysinternals.com/. 
 
- Regshot 
Ferramenta de análise dinâmica que permite tirar e comparar dois snapshots (estado ou “foto”) do 
registro do sistema. Para usá-la, você simplesmente tira um snapshot do registro, executa o 
malware, aguarda ele fazer as modificações no sistema, tira o segundo snapshot, e então compara os 
dois. O regshot também pode ser utilizado para tirar e comparar dois snapshots de qualquer pasta do 
sistema de arquivos que você especificar. 
Download: http://sourceforge.net/projects/regshot/. 
 
- TCPView 
Ferramenta para mostrar graficamente listagens detalhadas de todas as conexões TCP e UDP 
relacionadas com processos. Essa ferramenta é útil para análise de um malware porque permite 
http://www.honeynet.org/project/CaptureBAT
http://www.sysinternals.com/
http://processhacker.sourceforge.net/
http://www.sysinternals.com/
http://sourceforge.net/projects/regshot/
Engenharia Reversa e Análise de Malware | 13 
Ronaldo Pinheiro de Lima | www.crimesciberneticos.com 
 
visualizar qual processo é proprietário de determinada conexão. TCPView pode ajudar você a 
rastrear o nome de um processo quando sua máquina de análise se conecta a uma porta TCP e você 
não tem ideia de qual é o responsável. Faz parte da SysinternalsSuite. 
Download: http://www.sysinternals.com/. 
 
- Wireshark 
Wireshark é uma ferramenta open source de análise de pacotes de rede. Pode ser utilizada para 
capturar o tráfego de rede gerado pelo malware e para analisar muitos protocolos diferentes. É a 
ferramenta mais popular disponível livremente para capturar pacotes de rede, possui uma interface 
completa e fácil de usar. 
Download: http://www.wireshark.org/. 
 
Disassemblers 
 
Disassemblers são programas que recebem um arquivo binário executável como entrada e 
geram como saída arquivos textuais que contém o código da linguagem assembly para o programa 
inteiro ou parte dele. Esse processo é relativamente simples considerando que a linguagem 
assembly é simplesmente o mapeamento textual da linguagem de máquina. Disassembly é um 
processo baseado em processador, ou seja, cada arquitetura de CPU tem uma linguagem assembly 
específica, mas alguns disassemblers suportam múltiplas arquiteturas diferentes. Um bom 
disassembler é uma ferramenta essencial no kit do engenheiro reverso de malware,através dele 
temos acesso ao código-fonte do malware (ainda que em linguagem de baixo nível) o que auxilia o 
seu entendimento e manipulação. 
 
- IDA ProFree 
É o disassembler mais poderoso e utilizado em análise de malwares, possui inúmeras 
funcionalidades como geração de gráficos, fluxogramas, referências cruzadas e muito mais. 
Disponível em uma versão paga com mais funcionalidades e outra free que atende bem a análise de 
malwares para plataformas comuns. 
Download: http://www.hex-rays.com/products/ida/support/download_freeware.shtml. 
 
Debuggers 
 
Caso você já tenha feito algo em desenvolvimento de software já deve ter ouvido falar sobre 
os debuggers. Um debugger é um software que permite que o desenvolvedor observe seu programa 
http://www.sysinternals.com/
http://www.wireshark.org/
http://www.hex-rays.com/products/ida/support/download_freeware.shtml
Engenharia Reversa e Análise de Malware | 14 
Ronaldo Pinheiro de Lima | www.crimesciberneticos.com 
 
enquanto ele está sendo executado. As duas maiores características de um debugger são a habilidade 
de estabelecer breakpoints e a habilidade de navegar através do código. 
Breakpoints permitem ao usuário selecionar uma função ou linha de código em qualquer 
lugar no programa e instruir o debugger a parar a execução do programa assim que essa linha é 
atingida. Quando ele atinge o breakpoint, o debugger para (break) e exibe o estado atual do 
programa. Nesse ponto é possível liberar o programa para continuar a execução ou começar a 
navegar através de seu código. Esse processo de “navegação” através do programa consiste em 
executar uma linha de código de cada vez e congelar, permitindo ao usuário observar e até alterar 
seu estado. Isso permite observar o fluxo exato do programa de uma forma mais lenta e apropriada 
para a compreensão humana, já que o computador executada tudo isso bilhões de vezes mais rápido. 
Instalando breakpoints e navegando por programas, os desenvolvedores podem assistir ao 
programa de perto quando ele executa uma seção problemática do código e tentar determinar a 
origem do problema. Como os desenvolvedores têm acesso ao código-fonte de seus programas, 
debuggers comuns exibem o código-fonte na linguagem de programação de alto-nível que eles 
estão utilizando, permitindo a manipulação desse código. 
Para os engenheiros reversos de malware, o debugger é quase tão importante quanto para o 
desenvolvedor de software, mas por pequenas razões diferentes. Os debuggers são utilizados no 
modo disassembly, por essa razão esse tipo de debugger é conhecido como assembler-
leveldebugger. No modo disassembly um debugger utiliza um disassembler embutido para 
“disassemblar” o código de máquina em tempo de execução. É possível executar linha a linha o 
código assembly e “assistir” como a CPU executa cada instrução do malware. Essa capacidade de 
saber o que está sendo executado é muito valiosa para a análise do malware, inclusive para entender 
trechos mais complexos de seu código ou ainda para tentar remover determinadas proteções do 
código. Ao decorrer do curso utilizaremos bastante debuggers. 
 
Segue uma lista dos mais utilizados: 
 
- OllyDbg 
OllyDbg é um dos mais utilizados debuggers para análise de malware. É um user-mode x86 
debugger com uma interface gráfica. Inúmeros plug-ins estão disponíveis para o OllyDbg, como por 
exemplo, o OllyDump muito utilizado para unpacking de malwares. 
Download: http://www.ollydbg.de/. 
 
- ImmunityDebugger 
O ImmDbg é um user-modedebugger disponível gratuitamente. É derivado do código-fonte do 
http://www.ollydbg.de/
Engenharia Reversa e Análise de Malware | 15 
Ronaldo Pinheiro de Lima | www.crimesciberneticos.com 
 
OllyDbg 1.1, possui pequenas modificações da GUI do OllyDbg e um interpretador Python 
completamente funcional com uma API que permite escrever e rodar scripts nessa linguagem. 
Download: http://www.immunityinc.com/products-immdbg.shtml. 
 
- WinDbg 
WinDbg é o debugger completo mais popular, distribuído gratuitamente pela Microsoft. Você pode 
utilizá-lo para debugar malware em user-mode, kernel-mode, x86 e x64. O WinDbg não tem a 
interface gráfica robusta como o OllyDbg, ao invés disso possui uma interface de linha de 
comandos. Muitos analistas de malware optam por usar o OllyDbg para user-mode debugging e o 
WinDbg para kernel debugging. WinDbg pode ser baixado independente ou como parte do 
Windows SDK. 
Download: http://msdn.microsoft.com/. 
 
Descompiladores 
 
Descompilar é o próximo passo após o disassembler. Um descompilador recebe um arquivo 
executável binário como entrada e tenta produzir código de linguagem de programação de alto-nível 
a partir dele. A ideia é tentar reverter o processo de compilação para obter o código-fonte original 
ou algo similar a isso. Na maioria das plataformas conseguir isso não é realmente possível, existem 
elementos na maioria das linguagens de programação de alto-nível que são perdidas no processo de 
compilação e fica impossível a recuperação. Porém, ainda assim descompiladores são ferramentas 
poderosas que em determinadas situações e ambientes podem reconstruir o código de alto-nível de 
forma bastante aceitável. Por exemplo, às vezes é possível recuperar janelas e imagens de 
determinados malwares, o que torna muito mais fácil a sua compreensão. 
 
Segue uma lista dos mais utilizados: 
 
- DeDe 
Popular descompilador para executáveis compilados em Delphi. Possui interface gráfica onde é 
possível visualizar o nome original do projeto Delphi, a versão utilizada, forms encontrados, 
funções e mais. Ainda permite salvar o projeto em formato nativo do Delphi o que permite posterior 
abertura na IDE. Apesar de nem sempre apresentar resultados satisfatórios é muito útil para 
recuperar GUIs de malwares. 
Download: 
http://www.softpedia.com/get/Programming/Debuggers-Decompilers-Dissasemblers/DeDe.shtml. 
http://www.immunityinc.com/products-immdbg.shtml
http://msdn.microsoft.com/
http://www.softpedia.com/get/Programming/Debuggers-Decompilers-Dissasemblers/DeDe.shtml
Engenharia Reversa e Análise de Malware | 16 
Ronaldo Pinheiro de Lima | www.crimesciberneticos.com 
 
 
- VB Decompiler Pro 
Descompilador para executáveis compilados com a linguagem de programação Visual Basic. 
Recupera funções, forms, nome do projeto e permite salvar o projeto para posterior utilização com o 
Visual Basic. 
Download: http://www.vb-decompiler.org/products/pt.htm. 
 
- Hex-RaysDecompiler 
Apesar de ser uma ferramenta paga (e cara, 2.239,00 USD) vale à pena citar a título de 
conhecimento. O Hex-RaysDecompiler é um poderoso plug-in para o IDA Pro que tenta converter 
código assembly em código amigável para humanos, uma espécie de pseudocódigo em C. Por 
exemplo, com o uso do plug-in 100 linhas de código assembly podem se transformar em apenas 8 
linhas de código C.O plug-in é muito útil para decifrar complexos algoritmos de criptografia. É a 
melhor ferramenta no mercado para descompilação, mas não é livre de falhas. 
Para mais informações: http://www.hex-rays.com/. 
 
Memory Forensics 
 
Memory forensics ou forense de memória refere-se a encontrar e extrair artefatos forenses 
da memória física de um computador (RAM). A RAM contém informação crítica sobre o estado do 
sistema em execução enquanto ele ainda está ativo. Capturando uma cópia inteira da memória e 
analisando e um computador separado, é possível reconstruir o estado original do sistema, incluindo 
quais aplicações estavam rodando, quais arquivos essas aplicações estavam acessando, quais 
conexões de rede estavam ativas, e muito mais. Em análise de malware esse acesso à memória 
auxilia na retirada de proteções, detecção de rootkits, e na engenharia reversa como um todo. 
Existem basicamente dois tipos de ferramentas relacionadas com forense de memória, o primeiro 
tipo são as ferramentas que realizam a captura da RAM do computador, elas fazem uma cópia 
idênticade tudo o que está na memória, ou de apenas de um determinado processo, e salva em um 
arquivo para posterior análise, esse processo é conhecido como dump de memória. O segundo tipo 
de ferramenta é responsável pela análise da memória capturada, a partir do arquivo de dump ela 
consegue reconstruir todas as informações que estavam originalmente na RAM do sistema e nos 
exibir de forma amigável, permitindo variadas opções de buscas e listagens. 
 
Segue uma lista das mais utilizadas: 
 
http://www.vb-decompiler.org/products/pt.htm
http://www.hex-rays.com/
Engenharia Reversa e Análise de Malware | 17 
Ronaldo Pinheiro de Lima | www.crimesciberneticos.com 
 
- LordPE 
É uma ferramenta gratuita para realizar o dump de um executável na memória, com ele é possível 
selecionar um processo que esteja em execução e copiá-lo inteiro ou parcialmente. Ele permite 
editar o arquivo PE e pode ser utilizado para corrigir um programa que foi copiado da memória com 
outra ferramenta. Ferramenta bastante utilizada para unpacking de malware. 
Download: http://www.woodmann.com/collaborative/tools/index.php/LordPE. 
 
- MoonSols Windows Memory Toolkit 
É um kit de ferramentas completo para aquisição e conversão de dumps de memória no Windows. 
Pode lidar com vários tipos de dumps de memória como, por exemplo, VMWarememory snapshot, 
Microsoft crash dump e até arquivos de hibernação do Windows. No kit há inúmeras ferramentas 
como, por exemplo, a win32dd e a DumpIt que com apenas um clique realiza o dump da memória 
física do Windows e salva no diretório atual, ideal para ser utilizada em drives USB para rápida 
resposta a incidentes. O kit possui uma versão Professional paga e uma gratuita para a comunidade. 
Download: http://www.moonsols.com/windows-memory-toolkit/. 
 
- Memoryze 
Ferramenta gratuita criada pela empresa MANDIANT para forense de memória. Memoryze pode 
adquirir e/ou analisar toda a memória física ou apenas a referente a um processo, em um sistema em 
execução ou em um dump de memória salvo. Também pode detectar rootkits e os hooks que eles 
instalam. Para visualizar a saída gerada pela ferramenta Memoryze é necessário fazer download 
também da ferramenta AuditViewer, o que torna o processo de análise rápido e mais intuitivo. 
Download: http://www.mandiant.com/products/free_software/memoryze/. 
 
- Volatility Framework 
É uma coleção de ferramentas open source escritas em Python para live análise de dumps de 
memória. Esse conjunto de ferramentas é útil para análise de malware, pois pode ser utilizada para 
extrair DLLs injetadas em processos, detectar rootkits, encontrar processos ocultos, e muito mais. O 
Volatility possui muitos usuários e colaboradores, então novos recursos estão constantemente sendo 
desenvolvidos. 
Download: http://code.google.com/p/volatility/. 
 
Além dessas categorias existem ferramentas diversas que auxiliam em alguma tarefa 
específica da análise do malware. Podemos citar algumas úteis para o arsenal do analista de 
malware. 
http://www.woodmann.com/collaborative/tools/index.php/LordPE
http://www.moonsols.com/windows-memory-toolkit/
http://www.mandiant.com/products/free_software/memoryze/
http://code.google.com/p/volatility/
Engenharia Reversa e Análise de Malware | 18 
Ronaldo Pinheiro de Lima | www.crimesciberneticos.com 
 
 
Diversas 
 
- CFF Explorer 
Uma ferramenta designada para permitir a edição de arquivos PE de forma fácil. Útil para editar a 
seção resources, adicionar imports, ou escanear por assinaturas. 
Download: http://www.ntcore.com/. 
 
- Dependency Walker 
Ferramenta de análise estática para explorar DLLs e funções importadas por malwares. Constrói um 
diagrama em formato de árvore hierárquica com todas as DLLs que serão carregadas na memória 
quando o malware executar. 
Download: http://www.dependencywalker.com/. 
 
- Editores Hexadecimais 
Editores hex permitem editar e visualizar arquivos contendo dados binários. Existem muitos 
editores disponíveis alguns gratuitos e outros não, é necessário comparar as características de cada 
para descobrir o mais apropriado. Como sugestão de ferramenta gratuita para Windows pode-se 
baixar o HxDHex Editor, que possui uma boa interface gráfica e bom desempenho. 
Download: http://mh-nexus.de/en/hxd/. 
 
- ImportREConstructor 
ImpREC é uma ferramenta útil quando se está realizando o unpacking manual de um malware. A 
Import Address Table (IAT) é frequentemente danificada quando é feito o unpacking manual através 
de um dump de memória e você pode utilizar o ImpREC para recuperar a tabela. 
Download: http://tuts4you.com/download.php?view.415. 
 
- PEview 
PEview é uma ferramenta gratuita para visualizar as estruturas do arquivo PE. Você pode ver o 
cabeçalho PE, seções individuais e as tabelas de import/export. 
Download: http://www.magma.ca/~wjr/. 
 
- Resource Hacker 
É um utilitário gratuito para análise estática, com ele é possível visualizar, renomear, modificar, 
adicionar, excluir e extrair informações da seção resources de binários do tipo PE. Devido aos 
http://www.ntcore.com/
http://www.dependencywalker.com/
http://mh-nexus.de/en/hxd/
http://tuts4you.com/download.php?view.415
http://www.magma.ca/~wjr/
Engenharia Reversa e Análise de Malware | 19 
Ronaldo Pinheiro de Lima | www.crimesciberneticos.com 
 
malwares frequentemente extraírem uma DLL, ou um driver da seção resources em tempo de 
execução, essa ferramenta é muito útil para extrair essas seções sem a necessidade de executar o 
código malicioso. 
Download: http://www.angusj.com/resourcehacker/. 
 
- Strings 
Ferramenta de análise estática para examinar strings em ASCII e Unicode em arquivos binários. 
Utilizar Strings é frequentemente um jeito fácil de obter uma visão alto-nível das capacidades do 
malware, mas esse está com algum packer ou ofuscação Strings não tem muita utilidade. O 
comando Strings já vem nativo em todas as distribuições Linux e no Windows e possível fazer o 
download da ferramenta, ela faz parte da SysinternalsSuite. 
Download: http://www.sysinternals.com/. 
1.5. Antireversing e anti-antivirus 
 
Atualmente quase todos os malwares possuem alguma espécie de “armadura” para se 
protegerem. Primeiramente para evitarem ser detectados pelas ferramentas de segurança como 
antivírus e sistemas de detecção de intrusão. Também querem ficar longe dos olhares curiosos dos 
analistas de vírus, pesquisadores de segurança e outros profissionais interessados em realizar a 
engenharia reversa do código. Além disso, essas técnicas de ofuscação também são utilizadas para 
prevenir que outros “hackers” examinem o código, determinando onde o atacante está controlando 
os computadores infectados ou armazenando os dados furtados das vítimas, e tomem para si essa 
botnet para aumentar seus lucros ilícitos com phishings e distribuição de malwares. Ainda como 
forma de proteção, dentro do código de um malware pode haver uma lista de outros malwares que 
são desinstalados assim que o computador é infectado, mantendo pra si o controle total do 
computador da vítima. 
São utilizadas variadas técnicas para proteger e esconder o conteúdo original do arquivo, já é 
bem comum utilizarem mais de uma camada de proteção em um código para terem certeza que ele 
se permanecerá indetectável. Os mecanismos de antireversing mais conhecidos são: packers, 
cryptors (criptografia) e binders, joiners ou wrappers. Também são utilizadas técnicas como 
polimorfismo e metamorfismo para se manterem distantes dos programas antivírus. Vejamos a 
seguir o que cada técnica significa e posteriormente em outras aulas explorá-las com mais detalhes. 
1.5.1. Polimorfismo 
 
A maneira mais fácil para o antivírus identificar programas maliciosos é através de 
http://www.angusj.com/resourcehacker/
http://www.sysinternals.com/
Engenharia Reversa e Análise de Malware | 20 
Ronaldo Pinheiro de Lima | www.crimesciberneticos.com 
 
assinaturas. Ele mantém um banco dedados frequentemente atualizado com assinaturas de vírus, 
que visa conter uma identificação única para cada malware conhecido. Esta identificação é baseada 
em uma sequência única que foi encontrada em uma amostra específica do programa malicioso. 
O polimorfismo é uma técnica que frustra a identificação baseada em assinatura porque ela 
codifica ou criptografa o código do programa de uma forma que mantém a sua funcionalidade 
original. A abordagem mais simples para o polimorfismo é baseada na criptografia do malware 
usando uma chave aleatória e descriptografando em tempo de execução. Dependendo do momento 
que um antivírus examina o malware por sua assinatura, isso pode impedir a identificação precisa 
do programa malicioso porque cada cópia é completamente diferente (devido à criptografia que 
utiliza a chave aleatória). Porém essa técnica não é livre de falhas já que o antivírus pode escanear o 
malware na memória conseguindo atingir seu código original ou ainda utilizar como assinatura o 
próprio algoritmo de descriptografia do malware que sempre será o mesmo. 
1.5.2. Metamorfismo 
 
Devido ao polimorfismo ser limitado a modificações superficiais no código de 
descriptografia do malware ainda há muitos meios para o antivírus identificar código polimórfico, 
isso pode ser feito analisando o código e extraindo certas informações de alto-nível dele. 
Nessa situação que o metamorfismo é utilizado, ao invés de criptografar o corpo do 
programa e realizar pequenas modificações no mecanismo de descriptografia, é possível alterar todo 
o programa cada vez que o malware é replicado. A vantagem do metamorfismo (do ponto de vista 
do autor) é que cada versão do artefato malicioso é radicalmente diferente das outras. Isso faz com 
que seja muito difícil para os desenvolvedores dos antivírus utilizar qualquer tipo de detecção por 
assinatura. 
Metamorfismo requer um poderoso mecanismo de análise de código que precisa estar embutido 
dentro do programa malicioso. Esse mecanismo escaneia o código do programa e gera uma 
diferente versão dele em tempo de execução cada vez que o programa é duplicado. A parte 
inteligente aqui é o tipo de modificações feitas pelo programa. Um mecanismo metamórfico pode 
executar uma enorme variedade de alterações no programa malicioso, não precisa nem dizer que as 
alterações são realizadas no programa todo inclusive no próprio mecanismo. Em resumo, 
combinando diversas técnicas, um mecanismo metamórfico pode criar malware realmente flexíveis 
que pode ser muito difícil de localizar e identificar. 
1.5.3. Packers 
 
Os termos packer (empacotador), compressor (compressor) e packing (embalagem) são utilizados 
Engenharia Reversa e Análise de Malware | 21 
Ronaldo Pinheiro de Lima | www.crimesciberneticos.com 
 
nos meios hackers como sinônimo para se referirem geralmente a programas de ofuscação de 
arquivos. Packers são programas que permitem ao usuário comprimir, e muitas vezes criptografar, o 
conteúdo de um arquivo executável sem perder suas funcionalidades. Ele comprime o executável 
original e por consequência ofusca seu conteúdo, cria um novo conteúdo de código executável, 
insere no código uma rotina de descompressão, que geralmente fica no final do arquivo, e modifica 
o entry point do executável para apontar para essa rotina de descompressão. Quando o programa é 
executado a rotina de descompressão entra em ação e o programa é “unpacked” na memória, 
iniciando assim a execução do código original. 
1.5.4. Cryptors 
 
Programas de criptografia de arquivos executáveis (encryptors), também conhecido nos meios 
hackers como cryptors, crypters e protectors, têm os mesmos propósitos dos packers para os 
atacantes, são utilizados para ocultar o conteúdo de um arquivo executável. Também tendem a se 
manterem indetectáveis pelos antivírus e IDS e resistirem a esforços de engenharia reversa. 
Diferente dos packers, os cryptors fazem isso utilizando um algoritmo de criptografia no 
executável, fazendo com que o conteúdo arquivo alvo fique embaralhado e indecifrável. Cryptors 
também inserem no código uma rotina de descriptografia que é responsável por trazer de volta o 
conteúdo original do arquivo na memória toda vez que ele é executado. Além do algoritmo de 
criptografia outra diferença dos packers é que eles geralmente não possuem algoritmos de 
compressão de dados, não têm como objetivo diminuir o tamanho do arquivo. 
 
1.5.5. Binders, Joiners ou Wrappers 
 
Binder (também conhecido como joiner ou wrapper) em ambiente Windows recebe como 
entrada um arquivo executável (geralmente malicioso) e outro arquivo qualquer (geralmente 
benigno), e junta os dois formando um só arquivo executável. O autor pode determinar qual arquivo 
será executado e se essa execução será oculta ou não, além de determinar em qual pasta será 
copiado, quais ações a serem tomadas com os dois arquivos, etc. Por exemplo o atacante pode 
combinar o arquivo malicioso com um arquivo JPG, quando a vítima o executar será aberta a 
imagem JPG e o arquivo malicioso pode ser executado de forma oculta para não levantar suspeita. 
Esse pode ser um mecanismo efetivo para distribuição de malwares. 
1.5.6. Strings Ofuscadas 
 
Veremos nos capítulos posteriores que quando um programa é compilado seu código-fonte é 
Engenharia Reversa e Análise de Malware | 22 
Ronaldo Pinheiro de Lima | www.crimesciberneticos.com 
 
transformado em uma linguagem que o computador entenda, geralmente chamamos isso de 
linguagem de máquina. Mesmo com essa transformação alguns elementos originais do código-fonte 
do programa permanecem iguais, isso se a aplica para as cadeias de caracteres, mais conhecidas 
como strings. Strings podem conter URLs, endereços de e-mails, conexões com servidores de banco 
de dados, nomes de usuários e senhas, etc. Sabendo que essas informações podem permanecer 
visíveis nos executáveis mesmo após o processo de compilação, os autores de malwares passaram a 
adotar medidas para ofuscar o conteúdo dessas strings. Geralmente isso é feito através de 
algoritmos de criptografia, antes de compilar o programa o atacante seleciona as strings originais do 
código-fonte, as insere em programas cryptors de strings, pega o resultado (a string criptografada) e 
substitui a original do código por essa nova. Feito isso, antes de usar cada string criptografada do 
código ele faz uma chamada para uma função de descriptografia, que em tempo de execução irá 
reverter o processo retornando a string original. Essa técnica será tratada em detalhes nos próximos 
capítulos. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Engenharia Reversa e Análise de Malware | 23 
Ronaldo Pinheiro de Lima | www.crimesciberneticos.com 
 
2. Estruturas Internas dos Softwares 
 
Softwares podem ser considerados umas das mais complexas criações do homem moderno. 
O seu desenvolvimento envolve inúmeras ferramentas como linguagens de programação, 
compiladores, linkers, debuggers, sistemas operacionais, etc. No surgimento dos computadores os 
programadores de software deveriam conhecer todos os mecanismos internos do ambiente onde 
seus programas seriam executados, caso contrário não obteriam sucesso. Isso inclui gerenciamento 
de memória, funcionamento da CPU, linguagem de máquina e muitos outros tópicos. Com o passar 
dos anos, até chegar aos dias atuais, foram criadas diversas camadas de abstrações no 
desenvolvimento de software. Isso possibilita que o desenvolvedor não mais precise conhecer todos 
os mecanismos internos do computador para conseguir produzir um software. De forma 
simplificada ele precisa apenas entender algumas instruções (linguagens de programa de alto-nível) 
que informam ao computador o que fazer. 
Malware nada mais é do que um software com intenções maliciosas, desse modo do ponto 
de vista da engenharia reversa de malware esse avanço que tivemos no desenvolvimento de 
software não é muito bom já que ele deixouos programadores com menos conhecimentos dos 
aspectos internos dos softwares. 
Ao analisar um malware a única coisa que temos é o arquivo malicioso e mais nada, não 
temos o código-fonte com a linguagem de alto-nível que foi utilizada para criá-lo. E as informações 
que conseguimos extrair desse arquivo geralmente estão em baixo-nível, por isso quanto maior for o 
conhecimento dessas estruturas internas dos softwares mais resultados satisfatórios conseguiremos 
extrair das ferramentas. Vamos então iniciar nossa jornada ao mundo dos softwares! 
2.1. Níveis de abstração 
 
Em arquitetura de computadores, tradicionalmente um computador pode ser representado 
através de inúmeros níveis de abstração (camadas) para assim criar um meio de esconder detalhes 
de implementação. Por exemplo, você pode executar o sistema operacional Windows em diferentes 
tipos de hardware porque a camada de hardware abaixo é abstraída do SO. 
Autores de malware criam programas em linguagens de alto-nível e usam um compilador 
para gerar código de máquina que será executado pela CPU. Reciprocamente, analistas de malware 
e engenheiros reversos operam no nível das linguagens de baixo-nível; nós utilizamos um 
disassembler para gerar código assembly e assim podemos ler e analisar para tentar descobrir como 
Engenharia Reversa e Análise de Malware | 24 
Ronaldo Pinheiro de Lima | www.crimesciberneticos.com 
 
um programa malicioso funciona. 
A Figura abaixo mostra um modelo simplificado de três níveis de código envolvidos em 
análise de malware. 
 
Apesar de haver apenas três níveis de abstração na figura, geralmente computadores são 
descritos com os seis diferentes níveis de abstração que se seguem. Listaremos esses níveis 
começando pelo mais baixo. Os níveis mais altos são colocados no topo e quanto mais baixo você 
vai, menor o nível de portabilidade dos sistemas. 
 
Hardware: O nível do hardware, o único nível físico, consiste em circuitos elétricos que 
implementam complexas combinações de operadores lógicos como o XOR, AND, OR e NOT, 
conhecido como lógica digital. Por causa da sua natureza física, o hardware não pode ser facilmente 
manipulado por software. 
 
Microcódigo: O nível microcódigo também é conhecido como firmware. Microcódigo opera 
somente no exato circuito para o qual foi projetado. Ele contém micro instruções que traduzem o 
código de máquina de alto-nível para prover um meio de interface com o hardware. Quando 
realizamos análise de malware geralmente não nos preocupamos com o microcódigo porque ele é 
bem específico para o hardware para o qual foi escrito. 
 
Código de máquina: O nível do código de máquina consiste em opcodes, dígitos hexadecimais que 
dizem ao processador o que você quer que ele faça. Código de máquina tipicamente é 
implementado com muitas instruções de microcódigo, assim a camada abaixo de hardware 
consegue executar o código. Ele é criado quando um software escrito em linguagem de alto-nível é 
compilado. 
 
Engenharia Reversa e Análise de Malware | 25 
Ronaldo Pinheiro de Lima | www.crimesciberneticos.com 
 
Linguagens de baixo-nível: Uma linguagem de baixo-nível é a versão amigável aos humanos do 
conjunto de instruções da arquitetura do computador. A linguagem mais comum de baixo-nível é a 
linguagem assembly. Analistas de malware operam no nível das linguagens de baixo-nível porque o 
código de máquina é muito difícil para humanos compreenderem. Utilizamos um disassembler para 
gerar texto em linguagem de baixo-nível, que consiste em simples mnemônicos como o MOV e 
JMP. Existem diferentes dialetos da linguagem assembly, durante o curso iremos focar na sintaxe 
Intel x86. Assembly é a linguagem de mais alto nível que conseguimos recuperar de forma 
consistente e confiável do código de máquina quando o código-fonte original de alto-nível não está 
disponível. 
 
Linguagens de alto-nível: A maioria dos programadores opera no nível das linguagens de alto-
nível. Elas fornecem forte abstração do nível de máquina e facilitam o uso de lógica de 
programação e mecanismos de controle de fluxo. Linguagens de alto-nível incluem C, C++, Visual 
Basic, Pascal e outras. Essas linguagens são tipicamente convertidas em código de máquina por um 
compilador através de um processo chamado compilação. 
 
Linguagens interpretadas: Linguagens interpretadas estão no nível mais alto. Muitos 
programadores utilizam linguagens interpretadas como C#, Perl, Python, .NET e Java. O código 
nesse nível não é compilado em código de máquina; ao invés disso, é traduzido em bytecode. 
Bytecode é uma representação intermediária que é específica da linguagem de programação. Eles 
executam em um interpretador, que é um programa que traduz bytecode em código de máquina em 
tempo de execução. Um interpretador fornece um nível automático de abstração quando comparado 
com código compilado tradicional, porque ele manipula erros e gerenciamento de memória por si 
próprio, independentemente do sistema operacional. 
2.2. Engenharia Reversa 
 
Quando um malware está armazenado no disco, ele geralmente está no formato binário no 
nível de código de máquina. Como foi discutido, código de máquina é uma forma de código que o 
computador pode executar rapidamente e eficientemente. Quando nós fazemos o disassembly do 
malware (como mostrado na figura acima), o arquivo binário é usado como entrada para gerar 
código da linguagem assembly como saída, com a ajuda de um disassembler (IDA Pro). 
Linguagem assembly é na verdade uma classe de linguagens. Cada dialeto do assembly é 
normalmente utilizado para programar uma única família de processadores, como por exemplo x86, 
x64, SPARC, PowerPC, MIPS e ARM. A x86 é de longe a arquitetura mais popular para PCs. 
Engenharia Reversa e Análise de Malware | 26 
Ronaldo Pinheiro de Lima | www.crimesciberneticos.com 
 
A maioria dos computadores pessoais de 32-bit são x86, também conhecidos como Intel IA-
32, e todas as versões mais modernos do Microsoft Windows de 32-bit são projetados para rodar na 
arquitetura x86. Adicionalmente, a maioria das arquiteturas AMD64 e Intel 64 que rodam Windows 
também suportam binários para a arquitetura x86 32-bit. Por essa razão, a maioria dos malwares são 
compilados para a x86, que será o foco desse curso. Agora iremos nos focar nos aspectos mais 
importantes da arquitetura x86 para a análise de malwares. 
2.3. A Arquitetura x86 
 
As características internas da maioria das arquiteturas dos computadores atuais seguem a 
arquitetura de Von Neumann, ilustrada na figura abaixo. Ela tem três componentes de hardware: 
 - A central processing unit (CPU) executa código. 
 - A main memory (memória principal) do sistema (RAM) armazena todos os dados e código. 
 - Um sistema de entrada/saída (input/output, I/O) faz a interface com os dispositivos como 
discos rígidos, teclados e monitores. 
 
 
 
Como é possível ver na figura, a CPU possui vários componentes: 
- A control unit coordena a execução de instruções vindas da RAM, através de um 
registrador (o instruction pointer, EIP) que armazena o endereço da instrução a ser executada. Ela 
também envia resultados da ALU para a RAM. 
- Registradores são unidades de armazenamento básicas da CPU e são frequentemente 
utilizados para poupar tempo, assim a CPU não precisa acessar a RAM. 
- A ALU, arithmetic logic unit (unidade lógica e aritmética), executa uma instrução trazida 
da RAM e coloca os resultados nos registradores ou na própria RAM. 
O processo de trazer e executar instrução após instrução é repetido enquanto o programa 
Engenharia Reversa e Análise de Malware | 27 
Ronaldo Pinheiro de Lima | www.crimesciberneticos.com 
 
está rodando. 
2.4. Memória Principal (RAM) 
 
A memória principal para um programa em execução pode ser dividida em quatro seções 
principais, como mostrado na figura abaixo. 
 
 
Dados: Esse termo pode ser utilizado para referenciar uma seção específicada memória chamado 
de data section, que contém dados que são carregados na memória assim que o programa é 
executado. Esses valores às vezes são chamados de dados estáticos porque eles não mudam 
enquanto o programa está rodando, ou também podem ser chamados de dados globais porque estão 
disponíveis para qualquer parte do programa. 
 
Código: Código inclui as instruções que são trazidas pela CPU para executar as tarefas do 
programa. O código controla o que o programa faz e como as tarefas do programa serão 
coordenadas. 
 
Heap: A heap é utilizada para memória dinâmica durante a execução do programa, para criar 
(alocar) novos dados e eliminar (free) dados que o programa não mais precisa. A heap é também 
conhecida como memória dinâmica pois seu conteúdo pode mudar frequentemente enquanto o 
programa está rodando. 
 
Stack: A stack (pilha) é utilizada para variáveis locais e parâmetros de funções, e ajuda no controle 
do fluxo do programa. Falaremos com mais detalhes da stack logo mais. 
 
Engenharia Reversa e Análise de Malware | 28 
Ronaldo Pinheiro de Lima | www.crimesciberneticos.com 
 
Embora a figura mostre as quatro seções principais em uma ordem específica, essas seções 
podem ser alocadas em qualquer parte da memória. Por exemplo, não há garantia que a stack estará 
abaixo ao código ou vice-versa. 
2.5. Instruções 
 
Instruções são os blocos que constroem os programas. Em assembly x86, uma instrução é 
composta de um mnemônico e zero ou mais operandos. Como mostrado abaixo, o mnemônico é 
uma palavra que identifica a instrução a ser executada, como por exemplo MOV, que movem dados. 
Operandos são normalmente utilizados para identificar informações usadas pela instrução, como por 
exemplo um registrador ou valor. 
 
Formato de uma instrução 
Mnemônico Operando de destino Operando de origem 
MOV ECX 0x42 
 
2.6. Opcodes e Endianness (Ordenação) 
 
Cada instrução corresponde a opcodes (operation codes) que diz à CPU qual operação o 
programa quer realizar. Disassemblers traduzem opcodes em instruções legíveis por humanos. Por 
exemplo, na tabela abaixo você pode ver que o opcodes para a instrução “MOV ECX, 0x42” são 
“B9 42 00 00 00”. O valor 0xB9 corresponde ao “MOV ECX,” e “0x42000000” corresponde ao 
valor 0x42. 
 
Instruções e Opcodes 
Instrução MOV ECX, 0x42 
Opcodes B9 42 00 00 00 
 
0x42000000 é tratado como o valor 0x42 porque a arquitetura x86 usa o formato little-
endian. A endianness (ordem dos bytes) dos dados descreve se o mais significativo (big-endian) ou 
o menos significativo (little-endian) byte é ordenado primeiro, no endereço mais baixo da memória. 
Mudança de endianness é algo que o malware deve fazer durante a comunicação com a rede, isso 
devido aos dados de rede utilizarem o big-endian e programas x86 utilizarem little-endian. Dessa 
forma, o endereço IP 127.0.0.1 será representado como 0x7F000001 em big-endian (na rede) e 
Engenharia Reversa e Análise de Malware | 29 
Ronaldo Pinheiro de Lima | www.crimesciberneticos.com 
 
0x0100007F em little-endian (localmente na memória). Como um analista de malware você deve 
ser conhecedor desses formatos para ter certeza que não irá acidentalmente inverter a ordem dos 
bytes de importantes indicadores como um endereço IP. 
2.7. Operandos 
 
Operandos são utilizados para identificar os dados usados por uma instrução. Três tipos de 
operandos podem ser usados: 
 - Imediatos: operandos que possuem valor fixo, como por exemplo 0x42. 
 - Registradores: operandos que se referem aos registradores da CPU, como por exemplo 
ECX. 
 - Endereços de memória: operando que fazem referência a endereços da memória que 
contenham um valor de interesse, tipicamente denotados por um valor, registro ou equação entre 
colchetes, como exemplos [0xFFFFFFAA], [ECX] e [ECX+0x08]. 
2.8. Registradores 
 
Um registrador é o menor local de armazenamento de dados disponível para a CPU, cujo 
conteúdo pode ser acessado mais rapidamente que qualquer outro tipo de armazenamento. 
Processadores x86 têm uma coleção de registradores disponíveis, a tabela abaixo mostra os 
registradores mais comuns que se encaixam nessas quatro categorias: 
 - Registradores de uso geral são utilizados pela CPU durante a execução do programa. 
 - Registradores segmentados são utilizados para mapear seções da memória. 
 - Flags de status são utilizadas para a tomada de decisões. 
 - Instruction Pointers são utilizados para manter a sequência da próxima instrução a ser 
executada. 
 
Você pode utilizar a tabela abaixo como referência para consulta durante essa aula, as 
próximas seções discutem cada uma dessas categorias. 
 
Os Registradores x86 
Registradores de uso geral Registradores 
segmentados 
Flags de status Instruction pointers 
EAX (AX, AH, AL) CS EFLAGS EIP 
Engenharia Reversa e Análise de Malware | 30 
Ronaldo Pinheiro de Lima | www.crimesciberneticos.com 
 
EBX (BX, BH, BL) SS 
ECX (CX, CH, CL) DS 
EDX (DX, DH, DL) ES 
EBP (BP) FS 
ESP (SP) GS 
ESI (SI) 
EDI (DI) 
 
Todos os registradores de uso geral possuem 32 bits de tamanho e podem ser referenciados 
como 32 bits ou 16 bits no código assembly. Por exemplo, EDX é utilizado para referenciar o 
registrador de 32 bits inteiro, e DX é utilizado para referenciar os 16 bits menores do registrador 
EDX. 
Quatro registradores (EAX, EBX, ECX e EDX) também podem ser referenciados como 8 
bits usando os 8 bits mais baixos ou o segundo conjunto de 8 bits mais baixo. Exemplo, AL é 
utilizado para referenciar os 8 bits mais baixos do registrador EAX, e o AH é utilizado para 
referenciar o segundo conjunto de 8 bits mais baixos. 
A tabela acima lista as possíveis referências para cada registrador geral. O EAX 
desmembrado é ilustrado na figura abaixo. No exemplo, o EAX de 32 bits (4 bytes) contém o valor 
0xA9DC81F5 e o código pode referenciá-lo de três formas adicionais: AX (2 bytes) que é 0x81F5, 
AL (1 byte) que é 0xF5 e AH (1 byte) que é 0x81. 
 
 
Registradores de uso geral 
 
Esses registradores geralmente armazenam dados ou endereços de memória e são raramente 
Engenharia Reversa e Análise de Malware | 31 
Ronaldo Pinheiro de Lima | www.crimesciberneticos.com 
 
utilizados alternadamente. Todavia, apesar de serem chamados de registradores globais, eles nem 
sempre são empregados dessa forma. 
Algumas instruções x86 usam registradores específicos por padrão. Por exemplo, as 
instruções de multiplicação e divisão sempre utilizam o EAX e EDX. Adicionalmente, instruções 
específicas em determinados compiladores podem sempre utilizar os mesmos registradores em todo 
o programa. Isso é chamado de convenção. O conhecimento das convenções utilizadas pelos 
compiladores permite ao analista de malware examinar o código mais rapidamente. Um exemplo de 
convenção é o EAX que normalmente armazena o valor de retorno de uma função. Dessa forma se 
você ver o EAX logo após um CALL você provavelmente saberá que os dados manipulados através 
do EAX dizem respeito ao retorno da função. 
 
Flags 
 
O registrador EFLAGS é um registrador de status. Na arquitetura x86, ele possui 32 bits de 
tamanho e cada bit é uma flag. Durante a execução, cada flag é ligada (1) ou desligada (0) para 
controlar as operações da CPU ou indicar resultados dessas operações. As flags abaixo são as mais 
importantes para a análise de malware: 
 - ZF: A Zero Flag é ligada (1) quando o resultado de uma operação é igual à zero; para 
outros resultados ela é desligada (0). 
 - CF: A Carry Flag é ligada (1) quando o resultado de uma operação é muito grande ou 
muito pequeno para um operando, para outros resultados ela é desligada (0). 
 - SF: A Sign Flag é ligada (1) quando o resultado de uma operação é negativo ou desligada 
(0) quando o resultado é positivo. Essa flag também é ligada quando o bit mais significativo é 
ligado após uma operação aritmética. 
 - TF: A Trap Flag é usada para debugging. O processador

Outros materiais