quinta-feira, 18 de abril de 2013

Engenharia Reversa




Sistemas de Informação 5º semestre


Engenharia Reversa

Introdução
Não há um registro inicial de utilização da engenharia reversa, sabe-se que quando ela surgiu suas primeiras aplicações foram em equipamentos militares, para que se alcançasse a superioridade militar. A espionagem industrial também encontrou na Engenharia Reversa um poderoso aliado para a “criação” de equipamentos concorrentes.
No ano de 1945 três bombardeiros americanos, modelo B-29, foram forçados a pousar em território Russo, os soviéticos por sua vez os desmontaram e estudaram. Utilizando a Engenharia Reversa para copiá-los nos mínimos detalhes, o resultado foi o bombardeiro TUPOLEV Tu-4 que voou pela primeira vez em 19 de maio de 1947.
Após a 2ª guerra mundial muito da tecnologia japonesa foi desenvolvida através da desmontagem de produtos ocidentais para posterior análise e a sua reinvenção. Dessa forma, investiu-se menos tempo e recursos com pesquisa e desenvolvimento, cabendo à equipe de Engenharia reduzir estágios no desenvolvimento de um produto focando apenas em sua análise e melhoria, hoje sabemos que essas técnicas não são aceitas, as leis de patentes agora são mais rígidas, mas o Japão naquele período se beneficiou muito dessa fragilidade. Os principais produtos que o Japão reinventou foram os eletroeletrônicos e os automóveis.

O que é Engenharia Reversa?

A engenharia reversa visa apropriar-se de novos conceitos estratégicos a partir de desconstrução de modelos ou soluções prontas. Essa prática pode ser considerada como o processo de análise de um produto físico ou virtual, como aparelhos, programas de computador, ou mesmo modelos de negócio, compreendendo os detalhes do funcionamento. A engenharia reversa pode nos ajudar a desenvolver o objeto de estudo, ou mesmo produzir algo completamente novo, a partir dos dados coletados, sem qualquer semelhança com o original. A engenharia reversa não pode ser considerada uma espécie de cópia, pois se trata apenas do estudo daquilo que foi criado; a cópia é somente uma das consequências possíveis do estudo de um produto ou ideia.
Desde a sua primeira utilização, a engenharia reversa cresceu muito, e hoje possibilita desde o entendimento e melhoria daquilo que se estuda, até a descoberta de segredos industriais e comerciais.

Exemplos de utilização da Engenharia Reversa

Um fabricante se quiser saber como o processador do concorrente funciona, pode comprá-lo, fazer a engenharia reversa, e criar um processador similar. Como aconteceu com a fabricante de processadores AMD, conseguiu fazer uma cópia exata do processador Intel 8080 no ano de 1975. A empresa provavelmente comprou alguns processadores da Intel, abriu-os e os estudou detalhadamente, conseguindo criar uma cópia perfeita através de tentativas e erros.
A pirataria de CDs e DVDs utiliza a engenharia reversa para descobrir como funciona a proteção anticópia dos discos e removê-la.
Pode ser usada também para fins acadêmicos, tanto no campo da pesquisa, quanto na área de conhecimento. Tecnologias antigas têm uma grande carência de documentação descritiva. A engenharia reversa permite que a documentação seja elaborada e a tecnologia velha seja especificada.
Vários empreendedores de grande parte das empresas abandonam a realização do planejamento inicial e a documentação para o desenvolvimento de um projeto, por considerarem uma tarefa irrelevante e medíocre para investir em recursos financeiros e tempo, preocupando-se mais com a execução da implementação. Com o decorrer do tempo serão fundamentais novas adaptações por apresentarem falhas durante a operação do projeto, sendo necessárias novas revisões, reparos e retrabalhos. Essa é a ideia da utilização da engenharia reversa fazer com que não haja prejuízos, permitindo obter não melhores resultados, mas resultados, ponto.

Por que a Engenharia Reversa na Informática?

A Engenharia Reversa, na área tecnológica, trabalha para resolver situações tais como:
  • Implantação antiga de sistemas, com linguagens de programação ultrapassadas.
  • Documentação escassa, falta de atualização das informações.
  • Sistemas que são criados por funcionários que não trabalham mais na empresa.
  • Existem métodos complexos, ou não existem métodos.

 O sistema é implementado por vários programadores, com métodos e formas diferentes de programação.
Existe a necessidade de evolução do sistema:
  • Ser adaptado a novas tecnologias.
  • Atender a novas regras.
  • Atualizar novas funcionalidades que outras empresas usam.
  • Para corrigir erros.

A engenharia reversa pode atuar em casos de sistemas como o exemplo acima, ou de dados.
Por exemplo, se for necessário criar um software que tenha uma ligação com um sistema, é preciso que seja entendido como esse sistema retornaria os resultados para poder desenvolver o novo software. O outro caso, transportar um banco de dados relacional para um banco de dados orientado a objeto.
 No caso do software, existe uma restrição de interface, onde as novas implementações devem seguir o padrão do sistema antigo.
Salvo lembrar que estas situações são bem frequentes.


Exemplos de Engenharia Reversa na Informática

IBM-PC compatível: A IBM abriu mão da patente de sua plataforma, deixando o caminho livre para qualquer pessoa produzir uma maquina que fosse compatível com o IBM-PC. Assim surgiram vários clones do IBM-PC
Samba: Software que permite sistemas que não estão rodando o Microsoft Windows® a compartilhar arquivos com sistemas que estão. A engenharia reversa foi utilizada para descobrir como o compartilhamento de arquivos do Windows funcionava, para que então computadores que não estivessem com a plataforma Windows pudessem emular a mesma.

Wine: Programa que funciona como a API do Windows. Permite executar aplicativos desenvolvidos para Windows 3.1X, 9X, NT, 200x no GNU/Linux.
OpenOffice.org: É um conjunto de aplicativos em OpenSource (código aberto). Está disponível para diferentes plataformas: incluindo Microsoft Windows, Unix, Solaris, Linux e Mac OS X. A Suite é compatível com o Microsoft Office.

Reengenharia

Pensando na engenharia reversa, temos que ela consiste em apenas analisar o sistema ou a ferramenta para que possa ser criada uma representação da mesma. No caso da Reengenharia temos que o sistema é analisado, cria-se uma representação, obtendo a representação cria-se uma nova estrutura que funcione exatamente como o sistema analisado, porém  com qualidades que não a torne uma cópia. 




Definição de Engenharia Reversa de software.

Por definição temos que: “A engenharia reversa consiste em analisar um determinado sistema para criar representações, do próprio em um nível mais alto de abstração.”
Também pode ser encontrada como: “Voltar atrás no ciclo de desenvolvimento do software”.
Na parte prática, encontramos duas formas de engenharia reversa de software:
Com código-fonte: Tendo o código disponível, porém com a documentação em falta, e aspectos não muito atuais.
Sem código-fonte: Sendo que, necessita de grandes esforços para se descobrir uma possível fonte do código para o software, que são considerados como engenharia.


Técnica de Engenharia Reversa com Código Fonte.

  • Extração das informações:O primeiro trabalho que se deve fazer é coletar informações sobre o sistema a ser estudado.As atividades da engenharia reversa se fazem sobre essas informações extraídas, mais do que sobre o próprio sistema.As informações podem ser extraídas de várias fontes: o código fonte, a execução, os dados (por exemplo, em banco de dados), a “documentação”, ou outras fontes.

  • Código:A primeira fonte, o código, é a mais usada. A análise do código é chamada também de análise estática (por oposição à análise dinâmica que é a execução do sistema).Quais são os componentes básicos do sistema: arquivos, rotinas, tipos, variáveis, classes, relações de definição conectam um componente com seu conteúdo.Ferramentas para fazer essa análise são chamadas de “parser”. O “parsing” é a primeira etapa da compilação do código fonte. Para fazer isso, é preciso conhecer a sintaxe da linguagem de programação usada, podendo ser usado parsers específicos dependendo das necessidades. Por exemplo, num programa Pascal onde podemos extrair o nome de todas as funções definidas.

  • Trace de execução (Análise dinâmica):A análise estática pode extrair muitas informações de um programa, mas nem todas. Por exemplo, qual parte de uma instrução IF é realmente usada pode depender dos dados com que o programa foi chamado. Para descobrir esse tipo de informação, precisamos da análise dinâmica, que consiste em executar o programa e monitorar os valores das variáveis, quais funções são chamadas.

  • Dados:Os bancos de dados podem ser usados como fonte de informação para ajudar na engenharia reversa de um sistema. Mas a engenharia reversa de dados é também um trabalho específico que pode ser feito independentemente de qualquer sistema que possa manipular esses dados.

  • Documentação:Chamamos de documentação tudo o que não está sendo usado pelo computador para fazer funcionar o sistema, mas que são usados pelos engenheiros de códigos, relatórios, diagramas da análise ou do projeto, como ela se destina aos seres humanos ela é difícil de analisar automaticamente. A abordagem mais usada é usar as palavras da documentação, partindo do preceito de que os conceitos mais importantes aparecem com mais frequência nas documentações.

  • Anomalias no Código:Num software legado, o código pode conter várias anomalias, como partes do programa que nunca podem ser executadas (código morto) e trechos de código que foram copiados e levemente modificados. Essas anomalias complicam o código inutilmente, fazendo ele mais longo do que deveria ser e multiplicando as coisas que um programador tem que estudar e entender. Para resolver esse problema podemos deletar o código morto, e no caso dos clones podemos modificar o código para suprimi-los ou então comentar o código dizendo que existem clones.

  • Encapsulamento:O encapsulamento é mais uma técnica de reengenharia do que de engenharia reversa. Em vez de reestruturar um sistema, ela propõe esconder o velho código dentro de uma nova camada.“Slicing” (fatiar)É uma técnica de decomposição do código de acordo com a utilização das variáveis. O slicing de uma parte do código que consiste em extrair dela todas as instruções que têm uma influência sobre o valor de uma variável a um ponto definido do código. Isso pode ajudar na localização de um bug (erro no valor da variável), limitando a pesquisa nas únicas instruções realmente necessárias.Existem também os “clichês”, que são um padrão que descreve uma maneira geral de implementar um conceito de programação. A atividade de reconhecimento de clichês trabalha com um banco de clichês e procura esses clichês no código. A ideia é que um clichê é implementado com várias linhas de código. Reconhecer um clichê pode simplificar o código porque isso vai substituir um só conceito a essas linhas.


Técnica de Engenharia Reversa sem Código Fonte

A engenharia reversa pode ser realizada de vários modos, se tivermos em mãos o código fonte de um programa é um método, se não outro.  Aqui abordaremos algumas técnicas de engenharia reversa sem o código fonte, pois não é sempre que um programa é open source (código fonte aberto), por esse motivo algumas ferramentas são utilizadas para que possamos adquirir o código fonte de um determinado programa.
Entre esses métodos de engenharia reversa, os três métodos mais utilizados são:

  • Análise de fluxo de dados: Nesse método é utilizada a observação da troca de informações barramentos (analisadores de bus) e de análise de pacotes rede (pacotes de sniffers). Com a observação do comportamento dos dados nos barramentos do computador ou na rede, pode ser feita uma análise específica de tudo para conseguirmos realizar uma nova implementação do software, que irá realizar o mesmo procedimento do outro. Esse método é mais utilizado na engenharia reversa de drivers e dispositivos, isso não significa que não possa ser utilizada na de software.
  • Dessassemblar: Com a utilização de um desassembler, é possível obter a linguagem de máquina de um certo software. Com a obtenção da linguagem de máquina é necessário um programa que faça a leitura dessa linguagem, para que possamos realizar a criação de um novo software. Esse método pode ser usado em qualquer programa de computador sendo essa sua vantagem, porém, sua desvantagem é a demora para decodificar a linguagem de máquina.
  • Decompilação: Para a utilização desse método é necessário um decompilador, esse decompilador tem como tarefa, tentar recriar o código fonte de um programa em uma linguagem de alto nível, tendo como base do programa original apenas a o código de máquina.


Aspectos legais sobre engenharia reversa

A engenharia reversa pode gerar problemas de legalidade, como uma empresa querendo criar uma cópia, ou seja, plagiar um produto da concorrente, gerando problemas judiciais. No entanto a questão legal depende das leis de cada país.  E mesmo assim, existem países que não possuem leis específicas sobre o assunto.

Leis aprovadas nos países

  • Estados Unidos: Em 1998, uma das leis mais conhecidas é o "Digital Millenium Copyright Act", possui várias maneiras de proteger direitos autorais na informática como também faz restrições em relação à engenharia reversa, visando analisar compatibilidade com outros softwares / hardwares.
  • União Européia: Em 2001, similar à lei dos Estados Unidos, o “EU Copyright Directive" não possui muitas restrições. Caso o objetivo final da engenharia reversa seja a cópia de algum programa ou quebra de patente com objetivos lucrativos a lei entra em vigor, se possuir fins acadêmicos ou de compatibilidade, a principio não são restritivas.
  • Suíça: Em 1986, "A Lei Suíça de Concorrência Desleal" tem característica bastante curiosa e polêmica a respeito do assunto, exige-se dos competidores a realização de investimentos em engenharia reversa mesmo quando a tecnologia não seja secreta. Não possuindo prazo e limites, os tribunais suíços têm rejeitado ou limitado severamente à aplicação.
  • Japão: Em 1993, "A Lei Japonesa de Concorrência Desleal", proibi a imitação servil, mesmo no caso de produtos não patenteados, nem protegidos por direitos autorais. A lei impõe limites claros à aplicação da norma de apropriação ilícita: o "lead time" vigora apenas por três anos, as ideias e os conceitos básicos não são protegidos, ressalva-se o caso de modificações ou aperfeiçoamento técnico efetuado pelo competidor com base no item copiado, a necessidade de padronização e compatibilização de produtos e o uso de elementos de caráter estritamente funcional. A proibição de imitação não impede o progresso técnico, ressalva o domínio das patentes para proteger ideias e conceitos, e o interesse social na padronização e compatibilização industrial.
  • Brasil: Não existe uma lei específica sobre o assunto.

Ocorrendo a engenharia reversa, costuma-se proceder de duas maneiras:
  •  Caso a engenharia reversa não tenha como objetivo a pirataria ou infração de algum direito autoral, não é considerado crime.
  •  Caso contrário, a "Lei de Software" e também de "Lei de Direitos Autorais" protege seus criadores.

Apesar de existirem algumas leis e acordos sobre a legalização, autenticação, contra a pirataria de software/hardwares desenvolvidos, irrelevante do país, os problemas legais relacionados à engenharia reversa são bastante comuns e difíceis de serem resolvidos.












Bibliografias:
http://www.inf.ufpr.br/silvia/ES/reengenharia/reengenharia.pdf
http://www.tecmundo.com.br/pirataria/2808-o-que-e-engenharia-reversa.htm#ixzz2Ow71XNTC
http://mundoestranho.abril.com.br/materia/o-que-e-engenharia-reversa
http://www.adelcio.com.br/arquivos/2012_01_Eng_SoftwareII/6%20-%20Engenharia%20Reversa.pdf