# Engenharia reversa

A engenharia reversa é o processo de descobrir os princípios tecnológicos e o funcionamento de um dispositivo, objeto, ou sistema, através da análise de sua estrutura, função e operação. Objetivamente a engenharia reversa consiste em, por exemplo, desmontar uma máquina para descobrir como ela funciona. É objeto de estudo em universidades e faculdades principalmente ligada à área de tecnologia. Na informática a reversa binária é a prática de obter o código fonte a partir do arquivo executável de um programa computacional (decompilação), possibilitando a modificação e recompilação (prática ilegal do cracker).
A engenharia reversa é aplicada em áreas como a engenharia da computação, engenharia mecânica, engenharia eletrônica, engenharia de software, engenharia química e biologia computacional.

## História
### Tecnologia militar

Durante a Primeira Guerra Púnica (264-241 a.C.), a até então inferior marinha romana, foi equipada com embarcações construídas seguindo o modelo de navios capturados de Cartago. Segundo Plínio, o Velho, a República Romana construiu uma esquadra de 200 quinquerremes em apenas 60 dias (ver: Engenharia romana).
O ás da aviação francês da I Guerra Mundial, Roland Garros, criou um sistema de placas metálicas defletoras para proteger as pás da hélice de sua aeronave dos disparos de sua metralhadora. Em 19 de Abril de 1915, problemas mecânicos forçaram-no a pousar atrás das linhas inimigas e ele tentou, sem sucesso, destruir seu avião para ocultar seu sistema, antes de ser capturado pelos alemães.
Garros conseguiu fugir de seus captores mas, seu caça Morane-Saulnier Type L, foi estudado por Anthony Fokker que, em resposta, criou um mecanismo sincronizador para metralhadoras que foi instalado no monomotor Fokker Eindecker. O mecanismo desenvolvido por Fokker permitia que a arma deste avião disparasse através das pás da hélice sem atingi-las. O caça Fokker Eindecker garantiu ao Luftstreitkräfte (braço aéreo do Exército Imperial Alemão) a superioridade aérea sobre os aliados entre 1915 e 1916, período conhecido como "Flagelo Fokker". Nesta fase da guerra, os pilotos aliados chamavam seus próprios aviões de Fokker Fodder ("Alvos para os Fokker").
Na II Guerra mundial, os aliados copiaram o desenho dos recipientes (bidões) para transporte de combustíveis alemão, considerado mais eficiente. O recipiente kanister alemão deu origem ao jerrycan aliado. O armamento antitanque panzerschreck alemão foi um "clone" da bazuca americana. Em 1944, quatro bombardeiros Boeing B-29 Superfortress dos EUA fizeram pousos de emergência na URSS e, com a tecnologia obtida através da análise destas aeronaves, os soviéticos criaram o Tupolev Tu-4.
A Operação Diamante, executada pelo Mossad durante a Guerra Fria, teve o objetivo de adquirir um caça MiG-21 soviético. O que foi alcançado em 16 de Agosto de 1966, quando o piloto desertor Munir Redfa roubou um MiG-21 da Força Aérea do Iraque levando-o para Israel. O estudo deste caça, revelou segredos que foram aproveitados pelas forças aéreas de Israel e dos Estados Unidos. A Operação Diamante foi dramatizada no telefilme da HBO, Steal the Sky (pt. "Céu em Chamas", 1988), estrelado por Ben Cross e Mariel Hemingway.

## Descrição

Muitas vezes, a engenharia reversa envolve desmontar algo (um dispositivo mecânico, componente eletrônico, programa de computador, ou fatores biológicos, químicos ou matéria orgânica) e analisar seus componentes e funcionamento em detalhes, tanto para fins de manutenção ou para apoiar a criação de um novo dispositivo ou programa que faz a mesma coisa, assim como duplicar o original (ver: Cópia ilegal).
A engenharia reversa tem suas origens na análise de hardware para obter vantagem comercial ou militar. O objetivo é deduzir as decisões de design de produtos finais com pouco ou nenhum conhecimento adicional sobre os procedimentos envolvidos na produção original. As mesmas técnicas são posteriormente pesquisadas para aplicação em sistemas de software, não para fins industriais ou de defesa, mas sim para substituir documentação incorreta, incompleta ou indisponível.

## Uso
### Máquinas

Conforme o design auxiliado por computador (CAD) tornou-se mais popular, a engenharia reversa tornou-se um método viǘel para criar modelos 3D virtuais de uma parte física existente para utiliziiar em 3D CAD, CAM, CAE, e outros softwares. O processo de engenharia reversa envolve a medição de um objeto e então reconstruí-lo como um modelo tridimensional. O objeo físico pode ser medidio utilizando tecnologias de escaneamento 3D tais como CMMs, scanners a lase, tomografia computadorizada, etc. Fazendo a medição dos dados separadamente, geralmente representados como uma nuvem de pontos, fornecem informações insuficientes a respeito de aspectos topográficos e de intenção de design. A forma pode ser recuperada por meio da conversão da nuvem de pontos em uma malha de face triangular. A engenharia reversa tem por objetivo ir além de produzir tal malha e recuperar a intenção de design quando se trata de aspectos de superfícies analíticas simples, quando adequado, bem como, possivelmente superfícies NURBSS para produzir um modelo CAD de representação de limites.. A recuperação de tal modelo permite que um design seja modificado para atender a novos requisitos, um plano de fabricação seja gerado, etc.
A engenharia reversa também é utilizada por empresas para trazer geometria física existente para ambientes de desenvolvimento de produtos digitais, para fazer um registro digital tridimensional de seus próprios produtos ou para avaliar produtos de competidores. Também é usada para analisar como um produto funciona, o que ele faz, quais componentes possui,, custos estimados, identificar potencial violação de patente, etc.

### Engenharia Reversa em PCI

A engenharia reversa de placas de circuito impresso envolve recriar os dados da fabricação para uma placa de circuito específica. Isso é realizado para permitir testes (benchmarking) e fornecer suporte para sistemas embarcados.

### Software

Em 1990, o Instituto de Engenheiros Eletricistas e Eletrônicos (IEEE) definiu engenharia reversa de software (SRE) como “o processo de analisar um determinado sistema para identificar as componentes desse sistema e suas inter relações e criar representações do sistema em outra forma ou ao um maior nível de abstração, sendo que esse sistema é o produto final do desenvolvimento de software. A engenharia reversa é apenas o processo de investigação, e o sistema de software que está sendo considerado não é modificado, que de outro modo seria reestruturado. A engenharia reversa pode ser realizada a partir de qualquer estágio do ciclo do produto, não necessariamente no quando esse produto está finalizado e funcional.
Há duas componentes na engenharia reversa: Documentar novamente e recuperação de design (projeto). O intuito de documentar novamente é a criação de um novo modo de representar o código de forma que fique mais fácil de compreender. Enquanto isso, a recuperação de design (projeto) é o uso da dedução ou raciocínio lógico a partir de conhecimento geral ou experiência pessoal do produto para entender completamente a funcionalidade do produto. Isso pode ser visto como “voltar no ciclo de desenvolvimento”. Em 1990, o Instituto de Engenheiros Eletricistas e Eletrônicos (IEEE) definiu engenharia reversa de software (SRE) como “o processo de analisar um determinado sistema para identificar as componentes desse sistema e suas inter relações e criar representações do sistema em outra forma ou ao um maior nível de abstração, sendo que esse sistema é o produto final do desenvolvimento de software. A engenharia reversa é apenas o processo de investigação, e o sistema de software que está sendo considerado não é modificado, que de outro modo seria reestruturado. A engenharia reversa pode ser realizada a partir de qualquer estágio do ciclo do produto, não necessariamente no quando esse produto está finalizado e funcional.
Há duas componentes na engenharia reversa: Documentar novamente e recuperação de design (projeto). O intuito de documentar novamente é a criação de um novo modo de representar o código de forma que fique mais fácil de compreender. Enquanto isso, a recuperação de design (projeto) é o uso da dedução ou raciocínio lógico a partir de conhecimento geral ou experiência pessoal do produto para entender completamente a funcionalidade do produto. Isso pode ser visto como “voltar no ciclo de desenvolvimento”. Nesse modelo, a saída da etapa de implementação (na forma de código fonte) é aplicar a engenharia reversa de volta à fase de análise, em uma inversão do modelo tradicional de cascata. Outro termo para essa técnica é a compreensão do programa. A Conferência de Trabalho sobre Engenharia Reversa (The Working Conference on Reverse Engineering – WCRE) tem sido realizada anualmente para explorar e expandir as técnicas de engenharia reversa. A engenharia de software auxiliada pelo computador (CASE – Computer-aided software engineering) e a geração automática de código contribuíram imensamente na área da engenharia reversa.
Software com tecnologia anti-adulteração como ofuscação é usado para impedir a engenharia reversa e aplicar a engenharia reversa de software proprietário e sistemas alimentados por software. Na prática, dois aspectos principais da engenharia reversa aparecem. No primeiro caso, o código fonte já está disponível para o software, mas há aspectos de alto nível do programa, os quais esteja mal documentados ou estão documentados porém não são mais válidos. No segundo caso, não há código fonte disponível para o software, e quaisquer esforços para descobrir um possível código fonte para esse software são considerados engenharia reversa. A engenharia reversa pode fazer uso da técnica de design de sala limpa para evitar violações de direitos autorais.
Outros propósitos da engenharia reversa incluem a auditoria de segurança, remoção da proteção contra de cópia (cracking), contornar as restrições de acesso frequentemente presente nos dispositivos eletrônicos, customização de sistemas embarcados, reparos ou retroajustes internos, habilitar recursos adicionais em hardwares de baixo custo que foram utilizados demasiadamente.

#### Software Binário

A engenharia reversa binária é executada se o código fonte para determinado software está indisponível. Esse processo às vezes é denominado como engenharia reversa de código (RCE) . Por exemplo, a decompilação de binários para a plataforma Java pode ser realizada utilizando Jad. Um caso famoso de engenharia reversa foi a primeira implementação não IBM do PC BIOS, que lançou o histórico setor compatível com IBM PC, que tem sido a plataforma de hardware predominante por muitos anos. Um exemplo moderno é a reversão do arquivo .APK (arquivo de instalação de aplicativos no sistema Android), usando os programas Dex2Jar junto com JD-GUI, ou usando o programa apktool.

#### Técnicas de software binário

A engenharia reversa de software pode ser realizada por meio de diversos métodos. Os três principais grupos de engenharia reversa de software são:
* Análise através observação da troca de informação, mais predominante na engenharia reversa de protocolos, o que envolve o uso de analisadores de barramento e farejador (sniffers) de pacotes, tais como para acessar o barramento de computador ou a conexão de rede de computador e revelar os dados de tráfego nele. O comportamento do barramento ou da rede pode ser analisado para produzir uma implementação independente que copia seu comportamento. Isso é especialmente útil para engenharia reversa de drivers de dispositivos. Às vezes, a engenharia reversa em sistemas embarcados é amplamente auxiliada por ferramentas que deliberadamente foram apresentadas pelo fabricante, tais como os portas de JTAG ou outros meios de depuração . No Microsoft Windows, os depuradores de baixo nível como SoftICE possuem bastante popularidade.
* Desmontagem (Disassembly) utilizando um desmontador (disassembler), isto é, a linguagem de máquina pura/bruta do programa é lida e compreendida em seus próprios termos, apenas com a ajuda de mnemônicos de linguagem de máquina. Isso funciona em qualquer programa de computador mas pode levar algum tempo, especialmente para aqueles que não estão acostumados com código escrito em linguagem de máquina. O desmontador interativo (The Interactive Disassembler) é uma ferramenta particularmente popular.
* Decompilação utilizando um decompilador, um processo que tenta, com resultados diversos, recriar o código fonte em alguma linguagem de alto nível para um programa que apenas está disponível em código escrito em linguagem de máquina ou bytecode.

#### Classificação de Software

A classificação de software é o processo de identificar semelhanças entre diferentes binários de software (como duas versões diferentes do mesmo binário) utilizados para detectar relações de código entre amostras de software. A tarefa foi tradicionalmente feita manualmente por diversos motivos (como análise de correções para detecção de vulnerabilidade e violação de direitos autorais), mas atualmente pode ser feita automaticamente, de certo modo, para um grande número de amostras.
Esse método é usado principalmente para tarefas de engenharia reversa longas e completas (análise completa de um algoritmo complexo ou grande parte do software). Em geral, a classificação estatística é considerada um problema difícil, o qual também é verdade para classificação de software, e poucas soluções/ferramentas lidam bem com essa tarefa.

# Razões

Existem vários motivos para realizar engenharia reversa em varias áreas.
A engenharia reversa tem suas origens na análise de hardware para obter vantagem comercial ou militar. Entretanto, a engenharia como processo, como tal, não está preocupada em criar cópias ou mudar o artefato de alguma maneira. Sua principal preocupação está na análise para dedução de características de design (projeto) de produtos com pouco ou nenhum conhecimento adicional sobre os procedimentos envolvidos na sua produção original.
Em alguns casos, o objetivo do processo de engenharia reversa pode ser simplesmente substituir a documentação de sistemas obsoletos. Mesmo quando o produto ,que estamos realizando esse processo, seja de um competidor, o objetivo pode não ser realizar uma cópia mas sim executar uma análise de concorrentes. A engenharia reversa pode também ser usada para criar produtos interoperáveis e, apesar de algumas legislações restritas dos Estados Unidos e União Européia, a legalidade de uso de técnicas específicas de engenharia reversa para esse propósito tem sido fortemente contestada nos tribunais ao redor do mundo por mais de duas décadas.
A engenharia reversa de software pode ajudar a melhorar o entendimento do código fonte, que é fundamental para a manutenção e melhora do software, informações relevantes podem ser extraídas para tomar uma decisão a cerca do desenvolvimento de software e representações gráficas do código podem fornecer visões alternativas a respeito do código fonte, o qual pode auxiliar a detectar e corrigir uma vulnerabilidade de software. Frequentemente, à medida que alguns softwares se desenvolvem, suas informações de projeto e melhorias são perdidas com o tempo, mas essas informações perdidas podem normalmente ser recuperadas através da engenharia reversa. Esse processo pode também ajudar a reduzir o tempo necessário para entender o código fonte, assim reduzindo o custo total do desenvolvimento do software. A engenharia reversa também auxilia a detectar e eliminar código malicioso escrito para o software com melhores detectores de código. Reverter o código fonte pode ser usado para encontrar usos diversos para o código fonte, tais como detectar a cópia não autorizada do código fonte onde ele não deveria ser usado ou revelar como o produto do concorrente foi construído. Esse processo é normalmente utilizado para “crackear” software ou mídia para remover sua proteção contra cópia, ou criar uma cópia possivelmente melhorada ou uma duplicata , que geralmente é o objetivo de um concorrente ou hacker.
Desenvolvedores de Malware (software malicioso) frequentemente utilizam de técnicas de engenharia reversa para encontrar vulnerabilidades em um sistema operacional para construir códigos maliciosos (vírus) que podem explorar as vulnerabilidades do sistema. A engenharia reversa também é usada na criptoanálise (análise de criptografia) para encontrar vulnerabilidades na substituição de cifra, algoritmo de chave-simétrica ou criptografia de chave-pública.
Dentre as diversas razões para a engenharia reversa encontramos::
* Cópia: A Engenharia Reversa tem sido constantemente aplicada para a reprodução de produtos. No entanto, a utilização desta técnica em um objeto patenteado, acaba por infringir a referida patente. Neste sentido, se apenas uma parte do componente é patenteado ou o item não possui patente, a duplicação é um meio lícito. (ver: Pirataria moderna). A técnica de Engenharia Reversa utilizada para a reprodução de produtos acelera o processo de desenvolvimento e promove o bem-estar do consumidor ao prover uma gama de produtos similares com preço competitivo. Ainda, consequente redução do preço final dos produtos desenvolvidos, sendo observada uma melhor prática concorrencial quando são respeitadas as patentes e os direitos de propriedade.
* Economizar dinheiro: Descobrir o que cada componente eletrônico pode prevenir o usuário de comprar outro produto
* Reaproveitamento: Objetos obsoletos são reutilizados de forma diferente, porém de maneira útil.
* Design: Empresas de produção e design aplicam a engenharia reversa ao processo de fabricação de produtos.
* Interface: a reversão usada para fazer um sistema efetuar interface/ligação com outro sistema e informar como as negociações entre os dois sistemas deverão ser estabelecidos; normalmente impulsionada por motivo de compatibilidade ou interoperabilidade.
* Espionagem militar ou comercial: Aprender sobre o produto do concorrente, adquirindo o protótipo para posterior análise. Isso pode resultar em desenvolvimento de produto semelhante, ou melhores contramedidas.
* Melhorar deficiências de documentação: A engenharia reversa pode ser realizada quando a documentação de um sistema para a sua concepção, produção, operação ou manutenção possui deficiências e projetistas originais não estão disponíveis para melhorá-lo. Pode fornecer a documentação mais atual necessária para compreender o estado mais atual de um sistema de software.
* Obsolescência: Circuitos integrados muitas vezes parecem ter sido projetados em sistemas proprietários, obsoletos, o que significa que a única maneira de incorporar a funcionalidade em nova tecnologia é a engenharia reversa do chip existente e, em seguida, reprojetá-lo.
* Modernização de software: É geralmente necessária, a fim de compreender o estado de software existente ou legado, a fim de estimar adequadamente o esforço necessário para migrar conhecimento do sistema; normalmente impulsionada por mudanças de requisitos funcionais, de conformidade, ou de segurança.
* Análise de segurança do produto: Para examinar como um produto funciona, quais são as especificações de seus componentes, estimar os custos e identificar o potencial de violação de patente. Aquisição de dados sensíveis por desmontar e analisar o projeto de um componente do sistema. Outra intenção pode ser a de remover proteção contra cópia, a evasão de restrições de acesso.
* Resolução de falha: Para corrigir (ou às vezes para melhorar) o software que não é mais suportado por seus criadores (por exemplo, Abandonware).
* Criação de duplicatas não licenciadas/aprovadas: Tais duplicatas são chamadas de clones no domínio da computação.
* Fins acadêmicos/aprendizagem: Para fins de aprendizagem podem servir para compreender as questões-chave de um projeto mal sucedido e, posteriormente, melhorar o design. Também usada como desafio em eventos de Capture The Flag (CTF).
* Inteligência técnica do competidor: Entenda o que um concorrente está realmente fazendo, contra o que eles dizem que estão fazendo.
* Descobrir vulnerabilidades de segurança e descobrir se spyware foi incorporado em um aplicativo.

## Sobreposição com a lei de patentes
### Aspecto Legal nos Estados Unidos

Nos Estados Unidos, mesmo se um artefato ou processo é protegido por segredos comerciais, realizar engenharia reversa no artefato ou processo, frequentemente é legal se foi obtido de forma legítima.
Engenharia reversa em software frequentemente cai sob lei contratual, em ambos aspectos, tanto como brecha de contrato assim como quaisquer outras leis relevantes. Isso acontece devido a maioria dos contratos de licença de usuário final proibirem essa prática, e as côrtes dos EUA estão de acordo se tais termos estão presentes, eles sobrepõem a lei de direitos autorais que expressamente permite isso. De acordo com a seção 1039 f) da Lei de Direitos Autorais do Milênio Digital, a pessoa que possuir posse legal de um programa pode desmontar (aplicar engenharia reversa no programa) e contornar sua proteção caso seja necessário para atingir a interoperabilidade, tal termo abrange vastamente outros dispositivos e programas que podem interagir e fazer uso dele, e usar e transferir dados de e para ele de maneiras úteis. Existe uma isenção limitada que permite que o conhecimento assim adquirido seja compartilhado e usado para fins de interoperabilidade.