Engenharia reversa/Introdução

Para quem é este livro? editar

É esperado que o leitor seja iniciante ou mesmo já iniciado em engenharia reversa, mas não em computação. Lógica de programação é essencial para o máximo aproveitamento deste conteúdo. Conhecer um pouco sobre sistemas operacionais e programação também ajuda muito.

O que é engenharia reversa? editar

Em termos amplos, engenharia reversa é o processo de entender como algo funciona através da análise de sua estrutura e comportamento. É uma arte que permite conhecer como um sistema foi pensado/desenhado sem ter contato com o projeto original.

Não restrinjamos, portanto, a engenharia reversa à tecnologia. Qualquer um que se disponha a analisar algo de forma minuciosa com o objetivo de entender seu funcionamento a partir de seus efeitos ou estrutura está fazendo engenharia reversa. Podemos dizer, por exemplo, que Carl G. Jung (conhecido como o pai da psicologia analítica) foi um grande engenheiro reverso ao introduzir conceitos como o de inconsciente coletivo através da análise do comportamento humano.

No campo militar e época de guerras é muito comum assegurar que inimigos não tenham acesso às armas desenvolvidas, aviões, tanques e outros dispositivos para que os exércitos alheios não desmontem, entendam seu funcionamento e o superem. Na prática, é evitar a engenharia reversa. Um bom filme que retrata este contexto é o Jogo da Imitação.

Engenharia reversa de software editar

Este livro foca na engenharia reversa de software, ou seja, no processo de entender como uma ou mais partes de um programa funcionam, sem ter acesso a seu código-fonte. Daremos um foco inicial em programas para a plataforma x86 (de 32-bits), rodando sobre o sistema operacional Windows, da Microsoft, mas vários dos conhecimentos expressos aqui podem ser úteis para engenharia reversa de software em outros sistemas operacionais, como o GNU/Linux e até mesmo em outras plataformas, como ARM.

Por que a engenharia reversa de software é possível? editar

Assim como o hardware, o software também pode ser desmontado. De fato, existe uma categoria especial de software chamados de disassemblers (desmontadores), com esta função. Para explicar como isso é possível, primeiro é preciso entender como um programa de computador é criado atualmente. Farei um resumo aqui, mas entenderemos mais a fundo em breve.

A parte do computador que de fato executa os programas é o chamado processador. Nos computadores de mesa (desktops) e laptops atuais, norlamente se encontra processadores fabricados pela Intel ou AMD. Para ser compreendido por um processador, um programa precisa falar sua língua: a linguagem (ou código) de máquina.

Os humanos, em teoria, não falam em linguagem de máquina. Bem, alguns falam, mas isso é outra história. Acontece que para facilitar a criação de programas, algumas boas almas começaram a escrever programas onde humanos escreviam código (instruções para o processador) numa linguagem mais próxima da falada por eles (Inglês no caso). Assim nasceram os primeiros compiladores, que podemos entender como programas que "traduzem" códigos em linguagens como Assembly ou C para código de máquina.

Um programa é então uma série de instruções em código de máquina. Quem consegue olhar pra ele deste forma, consegue entender sua lógica, sem ter acesso ao código-fonte que o gerou. Isso vale para praticamente qualquer tipo de programa, seja escrito em C, C++, Pascal, Delphi, Visual Basic, D, Go e até mesmo em linguagens interpretadas como Python, Ruby, Perl ou PHP. Lembre-se que o processador só entende código de máquina. Então é importante notar que "tudo tem que acabar em linguagem de máquina". Qualquer um que a conheça será capaz de inferir que lógica o programa possui. Aliado ao conhecimento do ambiente de execução, é possível inclusive descrever exatamente o que um programa faz e nisto está a arte da engenharia reversa de software que você vai aprender nete livro. ;-)

Áreas de aplicação da engenharia reversa de software editar

Análise de malware editar

Naturalmente, os criadores de programas maliciosos não costumam compartilhar seus códigos-fonte com as empresas de segurança de informação. Sendo assim, analistas que trabalham nessas empresas ou mesmo pesquisadores independentes podem lançar mão da engenharia reversa afim de entender como essas ameaças digitais funcionam e então poderem criar suas defesas.

Análise de vulnerabilidade editar

Alguns bugs encontrados em software podem ser exploráveis por outros programas. Por exemplo, uma falha no componente SMB do Windows permitiu que a NSA desenvolvesse um programa que dava acesso a qualquer computador com o componente exposto na Internet. Para encontrar tal vulnerabilidade, especialistas precisam conhecer sobre engenharia reversa, dentre outras áreas.

Correção de bugs editar

Às vezes um software tem um problema e por algum motivo você ou sua empresa não possui mais o código-fonte ou o contrato com o fornecedor foi encerrado. Com engenharia reversa, pode ser possível corrigir tal problema.

Mudança e adição de recursos editar

Mesmo sem ter o código-fonte, é possível também alterar a maneira como um programa se comporta. Por exemplo, um programa que salva suas configurações num diretório específico pode ser instruído para salvar suas configurações num compartilhamento de rede.

Adicionar um recurso é, em geral, trabalhoso, mas possível.

(Anti-)pirataria editar

Software proprietário costuma vir protegido contra pirataria. Você já deve ter visto programas que pedem número de série, chave de registro, etc. Com engenharia reversa, os chamados crackers são capazes de quebrar essas proteções. Por outro lado, saber como isso é feito é útil para programadores protegerem melhor seus programas. ;-)

Reimplementação de software e protocolos editar

Um bom exemplo de uso da engenharia reversa é o caso da equipe que desenolve o LibreOffice: eles precisam entender como o Microsoft Office funciona, a fim de que os documentos criados nestas duas suítes de escritório sejam compatíveis. Outros bons exemplos incluem o Wine, capaz de rodar programas feitos para Windows no GNU/Linux, o Samba, Pidgin e aMSN. Todos são implementações livres de programas e/ou protocolos de rede proprietários.