Вы находитесь на странице: 1из 5

Introdução à Engenharia Reversa

O que é engenharia reversa?

Engenharia reversa, como o próprio nome já diz é a engenharia ao


contrário, ou seja, seguindo os passos contrários aos usados para se
construir, a fim de conseguir entender e modificar determinadas
características de um produto (que pode ser uma peça mecânica, um
software, um hardware, etc.)
Em se tratando de softwares, a engenharia reversa também é chamada
de cracking (que quer dizer quebra).
O cracking em softwares comerciais é considerado ilegal, por esse
motivo são criados softwares especiais para teste de segurança, os
chamados Crack-me’s.

Segurança em softwares

Muitos softwares comerciais possuem versões de teste, que


normalmente vem com algumas limitações. Entre as principais
limitações que o cracking visa transpassar estão:

o Numero de série:
Uma das proteções mais comuns de se encontrar, em que o
software se libera após a introdução de uma senha que pode ser
fixa ou variável, este ultima pode ser gerado através de nomes de
usuário, nome do PC, número de série do HD ou mesmo
aleatoriamente.
o Tempo de uso limitado (Trial):
Também é um tipo de proteção bastante comum, normalmente é
dado um período para experimentar o software e após esse
período o mesmo para de funcionar caso não seja registrado.
o Quantidade de execuções limitadas:
O software para de funcionar assim que seja atingido determinado
numero de execuções, e só volta a funcionar depois de registrado.
o Funções desabilitadas:
Algumas funções importantes são desativadas (como botões ou
menus) até que o programa seja registrado.
o Verificação de CD:
Proteção muito utilizada por jogos, em que é pedido para
introduzir o CD do mesmo, a fim de verificar sua autenticidade.
o Mensagem que incomoda (Nag-Screen):
Também é muito fácil de encontrar, são janelas que aparecem
geralmente no inicio ou no final da execução do software ou em
alguma ação do usuário, que informa que o software não está
registrado. Desaparecem após o registro.
 Arquivos-senha (Key-File):
Proteção que pede um arquivo com conteúdo correto para que o
programa seja liberado.
o Proteção anti-cracking:
Proteção que detecta e proíbe o uso de ferramentas de análise ou
de edição sobre o software, afim de não deixar que o mesmo seja
crackeado.
o Executável comprimido ou encriptado:
Proteção que diminui o tamanho do software ou ofusca seu código,
para que o mesmo não consiga ser analisado.

O que é necessário para iniciar a engenharia reversa?

Ter força de vontade e determinação para aprender, além de tempo é


claro.
Ter conhecimento de Software e Hardware.
Ter conhecimento básico em assembly.
Conhecer outras linguagens de programação.

Etapas da Engenharia Reversa

Para a pratica da engenharia reversa é seguida a seguinte sequencia:

o Analise
o Analise estática do software (Parsing):
Procura-se determinar quais são os componentes básicos do
sistema (arquivos, rotinas, variáveis, etc.), sua localização
(achar uma rotina), e sua interação com os demais
componentes (uma variável que depende de outra). As
ferramentas usadas para fazer este tipo de analise são os
Parsers.
o Analise dinâmica do software (Debugging):
É executado o software, e são monitorados valores de
variáveis, funções chamadas, etc. As ferramentas usadas
para este tipo de análise são os Debuggers.
o Informação adicional:
São analisadas todas as fontes de informações externas ao
software, como a documentação (arquivos de ajuda (help),
textos, diagramas, etc.), bancos de dados, entre outras
informações que possam ajudar na analise.
 Tratamento de dados
É decidido qual o melhor caminho a seguir com os dados obtidos
(se será feito alguma modificação na estrutura do sistema, se será
criada alguma ferramenta para ajudar no processo, etc.), e então
é aplicada a técnica escolhida.
o Avaliação dos resultados
É visualizado e avaliado o resultado final, a fim de se achar algum
defeito ou erro (bug).

Sistemas básicos utilizados


Em nossa sociedade é utilizado um sistema numérico Decimal (de base
10), porém quando se trata de computadores, esse sistema não é
conveniente, pois há a necessidade de se interpretar estados de tensão
(Ligado/Desligado); para isso foi criado o sistema Binário (de base 2),
nesse sistema é utilizado somente os algarismos 0 e 1.
Outro sistema que utilizaremos na engenharia reversa é o Hexadecimal
(de base 16), em que são utilizados dez algarismos e seis letras {1, 2,
3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F}. Grande parte das ferramentas de
analise (Editores Hexadecimais, Debuggers, etc.) utilizam o sistema
hexadecimal para exibir os dados.
Alem dos sistemas numéricos é interessante conhecer um pouco do
padrão ASCII, que é um código numérico usado para representar
caracteres, que usa a escala decimal do 0 à 127, e é interpretado por
todos os computadores atuais.

Tabela de conversão Decimal para Hexadecimal para ASCII:

Relações de tamanho

A seguir é apresentado as principais unidades utilizadas para representar


extenções de dados:

o Bit: É como chamamos um digito binário (0 ou 1), é o menor


pedaço de dados existente.
o Nible: É um agrupamento de 4 bits.
o Byte: É um agrupamento de 8 bits. O valor máximo é de 255 (0-
255).
o Word: É um agrupamento de 2 bytes, ou 16 bits.
o Double Word: É um agrupamento de 2 words, ou 32 bits.
 Kilobyte: São 1024 bits (32*32 bits).
o Megabyte: São 1048576 bits, ou seja, (1024*1024 bits).

Um pouco de Assembly (asm)

Na engenharia reversa é imprescindível que se saiba pelo menos o


básico de Assembly, pois quando um software é revertido (através de
Parsers ou Debuggers), sua estrutura é exibida através desta linguagem.

Registradores da CPU

Os registradores são variáveis, para onde os dados são temporariamente


movidos.
Registradores e seus respectivos nomes:

o AX: Acumulador
o BX: Registro Base
o CX: Registro Contador
o DX: Registro de dados
o CS: Registro do segmento de código
o DS: Registro do segmento de dados
o ES: Registro do segmento extra
o SS: Registro do segmento de pilha
o SI: Registro índice fonte
o DI: Registro índice destino
 BP: Registro do apontador da base
o SP: Registro do apontador de pilha

Flags da CPU

As flags são variáveis de 1 bit (pode ser 0 ou 1) que funcionam como


sinalizadores, ou seja, dependendo do valor que armazenam, fazem com
que determinado salto seja executado ou ignorado.
Algumas Flags e os valores que podem adotar:

o Zero Flag: ZR/NZ (zero/not zero) - (zero/não zero)


o Sign Flag: NG/PL (negative/positive) - (negativo/positivo)
o Carry Flag: CY/NC (carry/no carry) - (transmite/não transmite)
o Direction Flag: DN/UP (decrement/increment) -
(decremento/incremento)
o Pilha (Stack)
o A pilha é uma estrutura onde os dados são armazenados para uso
posterior; ela é como uma pilha de livros, em que o ultimo livro
colocado será o primeiro que irá sair.
o Instruções

Instruções aritméticas:
ADD Adição
SUB Subtração
MUL Multiplicação
DIV Divisão
ADC Adição com carry
SBB Subtração com carry
IMUL Multiplicação com sinal
IDIV Divisão com sinal
Instruções lógicas:
AND Função lógica AND (“E”)
OR Função lógica OR (“OU”)
XOR Função lógica XOR (“OU EXCLUSIVO”)
NOT Função lógica NOT (“Não”)
TEST Comparação lógica
Instruções de comparação:
CMP, CMPS, CMPSB, CMPSW Utilizadas para comparar valores dos registradores
Instruções para Loops (voltas):
LOOP. LOOPE. LOOPZ. Determinam o numero de vezes que um bloco de
LOOPNE. LOOPNZ instruções deve ser executado
Instruções de contagem:
INC Incrementa o conteúdo de um registrador (contador)
DEC Decrementa o conteúdo de um registrador (contador)

Instruções

Instruções de transferência:
MOV, MOVS,
MOVSB, Move valores para registradores
MOVSW
Instruções da pilha:
POP, POPF Move um Word da pilha para um destino (registrador)
PUSH, PUSHF Move dados para o topo da pilha (stack)
Saltos incondicionais: Transferem o fluxo de execução incondicionalmente
CALL Transfere o fluxo para uma sub-rotina
RET Retorna de uma sub-rotina, restabelecendo o fluxo anterior
Desvia o fluxo para um destino especificado, sem que precise de
JMP
condições para isso
Saltos condicionais: Transferem o fluxo de execução mediante alguma condição
JE, JZ Salta se é igual a zero
JNE, JNZ Salta se não é igual a zero
JS Salta se sinal é negativo
JNS Salta se sinal não é negativo
JP, JPE Salta se paridade é par
JNP, JPO Salta se paridade é impar
JO Salta se paridade é impar
JNO Salta se não houve estouro (overflow)
JB, JNAE Salta se abaixo (não acima ou igual)
JNB, JAE Salta se não abaixo (acima ou igual)
JBE, JNA Salta se abaixo ou igual (não acima)
JNBE, JA Salta se não abaixo ou igual (acima)
JL, JNGE Salta se menor (não maior ou igual)
JNL, JGE Salta se não menor (maior ou igual)
JEL, JNG Salta se menor ou igual (não maior)
JNLE, JG Salta se não menor ou igual (maior)

Referencia http://dinamico.orgfree.com/textos.html

Вам также может понравиться