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

Introduccin

El ensamblador es el lenguaje de programacin que ustedes pueden ver al


desensamblar un archivo en Olly. En este curso aprenderemos las bases de este
lenguaje. Es posible que les parezca algo tedioso y largo como lo es igualmente para
m a la hora que lo escribo, pero sin duda les ayudar mucho a comprender
nuestros tutoriales as mismo que es fundamental tener conocimientos bsicos
sobre este lenguaje sobre todo para todo aquel que tiene pretensiones serias de
llegar a ser un buen cracker.
Tabla de contenidos:
1 El procesador y los registros
1.1 Los registros generales y de trabajo
1.2 Los registros de Offset y punteros
1.3 Los registros de segmentos
1.4 El registro Flag
2 La Pila y sus instrucciones
2.1 Funcionamiento de la Pila
2.2 La instruccin PUSH
2.3 La instruccin POP
3 Los saltos condicionales y el CMP
3.1 Los saltos condicionales
3.2 La instruccin CMP
4 Las operaciones matemticas
4.1 Adicin y Sustraccin : ADD y SUB
4.2 Multiplicacin : MUL/IMUL
4.3 Divisin : DIV/IVID
4.4 Otros : SHR y SHL
4.5 Lo opuesto de un nmero : NEG
5 Los puntos decimales y los negativos
5.1 Los puntos decimales
5.2 Negativos
6 Las instrucciones lgicas
6.1 Y lgico : AND
6.2 O lgico inclusivo : OR
6.3 O lgico exclusivo: XOR
6.4 No lgico : NOT
6.5 TEST
7 La Memoria y sus instrucciones
7.1 LEA
7.2 MOVSx
7.3 STOSx

1- El procesador y los registros


Los datos que el procesador necesita son guardados en lo que llamamos registros.
Existen varios tipos de registros y cada uno tiene su propia utilidad.
registros generales o de trabajo
Sirven para manipular datos, transferir parmetros cuando se llama a funciones
DOS y para guardar resultados intermediaros.
registros de Offset o punteros
Contienen un valor que representa un Offset que se combinara con una
direccin de segmento.
registros de segmento
Son utilizados para guardar la direccin del inicio de un segmento. Puede
tratarse de la direccin el inicio de las instrucciones de un programa, del inicio de
datos o del inicio de la pila.
registros de Flag
Contienen bytes de los cuales cada uno tiene un rol indicador.
3
1.1 Los registros generales o de trabajo
Los 4 registros generales ms utilizados son (en 16 bits): AX, BX, CX y DX
AX: acumulador: sirve para efectuar clculos aritmticos o para enviar un
parmetro a una interrupcin.
BX: registro auxiliar de base : sirve para efectuar clculos aritmticos o bien para
realizar clculos sobre las direcciones
CX: registro auxiliar (contador): sirve como contador en los ciclos (loops)
DX: registro auxiliar de datos: sirve para almacenar los datos destinados a
funciones.
Los correspondientes a 8 bits son: AL, BL, CL, DL
Esta es su utilizacin terica, pero en la prctica pueden ser utilizados como bien se
le plazca al programador.
Estos registros son de 16 bits. Para obtener los de 8 y 32 debe seguirse la tabla
indicativa para AX:
EAX (32 bits)
AX (16 bits)
AH (8 bits) AL (8 bits)
E : Extended
H : High
L: Low
1.2 Los registros de offset o punteros
IP : puntero de instruccin: asociado al registro de segmento CS (CS:IP) para
indicar la prxima instruccin que se va a ejecutar. Este registro no puede
modificarse nunca directamente; ser modificado indirectamente por las
instrucciones de salto, por los subprogramas y por las instrucciones.
SI : ndex de fuente : principalmente utilizado en las operaciones en cadenas de
caracteres; es asociado al registro de segmento DS.
DI: ndex de destinacin: utilizado principalmente en las operaciones sobre
cadenas de caracteres, asociado normalmente al registro de segmento DS. En el
2

caso de manipulacin de cadenas de caracteres, ser asociado a ES.


SP: puntero de pila: asociado al registro de segmento SS (SS:SP) para indicar el
ltimo elemento de la pila.
BP: puntero de base : asociado al registro de segmento SS (SS:BP) para acceder
a los datos de la pila durante las llamadas de subprogramas (CALL)
4
Como los registros generales, stos pueden ser extendidos a 32 bits agregndoles
la E (EIP, ESI, EDI, ESP, EBP). En cambio no tienen parte en 8 bits.
Los registros SI y DI son frecuentemente utilizados para las instrucciones de cadena
y para acceder a los bloques de memoria.
1.3 Los registros de segmento
El procesador utiliza direcciones para almacenar o recuperar datos. La direccin
esta compuesta de 2 partes de 32 bits (o 16 bits segn el modo utilizado). La primera
es el segmento y la 2da. es el Offset. La direccin es presentada como sigue:
segmento: Offset (por ejemplo: 0A000h:0000h).
He aqu los diferentes segmentos:
CS: registro segmento de cdigo: indica la direccin del inicio de las
instrucciones de un programa o de una subrutina.
DS: registro segmento de datos: contiene la direccin del inicio de los datos de
tus programas. Si tu programa utiliza varios segmentos de datos, este valor
tendr que modificarse durante su ejecucin.
SS: registro segmento de pila: apunta sobre una zona llamada pila.
ES: registro segmento suplementario (extra segmento): utilizado, por defecto,
por ciertas instrucciones de copia de bloque.
FS: registro segmento suplementario : parecido a ES
GS: registro segmento suplementario: parecido a ES
1.4 Los registros Flag
Este registro es un ensamble de 16 bits. Pero este ensamble no significa nada, ya
que los bits son modificados uno por uno y la modificacin de un solo bit puede
modificar el comportamiento del programa. Los bits de este conjunto son llamados
indicadores.
Bit 1 : CF
Bit 2 : 1
Bit 3 : PF
Bit 4 : 0
Bit 5 : AF
Bit 6 : 0
Bit 7 : ZF
Bit 8 : SF
Bit 9 : TF
Bit 10 : IF
Bit 11 : DF
Bit 12 : OF
Bit 13 : IOPL
Bit 14 : NT
Bit 15 : 0
Bit 16 : RF
3

Bit 17 : VM
Los bits 1,5,12,13,14,15 de este registro Flag de 16 bits no son utilizados.
Las instrucciones aritmticas, lgicas y de comparacin modifican el valor de los
indicadores. Las instrucciones condicionales testean el valor de los indicadores y
actan en funcin del resultado.
Los principales indicadores y su uso:
CF: Carry Flag Indicador de retencin
Luego de una operacin, si el resultado es codificado en un nmero superior de bits,
el bit de ms ser puesto en CF. Varias instrucciones pueden modificar su estado:
CLC para ponerlo a 0, STC a 1 y CMC invierte su valor.
PF: Parity Flag Indicador de paridad
Igual a 1 si el nmero de bits de un operando (parmetro de una instruccin) es par.
AF: Auxiliary carry Flag: Indicador de retencin auxiliar
Parecido a CF
ZF: Zero Flag Indicador Cero
Si el valor de una operacin es nulo (igual a 0) ZF pasar a 1. Este indicador es
frecuentemente utilizado para saber si 2 valores son iguales (sustrayndolos)
SF: Sing Flag Indicador de signo
SF pasa a 1 cuando el resultado es con signo (negativo o positivo)
IF: Interruption Flag Indicador de interrupcin
Permite quitarle la posibilidad al procesador de controlar las interrupciones. Si IF = 1
las interrupciones son tomadas en cuenta y si IF = 0 son ignoradas. La instruccin
STI pone IF a 1 y CLI la pone a 0.
DF: Direction Flag- Indicador de direccin
Indica la manera de desplazar los punteros (referencias) durante las instrucciones
de cadenas (sea positivamente, sea negativamente). STD lo pone a 1 y CLD a 0.
OF: Overflow Flag Indicador de desbordamiento.
Permite encontrar y corregir ciertos errores producidos por instrucciones
matemticas. Muy til para evitar plantones. Si OF=1 entonces se produce un
Overflow
Los otros indicadores no son ms importantes por lo que no los abordaremos.
Pequeo ejemplo de estos indicadores con una operacin en binario:
0110
+0101
- 1011
ZF=0 (resultado 1011 no es nulo)
SF=1 (el signo del resultado es negativo)
CF=0 (no hay retencin)

2- La Pila y sus instrucciones


2.1 Funcionamiento de la Pila
La Pila (stack en ingls) es un sitio que sirve para almacenar pequeos datos. Esta
memoria temporal funciona como una pila de platos: el ltimo plato que pondrs
ser el primero en ser tomado y el primer plato puesto (el ltimo de abajo) ser el
ltimo en ser tomado. Espero que la metfora est clara. Tomemos un ejemplo
real: si pongo el valor A en la pila y luego pongo B y despus C. Para recuperar estos
valores el procesador tomar C primero, luego B y por ltimo A.
4

Para la API GetDlgItemText, Windows necesita de estas informaciones:


HWND hDlg, // (1) handle de la ventana de dilogo
int nIDDlgItem, // (2) identificador de la ventana de dilogo
LPTSTR lpString, // (3) apunta hacia el buffer para el texto
int nMaxCount // (4) tamao mximo de la cadena
Podemos entonces poner, antes de llamar a esta funcin:
MOV EDI, [ESP+00000220] pone el handle de la ventana de dilogo en EDI
PUSH 00000100 push (4) tamao mximo de la cadena
PUSH 00406130 push (3) direccin del buffer para el texto
PUSH 00000405 push (2) identificador del control
PUSH EDI push (1) hanlde de la ventana de dilogo
CALL GetDlgItemText llama la funcin

2.2 La instruccin PUSH


Arriba mismo la hemos visto. Push significa empujar en espaol. Con esta
instruccin podemos poner un valor en la pila. El valor empujado debe ser de 16 o
32 bits (a menudo un registro) o un valor inmediato.
Ejemplo:
PUSH AX
PUSH BX
PUSH 560
AX es puesto de primero en lo alto de la pila pero 560 ser el que saldr primero.
2.3 La instruccin POP
Es lo opuesto de PUSH con lo que queda claro que sirve para recuperar los valores
puestos en la pila.
Ejemplo (continuacin del anterior):
POP CX
POP BX
POP AX
Estas instrucciones pondrn la primera instruccin de arriba de la pila en CX, es decir
560 y luego BX volver a BX y AX a AX.
La pila es muy utilizada para encontrar los valores intactos de los registros y como
que el nmero de registros es ilimitado, se utiliza la pila cuando ya no queda
espacio. Sin embargo la pila es ms lenta que los registros.

3- Los saltos condicionales y el CMP


2.1 Los saltos condicionales
Entre los diferentes saltos tenemos los incondicionales (que saltan sin condicin)
como el JMP (Jump) y los condicionales que saltan nicamente si la condicin es
verificada. En este ltimo grupo hay muchos individuos ;)
Los valores de los indicadores son necesarios para la verificacin de la condicin.
He aqu los principales saltos condicionales:
Indicador
(Flag)
Valor Salto Significado
CF
5

1
JB Below- Inferior
JBE Below or Equal Inferior o Igual
JC Carry Retencin
JNAE Not Above or Equal No superior o igual
0
JA Above- Superior
JAE Above or Equal- Superior o igual
JNB Not Below No inferior
JNC Not Carry- No retencin
ZF
1
JE Equal- Igual
JNA Not Above- No superior
JZ Zero- Cero (salta en caso de igualdad)
0
JNBE Not Below or Equal- No superior o Igual
JNE Not Equal- No igual
JNZ Not Zero- No Cero (salta si diferente)
PF
1 JP Parity Par
JPE Parity Even- Par
0 JNP Not Parity- Impar
JPO Parity Odd- Impar
OF 1 JO Overflow- Desbordamiento
0 JNO Not Overflow- No desbordamiento
SF 1 JS Signed- Con signo
0 JNS Not Signed- Sin signo
Otros:
JG JNLE
Greater (superior aritmticamente) Not Less or Equal (aritmticamente no inferior
o igual)
ZF=0 y SF=OF
JGE JNL
Greater or Equal (aritmticamente superior o igual) Not Less (No inferior
aritmticamente)
SF=OF
JL JNGE
Less (aritmticamente inferior) Not Greater or Equal (artimticamente no superior
o igual)
SF (con signo) = OF
JLE JNG
Less or Equal (aritmticamente inferior o igual) Not Greater (no superior
aritmticamente)
ZF=1 o SF (con signo)=OF
3.2 La instruccin CMP
Esta instruccin permite efectuar tests entre valores y modificar los flags segn el
6

resultado. El funcionamiento del CMP es parecido al SUB (que veremos ms


adelante y que sirve para la sustraccin).
Se utiliza de esta manera: CMP AX, BX.
Este comando permite verificar si estos valores son iguales ya que har la operacin
AX-BX, si el resultado es igual a 0 entonces ZF=1 si no ZF=0.
A menudo es seguido de estos saltos y su inverso (que agrega una N despus de
la J, por ejemplo JNE para JE):
JA: ms grande que (nmeros sin signo)
JB: ms pequeo que (nmero sin signo)
JG: ms grande que (nmeros con signo)
JL: ms pequeo que (nmeros con signo)
JE o JZ: igual a (con y sin signo)

4- Las operaciones matemticas


4.1 Adicin y Sustraccin: ADD y SUB
Estas dos instrucciones necesitan 2 operandos: la fuente y la destinacin. Lo que
dar: Destinacin=Fuente+Destinacin. En ensamblador: ADD Destinacin, Fuente.
Ejemplo con AX=4 y BX=6
ADD AX, BX
(Donde AX es la destinacin
y BX la fuente)
Despus de esta operacin: AX= 4+6 = 10 y BX = 6
El funcionamiento de SUB es idntico.
Es imposible adicionar o sustraer un 16bits con un 8bits por ejemplo. ADD BX, AL
ser imposible!
4.2 Multiplicacin: MUL / IMUL
MUL es utilizada para los nmeros sin signo e IMUL para los con signo (recuerda
que: los nmeros con signo pueden ser negativos lo que no es el caso de los
nmeros sin signo. Por ejemplo en 16 bits y sin signo, los nmeros van de 0 a 65535
y en los con signo van de -32768 a 32767). En contraste con las operaciones
precedentes, la operacin necesita nicamente un operando: la fuente. La10
destinacin o sea el nombre que deber multiplicarse se encontrar siempre
obligatoriamente en AX. La fuente es un registro.
Ejemplo con AX=4 y BX=6
MUL BX
Resultados: AX=4*6 = 24 y BX = 6
IMUL funciona del mismo modo, salvo que hay que utilizar la instruccin CWD
(convert Word to doubleword), que permite extender el signo de AX en DX. Si se
salta esto, los resultados pueden ser errneos.
4.3 Divisin: DIV / IDIV
Al igual que MUL e IMUL, DIV sirve para los nmeros sin signo y IDIV para los con
7

signo. Esta instruccin divide el valor de AX entre la fuente.


Ejemplo con AX= 18 y BX = 5
IDIV BX
Resultados: AX = 3 y DX = 3 (siendo DX el resto de la operacin)
4.4 Otra divisin y multiplicacin: SHR y SHL
Estas instrucciones permiten dividir registros con SHR y multiplicarlos con SHL. Se
necesitan dos operandos: el dividendo y el divisor para SHR y el multiplicando y
multiplicador para SHL. Funcionan en potencia de 2. Por lo que si queremos dividir
AX entre 4 pondremos: SHR AX, 2 (ya que 22= 4). Para dividir BX entre 16
pondremos: SHR BX, 4 (ya que 24= 16) Para SHL es igual: para multiplicar CX por 256
pondremos: SHL CX,8 (28=256). Para multiplicar o dividir nmeros que no son
potencias de 2 habr que combinar SHR o SHL.
Recuerda: x0 dar siempre 1 sea cual sea el valor de x!
Ejemplo: queremos multiplicar 5 por 384. Vemos que 384 = 256+128, lo que nos va
bien porque 256 y 128 son potencias de 2.
MOV AX, 5 >ponemos 5 en AX > AX=5
MOV BX, AX >ponemos AX en BX > BX=AX
SHL AX, 8 >multiplicamos AX por 256 (28) > AX = AX*256 = 5*256 = 1280
SHL BX, 7 >multiplicamos BX por 128 (27) > BX = BX*128 = 5*128 = 640
ADD AX, BX >agregamos BX a AX > AX= AX+BX = 1280 + 640 = 1920
Verifiquen! 5*384 = 1920

Bueno, ustedes dirn: y porqu no utilizar un MUL simplemente? Pues porque SHL
se ejecuta mucho ms rpido pero claro que para nmeros que tienen una
descomposicin demasiado larga es mejor utilizar un MUL.
4.5 Lo opuesto de un nmero: NEG
La instruccin que yo creo que es la ms simple es la NEG que sirve transformar un
nmero positivo en negativo e inversamente. Solo se necesita un operando: la
destinacin. Si AX=5, entonces un NEG AX pondr AX=-5. O si BX=-2 entonces
despus de NEG BX, BX=2.

5- Los puntos decimales y los nmeros negativos


5.1 Los puntos decimales
El problema en ensamblador es que no podemos utilizar directamente los nmeros
con puntos decimales. Se utilizan nmeros decimales fijos. Se trata de efectuar
clculos con valores bastante grandes que enseguida son re-divididos para
encontrar un resultado dentro de un cierto intervalo.
Por ejemplo: queremos multiplicar 20 por 0.25. Como no podemos poner 0.25 en un
registro entonces le pondremos un nmero entero multiplicndolo por ejemplo por
256. 0.25*256=64. Este resultado lo multiplicamos por 20 y siendo el resultado 256
veces ms grande, entonces lo dividiremos entre 256:
MOV AX, 64 >ponemos 0.25*256 en AX >AX=64
MOV BX, 20 >ponemos 20 en BX >BX=20
MUL BX >multiplicamos AX por BX >AX=AX*BX=64*20=1280
SHR AX, 0 >dividimos AX por 256 (28) >AX=AX/256=1280/256=5
Y el resultado de 20*0.25 es efectivamente igual a 5.
Pongan atencin a no provocar desbordamiento, sobretodo con los nmeros con
signo o los grandes nmeros. Utilizando SHR o SHL, mientras ms grande sea el
8

operando ms preciso ser el resultado ya que habrn ms decimales disponibles.


5.2 Los nmeros negativos
Otro problema es que en decimal debemos poner un - antes del nmero si es
negativo, pero en binario slo podemos poner 0 1. Por lo tanto para poder poner
un nmero en negativo se utiliza el mtodo del complemento de 2. He aqu en qu
consiste:
Convertir el nmero en binario si no est ya hecho
Invertir los bits del nmero (invertir los 0 en 1 y los 1 en 0)
Agregar 1 al nmero obtenido
Aqu un ejemplo con el nmero decimal 5 en formato 8 bits (octeto):
Lo convertimos en binario : 5(d) = 00000101 (b)
Invertimos: 00000101 11111010 (aqu el formato, 8 bits, es importante ya
que en 4 bits por ejemplo da: 1010)
Agregamos 1 11111010 + 0000001= 11111011
-5 es igual a 11111011 en binario
Para que el nmero sea negativo ste debe ser con signo. En 8 bits los sin signo van
de 0 a 255 y los con singo van de -128 a 127.
Cuando el nmero es con signo y en 8 bits, podemos saber si es negativo, viendo el
octavo bit (partiendo de la derecha, claro). Si ste es igual a 1 entonces el nmero es
negativo. Para los nmeros de 4 bits es el cuarto que cuenta.
Para transformar -5 en hexadecimal, descomponemos el nmero binario en medioocteto
(11111011 en 1111 y 1011). 1111b= 15d = Fh y 1011b = 11d = Ah. Entonces -5d = FAh.
(d= decimal, b= binario, h= hexadecimal, para aquellos que an no hayan
comprendido).

6- Las instrucciones lgicas


Las operaciones de estas instrucciones se realizan bit a bit y los operandos o
posicionamientos de memoria que utilizan son en 8 o 16 bits.
Recuerda: para convertir de memoria un nmero binario en decimal: cada rango de
un nmero binario es un mltiplo de 2.
2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^1
128 64 32 16 8 4 2 1
As por ejemplo 10110110 dar 128+32+16+4+2 = 182:
10110110
128 64 32 16 8 4 2 1
6.1 Y lgico: AND
AND (Y) efecta un Y LOGICO sobre dos operandos y el resultado se recuperar en
el primer operando. El Y LOGICO da el resultado 1 nicamente cuando los 2
operandos son 1, si no pone 0.
Operando 1 Operando 2 AND
000
010
100
111
Ejemplo con AX=15 y BX = 26:
ADN AX, BX
9

Resultado:
0000 1111 (AX=15)
AND 0001 1010 (BX=26)
--------------------------------0000 1010 (AX=10)
6.2 O Lgico inclusivo: OR
OR efecta un O LOGICO INCLUSIVO sobre 2 operandos y el resultado se
recuperar en el primer operando. El O LOGICO INCLUSIVO da el resultado 0
nicamente si ambos operando son 0, si no pone 1.
Operando 1 Operando 2 OR
000
011
101
111
Ejemplo con AX=15 y BX = 26
OR AX, BX
Resultado:
0000 1111 (AX=15)
OR 0001 1010 (BX=26)
------------------------0001 1111 (AX= 31)
6.3 O Lgico exclusivo: XOR
XOR efecta un O LOGICO EXCLUSIVO sobre dos operandos y el resultado se
recuperar en el primer operando. El O LOGICO EXCLUSIVO da el resultado 1 cuando
los 2 operandos son diferentes, sino pone 0.
Operando 1 Operando 2 XOR
000
011
101
110
Ejemplo con AX = 15 y BX = 26
XOR AX, BX
Resultado:
0000 1111 (AX= 15)
XOR 0001 1010 (BX = 26)
-------------------------0001 0101 (AX=21)
6.4 No lgico: NOT
NOT efecta un NO LOGICO sobre un operando y el resultado se recuperar en el
operando. El NO LOGICO invierte el valor de cada bit.
Operando NOT
01
10
Ejemplo con AX=15
NOT AX
Resultado:
NOT 0000 1111 (AX=15)
10

------------------------1111 0000 (AX = -16 con signo y 240 sin signo)


6.5 TEST
Esta instruccin testea el valor de uno o ms bits efectuando un Y LOGICO sobre los
operandos. El resultado no modifica los operandos pero s los indicadores (flags).
Ejemplo:
TEST AX, 1 >efecta un Y LOGICO sobre el primer bit de AX con 1, si es igual a 1, ZF
pasar a 1 e inversamente (si 0 entonces ZF=0)
Un TEST AX, AX (a menudo utilizado) permite verificar si AX es igual a 0 no.

7- La memoria y sus instrucciones


7.1 LEA
Para poner por ejemplo el valor de loffset de MESSAGE en SI basta con poner: MOV
SI, Offset-Messsage. Pero no se puede proceder de este modo con los registros DS,
FS, ES, GS ya que stos no aceptan valores numricos sino nicamente los valores
de los registros. Razn por la cual tendremos que pasar por: MOV AX, Seg-Message
luego MOV DS, AX.
Existe otra instruccin que permite poner el Offset de un registro pero de forma
ms corta. Se trata de LEA. Por ejemplo: LEA SI, MESSAGE pondr en SI el Offset de
Message. La utilizacin de LEA en lugar de MOV hace que el cdigo sea ms claro y
ms compacto.
7.2 MOVSx
Para desplazar bloques enteros de memorias hay que utilizar las instrucciones:
MOVSB, MOVSW o MOVSD segn el nmero de bits desplazar.
MOVSB : (B) = Byte (octetos: 8 bits) (Cuidado!! Que en Ingls byte= un
octeto y bit= un bit)
MOVSW: (W) = Word (palabra: 8 bits)
MOVSD: (D) = DWord (doble palabra : 32 bits)
Si queremos desplazar 1000 octetos (bytes) utilizando el comando MOVSB ste
tendr que repetirse 1000 veces. Por lo que la instruccin REP es utilizada como
loop (ciclo). Hay que poner antes el nmero de loops a efectuar en el registro de
contador (CX):
MOV CX, 1000 >nmero de loops a efectuar en el contador CX
REP MOVSB >desplaza un octeto
Para ir ms rpidos podemos desplazarlos por palabra (Word):
MOV CX, 500 >1000 bytes = 500 words
REP MOVSW >desplaza un word
O en doble palabra (DWord)
MOV CX, 250 >1000 bytes = 500 words = 250 dwords
REP MOVSD >desplaza una doble palabra
A cada MOVSx, DI augmenta de 1, 2 4 bytes.
7.4 STOSx
Para guardar datos o ponerlos en un lugar de la memoria, utilizamos las
instrucciones STOSB, STOSW, STOSD.
Igual que los MOVSx, estas instrucciones sirven respectivamente para almacenar un
11

byte, un Word o un dword. En cambio utilizan AL, AX (EAX 32bits) como valor a
almacenar. El valor AL, AX, EAX ser almacenado en ES:DI. A cada STOSx, DI
augmenta de 1, 2 4 bytes.
Ejemplo:
MOV CX, 10 >nmero de repeticiones puestas en CX, aqu 10
MOV AX, 0 >valor a mover, aqu 0
REP STOSB >almacenar AX en ES:DI
As tendremos 10 bytes de 0 en ES:DI.

ANEXO: Lo que ms utilizamos en el cracking ;)


Antes que nada, felicitar a todos aquellos que se leyeron sistemticamente las 15
pginas anteriores. Significa que estn motivados y seguramente aprendern
mucho. A aquellos que se vinieron a leer directamente esta parte, solo decirles que
es una ilusin creer que esta parte ser suficiente para aprender a crackear. Se
necesita muuuchsima lectura y prctica para ser capaz de crackear incluso el
programa ms sencillo que exista (aunque estos estn ya casi extintos razn de ms
para invertir tiempo en la lectura ;).
Lo que sigue supone que crackeamos haciendo uso de Olly Dbg .
A- De las instrucciones
CALL y RET
Lo bsico en el cracking. Si no comprendemos esto pues no podremos tracear un
evento y como consecuencia no podremos crackear nada.
La siguiente imagen (extrada de uno de mis tutoriales) muestras las CALLs en
blanco y los RET en azul claro:
Tomemos por ejemplo la primera: CALL Notes. 00523728
Qu significa? Pues que cuando el programa ejecuta esa lnea (004827BA) ste ir a
ejecutar una subrutina que comienza en la lnea 00523728 que es el valor del
operando CALL Notes. Cada rutina o subrutina se termina a su vez en uno o ms
RET. El RET (o RETN) marca el punto de salida de la subrutina y al mismo tiempo el
retorno (RETURN) a la siguiente instruccin del CALL que llam a dicha subrutina.
En nuestro ejemplo, cuando se llegue al RENT de la subrutina que comienza en
00523728 ste nos traer de vuelta a la lnea 004827BF. Ms claro no lo puedo
explicar.
NOP (No Operation)
Su uso se conoce en el cracking como nopear y como su nombre lo indica
consiste en no hacer nada. Es muy utilizado sobre todo cuando nos iniciamos en
el cracking aunque en determinadas circunstancias puede ser la nica alternativa.
En hexadecimal NOP = 90. En el precedente ejemplo, si quisiramos evitar que el
programa ejecute la CALL Notes. 00523728 basta con reemplazar su cdigo
hexadecimal E8690F0A00 por 9090909090.
MOV
Mueve el segundo operando al primero. Ejemplos:
MOV EAX, ECX >pondr el valor de ECX en el registro EAX
MOV AL, 1 >pondr 1 en AL (los 2 ltimos nmeros de EAX)
XOR
La forma ms utilizada es cuando se necesita poner 0 en alguno de los registros.
Para ello basta con que los dos operandos sean el mismo registro. Ejemplo:
EAX = 1
12

XOR EAX, EAX


>resultado EAX= 0 ya que el valor de los dos operandos es el mismo.
INC y DEC
INC = incrementar de 1 el operando; DEC= decrementar de 1 el operando. Ejemplo:
EAX=00000000
INC EAX >EAX= 00000001
DEC EAX >EAX= FFFFFFFF (-1)
B- De los registros
Aunque todos pueden ser tiles, el ms utilizado es EAX. Y la razn es simple: el
resultado de un CALL se almacena en general en EAX y cuando se estudia por
ejemplo el sistema de activacin de un programa, la mayor parte de casos puede
representarse con el siguiente esquema:
CALL xy
MOV x, y
CMP EAX, xy TEST AL, xy TEST/CMP xy, EAX/AL
JE xy JNZ xy

CALL xy -> ventana de registro/ mensaje OK no OK, por ejemplo.


En este esquema extremamente simplificado (pero que a menudo encontramos en
este noble arte ;) vemos que la condicin del salto est determinado en parte por el
valor de EAX o AL que a su vez est dado por la CALL que precede.
Nota:
Si EAX = 12345678 Si EBX= 12345678
AL = 78 BL = 78
De esto recordemos que:
EAX : (32bits)
AX: (16bits)
AL: (8bits)
Y as consecutivamente en todos los registros (ECX > CL; EDX >DL)
C- De los saltos, condiciones y Flags
Los saltos ms comnmente utilizados son JE, JNZ y a veces JG y otros
Para modificar virtualmente estos saltos, por ejemplo si queremos ver cmo
reacciona el programa si se modifica el salto, usamos el Flag Z ya que cambiando el
valor de ste (entre 0 y 1) podemos variar el comportamiento del programa. Muy
til para testear rpidamente nuestras hiptesis sobre el funcionamiento de algn
evento en el programa. Las condiciones que ms se asocian a estos saltos
condicionales son CMP y TEST descritas ms arriba.
Este es el fin de este curso. Uuf! Me pas casi 8 horas escribindolo por lo que
espero que les sea de ayuda y que enriquezca el repertorio de material que estoy
seguro, los ms motivados, ya tienen. Quiero agradecer a mis amigos de siempre:
POP, JONNY, JJBB y D!OxDe2k por su colaboracin en el Blog y por su apoyo as
como tambin a todos aquellos que nos apoyan y que nos visitan en el blog.
Un saludo igualmente a todos nuestros compaeros (aunque lamentablemente no
amigos cercanos) de diferentes Teams, grupos o independientes que con su labor
mantienen viva la escena del cracking y de quienes seguramente mucho he
aprendido.
13

Este curso ha sido de teora pura pero no se desmotiven si hay cosas que quedaron
en la sombra ya que pueden contactarme desde el blog o simplemente dejar un
comentario en el minichat y probablemente otras personas podrn ayudar.
De ms est decir que cualquier observacin o sugerencia a propsito de lo que
hacemos, es bienvenida siempre y cuando sea constructiva ;)
Por ltimo, invitarlos a que ojeen nuestros tutoriales que yo espero con esta
contribucin, sern ms fciles de seguir y de leer.
JUNLA
MPT34M
www.mpt34m.net

14

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