Skip to main content

Um pouco de Assembly

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:
AX: Acumulador
BX: Registro Base
CX: Registro Contador
DX: Registro de dados
CS: Registro do segmento de código
DS: Registro do segmento de dados
ES: Registro do segmento extra
SS: Registro do segmento de pilha
SI: Registro índice fonte
DI: Registro índice destino
BP: Registro do apontador da base
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:

Zero Flag: ZR/NZ (zero/not zero) – (zero/não zero)
Sign Flag: NG/PL (negative/positive) – (negativo/positivo)
Carry Flag: CY/NC (carry/no carry) – (transmite/não transmite)
Direction Flag: DN/UP (decrement/increment) – (decremento/incremento)

Pilha (Stack)

A pilha é uma estrutura onde os dados são armazenados para uso posterior; ela é como uma pilha de cartas, em que a ultima carta colocado será o primeiro que irá sair.

Instruções Assembly

As instruções da linguagem Assembly são conhecidas pelo nome de mnemônicos (lê-se menemônicos).

As instruções de uma linguagem formam o conjunto de palavras reservadas da linguagem. No caso da linguagem Assembly, o conjunto de palavras reservadas recebe o nome de mnemônicos (“menemônicos”). Uma palavra reservada não pode ser usada para qualquer tipo de operação que não seja aquela para a qual foi projetada.

Veja abaixo algumas intruções.

Menemônicos

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
LOOP, LOOPE, LOOPZ,
LOOPNE, LOOPNZ
Determinam o numero de vezes que um bloco de
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 de transferência
MOV, MOVS,
MOVSB,
MOVSW
Move valores para registradores

 

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
JMP Desvia o fluxo para um destino especificado, sem que precise de
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)

 

Sombrakey

Entusiasta em engenharia reversa de software, sempre querendo aprender mais.