ūü•á Introdu√ß√£o

O que é engenharia reversa

Em termos amplos, engenharia reversa √© o processo de entender como algo funciona atrav√©s da an√°lise de sua estrutura e de seu comportamento. √Č uma arte que permite conhecer como um sistema foi pensado ou 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 em √©poca de guerras √© muito comum assegurar que inimigos n√£o tenham acesso √†s armas avan√ßadas: avi√Ķes, tanques e outros dispositivos, pois √© importante que advers√°rios n√£o desmontem esses equipamentos, n√£o entendam seu funcionamento e, consequentemente, que n√£o criem vers√Ķes superiores deles ou encontrem falhas que permitam inutiliz√°-los com mais facilidade. Na pr√°tica, √© evitar a engenharia reversa.

Vale a pena assistir ao filme Jogo da Imitação (Imitation Game) que conta a história do criptoanalista inglês Alan Turing, conhecido como o pai da ciência de computação teórica, que quebrou a criptografia da máquina nazista Enigma utilizando engenharia reversa.

Engenharia reversa de software

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. Focaremos inicialmente 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

Assim como o hardware, o software também pode ser desmontado. De fato, existe uma categoria especial de softwares com esta função chamados de disassemblers, ou desmontadores. 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, normalmente é possível encontrar 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 desta forma, consegue entender sua l√≥gica, mesmo sem ter acesso ao c√≥digo-fonte que o gerou. Isso vale para praticamente qualquer tipo de programa, seja ele criado em linguagens onde a compila√ß√£o ocorre separada da execu√ß√£o, como C, C++, Pascal, Delphi, Visual Basic, D, Go e at√© mesmo em linguagens onde a compila√ß√£o ocorre junto √† execu√ß√£o, como Python, Ruby, Perl ou PHP. Lembre-se que o processador s√≥ entende c√≥digo de m√°quina e para ele n√£o importa qual √© o c√≥digo fonte, ou se a linguagem √© compilada(an√°lise e execu√ß√£o separadas) ou interpretada(an√°lise e execu√ß√£o juntas). Ent√£o √© importante notar que, para o processador poder executar, "tudo tem que acabar em linguagem de m√°quina". Qualquer um que a conhe√ßa ser√° capaz de inferir qual 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 neste livro. ;-)

√Āreas de aplica√ß√£o da engenharia reversa de software

An√°lise de malware

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 poder criar suas defesas.

An√°lise de vulnerabilidade

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

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

Mudança e adição de recursos

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 a salv√°-las num compartilhamento de rede.

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

(Anti-)pirataria

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

Um bom exemplo de uso da engenharia reversa é o caso da equipe que desenvolve o LibreOffice: mesmo sem ter acesso ao código fonte, eles precisam entender como o Microsoft Office funciona, a fim de que os documentos criados nos dois produtos sejam compatíveis. Outros bons exemplos incluem:

  • o Wine, capaz de rodar programas feitos para Windows no GNU/Linux;

  • o Samba que permite que o GNU/Linux apare√ßa e interaja em redes Windows;

  • o Pidgin que conecta numa s√©rie de protocolos de mensagem instant√Ęnea;

  • e at√© um sistema operacional inteiro chamado ReactOS, que lhe permite executar seus aplicativos e drivers favoritos do Windows em um ambiente de c√≥digo aberto e gratuito.

Todos estes s√£o exemplos de implementa√ß√Ķes em software livre, que tiveram de ser criadas a partir da engenharia reversa feita em programas e/ou protocolos de rede propriet√°rios.