• Nenhum resultado encontrado

ARTIGO CIÊNTIFICO ENGENHARIA REVERSA

N/A
N/A
Protected

Academic year: 2021

Share "ARTIGO CIÊNTIFICO ENGENHARIA REVERSA"

Copied!
10
0
0

Texto

(1)

ARTIGO CIÊNTIFICO

ENGENHARIA REVERSA

Nicollas Fernandes Ricas Profª: Ieda Maria Brighenti

RESUMO

A engenharia reversa consiste em reverter um programa binário para código-fonte onde se é possível fazer qualquer alteração de uma forma mais fácil depois de feito todo processo de reversão. Hoje, utilizada como uma forma de segurança, estudo e no desenvolvimento de drivers para sistemas operacionais quais os fabricantes de hardware não dão suporte a determinado sistema operacional.

INTRODUÇÃO

A engenharia reversa consiste em reverter programas de sua forma binária, onde é possível alterar ou inserir alguma instrução em linguagem assembly no programa principal, muito utilizada hoje não só por empresas fabricantes de antivírus, como também crackers, hackers e desenvolvedores de programas. A engenharia reversa em muitas vezes que é praticada consiste na quebra de proteção anti-cópias é considerada ilegal devido à violação de copyrights (direitos autorais), pois permite o uso do programa sem a licença.

Fundamentação

Um programa de computador é tão inteligente a ponto de varrer todos os programas do seu computador e fazer uma análise de cada função que eles usam para dizer quais são vírus? Não! Isto ocorre porque, assim como alguns vírus, alguns programas não-maliciosos utilizam funções que também são utilizadas por eles, logo, qualquer programa com uma função dada como perigosa também seria considerado um vírus para os antivírus.

(2)

Assim como as empresas que fabricam antivírus, os crackers, os hackers, as empresas que desenvolvem gameguards e os desenvolvedores, todos eles utilizam da engenharia reversa para o desenvolvimento ou a analise de informações. As empresas que desenvolvem antivírus, por exemplo, usam a er (Engenharia Reversa), para analisar o arquivo dado como vírus, ou um arquivo que pode oferecer risco.

Um vírus passa a ser visto como tal para os antivírus somente após uma análise e cadastro de informações do mesmo na base de dados do antivírus, exatamente por este motivo que os antivírus atualizam sua base de dados freqüentemente, já as empresas que fabricam gameguards também utilizam um processo semelhante, a única diferença é que em vez de analisar os vírus, é feita a analise dos hacks, já os crackers, hackers e desenvolvedores em geral, utilizam a er para reverter programas, ou injetar códigos ou bibliotecas neles para fins de estudo ou alguma alteração, seja ela crackear um programa, alterar o programa e revendê-lo, obter o código de um programa onde o fabricante não oferece mais suporte ao mesmo, corrigir problemas, e desenvolver drivers para variados sistemas operacionais quando um fabricante de hardware não presta suporte a determinado sistema.

Engenharia reversa trata-se de reverter através do assembly, um programa ou biblioteca que está em sua forma binária (pronta para ser executada) para o código-fonte, que permite ver como funciona ou até alterar o programa ou a biblioteca diretamente sem precisar reverter todo o programa.

“A Engenharia Reversa costuma ser encarada como sendo apenas uma atividade de hackers e crackers, o que, no meu modo de entender, é uma baita de uma injustiça. Na verdade, a engenharia reversa é uma área do conhecimento que permite recuperar dados, o que pode ser vital para resgatar informações consideradas perdidas. Além disto, serve para rastrear atividades suspeitas ou até mesmo criminosas - tudo depende de como ela é usada”.

(ELDAD ELIAM, 2005, p 25).

Uma das ferramentas mais conhecidas se chama OllyDbg (http://www.ollydbg.de), através desta e outras ferramentas pode-se trabalhar com engenharia reversa.

“A linguagem Assembly é considerada de baixo nível. Isto não significa que seja menos importante ou eficiente que uma linguagem chamada de alto nível - são apenas modos diferentes de se programar e níveis diferentes de atuação. O que posso dizer é que, com uma linguagem de baixo nível

(3)

como a Assembly, você pilota diretamente a CPU do seu computador - nada de intermediário”.

(ELDAD ELIAM, 2005, p 45).

Abaixo segue um exemplo de um código simples em C a ser analisado pelo OLLYDBG a fim de ser aplicado ER sobre ele.

Exemplo 1

Figura 1 – Código em C do exemplo 1.

O exemplo exibirá na tela “Teste Programa!”, na linha seguinte “Teste Programa 2!”, quando for executado, figura 2.

Segue o resultado do programa rodando:

Figura 2 – Exemplo 1 rodando.

O processo de engenharia reversa trabalha sobre endereços, assim como endereços de memória, os chamados offsets, através destes offsets estaremos localizando as partes de um programa ou biblioteca para que possa ser alterado, remover ou inserir algum código.

No exemplo dado não vamos trabalhar diretamente com offsets, pois quando não possuímos o código-fonte é necessário que se localize o código onde desejamos alterar ou inserir manualmente, neste caso estamos criando um programa básico em C para trabalhar ER sobre ele.

(4)

Existe um arquivo chamado map que é gerado quando compilamos um projeto que para ser gerado é necessário ativá-lo nas propriedades do projeto, este arquivo map possui informações do offset de cada função utilizadas por um programa, conforme o código exemplo, o nome das nossas duas funções é: main e OutraMensagem, a main é o ponto de partida de um programa então tudo que estiver dentro dela será executado quando o programa for iniciado, a função OutraMensagem foi criada para executar uma tarefa e está sendo chamada dentro da função main que é a principal, por isto as duas mensagens aparecem logo quando o programa é iniciado.

O map gerado do projeto diz que o offset da main é 00401020 e da OutraMensagem é 00401070. Vamos analisar estes dois offsets no OllyDbg. Abra o executável ou a biblioteca; pressione Ctrl + G; digite o offset da função main e clique OK, após clicar terá uma tela parecida com a da figura 3.

Figura 3 – Função main exemplo 1, no OLLYDBG.

Compare o offset da função main que foi pega no map com o offset referente à linha que está selecionada, note que são iguais.

Com o processo realizado pelo OllyDbg podemos ir direto a o offset desejado uma vez que já sabemos qual é, e se reparar um pouco abaixo à direita, a única linha que possui mensagem em ASCII é a linha do offset 00401038, que está escrito “Teste de Programa!”. Esta mensagem está na função main na linha: printf ("Teste Programa!\n").

Agora compare a figura 4 e veja o offset selecionado com o offset da função OutraMensagem.

(5)

Figura 4 – Função OutraMensagem no OLLYDBG.

Novamente os offsets são iguais, e a mensagem “Teste Programa 2!” também está presente e corresponde a o offset 00401088 e no programa em c a seguinte linha: printf("Teste Programa 2!\n").

Para uma alteração básica e simples que também se caracteriza como engenharia reversa, vamos apenas alterar as mensagens que serão exibidas na tela. Clique na linha onde está escrito “Teste Programa 2!”, selecionando-a; clique com o botão direito; um menu se abrirá, clique em fallow in dump; immediate constant.

Na janela do OllyDbg um pouco abaixo do bloco de comandos assembly, irá aparecer informações igual a figura 5.

Figura 5 – Texto da função OutraMensagem em dump no OLLYDBG.

Observe o offset 00420030 ou na primeira linha da imagem está escrito “Teste Programa 2!”, na coluna “Hex dump”. Clique sobre o número 54 que é o caractere ASCII ‘T’, e vá selecionando a mensagem inteira. Ficará exatamente igual à figura 6.

(6)

Figura 6 – Texto da função OutraMensagem selecionado para dump no OLLYDBG.

Com a mensagem selecionada pressione barra de espaço. Uma janela irá se abrir como na figura 7, agora na primeira caixa de texto, altere o texto “Teste Programa 2!” para “Teste Programa 55” ou para uma mensagem qualquer, lembrando que a mensagem precisa ter o mesmo tanto de caracteres que a original “Teste Programa 2!”, ou seja, no máximo 16 caracteres, e clique em OK. Após alterado a mensagem, selecione novamente toda a mensagem; clique botão direito na mensagem selecionada; clique em copy to executable file.

Uma nova janela se abrirá com uma linha selecionada, apenas clique sobre ela com botão direito e clique em save file, então digite o nome do arquivo a ser salvo

mantendo sua extensão, nunca salve com o mesmo nome do original, pois o arquivo está em uso; feito isto rode o programa novamente e veja que a mensagem foi alterada pela nova mensagem definida.

Isto na verdade é uma simples alteração onde qualquer mensagem ou texto de um programa, pode ser localizado, para isso clique botão direito em qualquer linha; clique em search for; all referenced string; uma nova janela abrirá nesta tela, clique com o botão direito na primeira linha e coloque search for text, digite a

informação a ser procurada, quando quiser editar algo apenas dê duplo clique e siga o processo de seleção acima até o fim.

(7)

Figura 7 – Janela de alteração de informações ASCII, UNICODE, HEX.

Segue resultado do programa rodando:

Figura 8 – Programa com mensagem alterada rodando.

Exemplo 2:

Figura 9 – Código em C do exemplo 2.

O exemplo da figura 9 pede para o usuário digitar uma chave, se a chave digitada for igual a 89 ele permite que o programa rode, caso contrário ele se fecha, esta é uma simples validação, porém, em programas ou jogos também existem validações, claro que não é tão simples de quebrar como será no exemplo dado, porém o processo é semelhante.

(8)

Esta verificação checa se o programa do usuário foi comprado, ou seja, é original. O processo do crack faz exatamente isto, uma quebra, assim o usuário utiliza o programa como original, ou seja, ele adquiriu os direitos de usar o programa pelo período definido pelo fabricante.

Neste exemplo vamos fazer esta quebra de validação fazendo com que se digitarmos qualquer número a validação seja verdadeira. O offset da função main de acordo com o map é 00401010, abra o programa executável; pressione Ctrl + G; digite o offset, a visualização será igual à figura 10.

Figura 10 – Função main exemplo 2, no OLLYDBG.

Ai está, conforme podemos ver na figura 10 está toda a função main, vejam que na linha do offset 00401046 existe o comando: CMP [LOCAL.chave], 59. Está linha faz uma comparação que seria a comparação da chave que deve ser igual a 89, note que a está com o valor 59, isto devido ao valor estar em Hexadecimal.

O comando CMP faz a comparação e retorna o valor da comparação, a próxima linha tem o comando JNZ que é diferente de, ou seja, se a comparação for diferente do valor proposto que é 89, o JNZ irá mover para o offset 0040105B que seria a parte onde normalmente fecharia o programa, caso a validação não fosse verdadeira, no exemplo apenas exibe uma mensagem.

O que iremos fazer é simplesmente inserir um NOP nesta linha, o NOP nada mais é que um código nulo, o processador vai apenas passar por ele e nada será

(9)

executado.

Então para tirarmos a validação basta inserirmos um NOP no comando JNZ que por sua vez move para o offset 0040105B se o valor digitado for diferente de 89, com o NOP no lugar do JNZ quando digitado um valor diferente de 89 também será dado como valido.Para inserir o NOP basta clicar na linha do JNZ; clicar com botão direito; clique em binary; fill with nop’s, veja como irá ficar na figura 11.

Figura 11 – Função main, após inserir NOP’s no JNZ, no OLLYDBG.

Agora, selecione as 2 linhas com NOP exatamente como está na figura 11, clique botão direito; clique em copy to executable; selection. Uma janela irá se abrir com 2 linhas selecionadas, apenas clique botão direito; clique em save file e digite o nome do arquivo, lembre-se de mudar o nome para não dar conflito.

“A quebra de proteções (quase sempre proteções anti-cópias), conhecida também como "Software Cracking", talvez seja o aspecto mais conhecido da engenharia reversa. Trata-se da modificação (ilegal, pois infringe copyrights) de um software, para remover a proteção anti-cópias, permitindo que o software seja utilizado sem a posse de uma licença”.

(ELDAD ELIAM, 2005, p 215).

Rode o programa, digite qualquer coisa e verá que ele sempre vai dizer que tem permissão para rodar e vai rodar o programa.

(10)

Segue resultado do programa rodando:

Figura 12 – Programa com validação alterada rodando.

Este artigo será postado no meu blog (http://nicollasfr.blogspot.com) junto ao artigo o código fonte dos exemplos, os programas compilados, os programas após as alterações, para que eu possa dar continuidade, sobre engenharia reversa. No artigo “Engenharia Reversa II” mostrará como se faz o método mais interessante da engenharia reversa a injeção e também como juntar variadas formas para que impossibilidade a engenharia reversa de seus programas.

CONCLUSÃO

A engenharia reversa possui várias funcionalidades, todas elas voltadas à alteração, desenvolvimento de hardwares ou software cracking. É também uma das principais formas de criminalidade na computação. Uma vez viola os direitos copyrights.

REFERÊNCIAS

Referências

Documentos relacionados

 Não trocar de agulha antes de injetar o sangue no frasco. b) Volume de sangue para cada amostra. É recomendado de duas a três amostras de cada paciente, com intervalos de

Profª Drª Miranilde Oliveira Neves – Instituto de Educação, Ciência e Tecnologia do Pará Profª Drª Paola Andressa Scortegagna – Universidade Estadual de Ponta Grossa

Orientação: Equipa do Museu da Música Mecânica | Duração: 1h | Público-alvo: Educação Pré-Escolar, Ensino Básico; Ensino Secundário e Público em geral | Calendário: 3ª a

Após a intervenção, que contemplou as dificuldades quanto ao conhecimento numérico, à contagem e ao armazenamento e automatização de fatos básicos aditivos, nenhum

O novo cenário da economia mundial, cada vez mais integrada, exige um novo posicionamento das empresas brasileiras. O alto custo de captação de recursos, o ineficiente

Modeladora  –   Equipamento profissional para indústria alimentícia destinado à. modelar massas pela sua passagem entre

Entre as atividades, parte dos alunos é também conduzida a concertos entoados pela Orquestra Sinfônica de Santo André e OSESP (Orquestra Sinfônica do Estado de São

Câmara dos Santos.. A pesquisa deste casal é divulgada no mundo a partir da publicação do primeiro artigo que tratava da teoria pelo Van Hiele na França, pois até então a teoria