Sie sind auf Seite 1von 19

From the Depths of ibalba

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 1.1 1.2 1.3 1.4 2 El procesador y los registros Los registros generales y de trabajo Los registros de Offset y punteros Los registros de segmentos El registro Flag 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
By JUNLAJUBALAM M4Y4N PR0PH3CY T34M , 2009 www.mayanprophecyteam.xdir.org

From the Depths of ibalba 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.

By JUNLAJUBALAM M4Y4N PR0PH3CY T34M , 2009 www.mayanprophecyteam.xdir.org

From the Depths of ibalba 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 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)
By JUNLAJUBALAM M4Y4N PR0PH3CY T34M , 2009 www.mayanprophecyteam.xdir.org

From the Depths of ibalba

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
By JUNLAJUBALAM M4Y4N PR0PH3CY T34M , 2009 www.mayanprophecyteam.xdir.org

From the Depths of ibalba Bit 14 : NT Bit 15 : 0 Bit 16 : RF 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.
By JUNLAJUBALAM M4Y4N PR0PH3CY T34M , 2009 www.mayanprophecyteam.xdir.org

From the Depths of ibalba 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. 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] PUSH 00000100 PUSH 00406130 PUSH 00000405 PUSH EDI CALL GetDlgItemText pone el handle de la ventana de dilogo en EDI push (4) tamao mximo de la cadena push (3) direccin del buffer para el texto push (2) identificador del control push (1) hanlde de la ventana de dilogo llama la funcin

By JUNLAJUBALAM M4Y4N PR0PH3CY T34M , 2009 www.mayanprophecyteam.xdir.org

From the Depths of ibalba 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:

By JUNLAJUBALAM M4Y4N PR0PH3CY T34M , 2009 www.mayanprophecyteam.xdir.org

From the Depths of ibalba Indicador (Flag) Valor 1 CF 0 Salto JB JBE JC JNAE JA JAE JNB JNC JE JNA JZ JNBE JNE JNZ JP JPE JNP JPO JO JNO JS JNS Significado Below- Inferior Below or Equal Inferior o Igual Carry Retencin Not Above or Equal No superior o igual Above- Superior Above or Equal- Superior o igual Not Below No inferior Not Carry- No retencin Equal- Igual Not Above- No superior Zero- Cero (salta en caso de igualdad) Not Below or Equal- No superior o Igual Not Equal- No igual Not Zero- No Cero (salta si diferente) Parity Par Parity Even- Par Not Parity- Impar Parity Odd- Impar Overflow- Desbordamiento Not Overflow- No desbordamiento Signed- Con signo Not Signed- Sin signo

ZF

0 1 0 OF SF 1 0 1 0

PF

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
By JUNLAJUBALAM M4Y4N PR0PH3CY T34M , 2009 www.mayanprophecyteam.xdir.org

From the Depths of ibalba 3.2 La instruccin CMP Esta instruccin permite efectuar tests entre valores y modificar los flags segn el 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. La
By JUNLAJUBALAM M4Y4N PR0PH3CY T34M , 2009 www.mayanprophecyteam.xdir.org

From the Depths of ibalba 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 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 MOV BX, AX SHL AX, 8 SHL BX, 7 ADD AX, BX >ponemos 5 en AX >ponemos AX en BX >multiplicamos AX por 256 (28) >multiplicamos BX por 128 (27) >agregamos BX a AX > AX=5 > BX=AX > AX = AX*256 = 5*256 = 1280 > BX = BX*128 = 5*128 = 640 > AX= AX+BX = 1280 + 640 = 1920

Verifiquen! 5*384 = 1920

By JUNLAJUBALAM M4Y4N PR0PH3CY T34M , 2009 www.mayanprophecyteam.xdir.org

10

From the Depths of ibalba 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 MOV BX, 20 MUL BX SHR AX, 0 >ponemos 0.25*256 en AX >ponemos 20 en BX >multiplicamos AX por BX >dividimos AX por 256 (28) >AX=64 >BX=20 >AX=AX*BX=64*20=1280 >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 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
By JUNLAJUBALAM M4Y4N PR0PH3CY T34M , 2009 www.mayanprophecyteam.xdir.org

11

From the Depths of ibalba

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 128 2^6 64 2^5 32 2^4 16 2^3 8 2^2 4 2^1 2 2^1 1

As por ejemplo 10110110 dar 128+32+16+4+2 = 182: 1 128 0 64 1 32 1 16 0 8 1 4 1 2 0 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.

By JUNLAJUBALAM M4Y4N PR0PH3CY T34M , 2009 www.mayanprophecyteam.xdir.org

12

From the Depths of ibalba

Operando 1 0 0 1 1 Ejemplo con AX=15 y BX = 26: ADN AX, BX Resultado: AND 0000 1111 (AX=15) 0001 1010 (BX=26) --------------------------------0000 1010 (AX=10)

Operando 2 0 1 0 1

AND 0 0 0 1

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 0 0 1 1 Ejemplo con AX=15 y BX = 26 OR AX, BX Resultado: OR 0000 1111 (AX=15) 0001 1010 (BX=26) ------------------------0001 1111 (AX= 31) Operando 2 0 1 0 1 OR 0 1 1 1

By JUNLAJUBALAM M4Y4N PR0PH3CY T34M , 2009 www.mayanprophecyteam.xdir.org

13

From the Depths of ibalba 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 0 0 1 1 Ejemplo con AX = 15 y BX = 26 XOR AX, BX Resultado: XOR 0000 1111 (AX= 15) 0001 1010 (BX = 26) -------------------------0001 0101 (AX=21) Operando 2 0 1 0 1 XOR 0 1 1 0

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 0 1 NOT 1 0

Ejemplo con AX=15 NOT AX Resultado: NOT 0000 1111 (AX=15) ------------------------1111 0000 (AX = -16 con signo y 240 sin signo)

By JUNLAJUBALAM M4Y4N PR0PH3CY T34M , 2009 www.mayanprophecyteam.xdir.org

14

From the Depths of ibalba 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 REP MOVSB >nmero de loops a efectuar en el contador CX >desplaza un octeto

Para ir ms rpidos podemos desplazarlos por palabra (Word):


By JUNLAJUBALAM M4Y4N PR0PH3CY T34M , 2009 www.mayanprophecyteam.xdir.org

15

From the Depths of ibalba MOV CX, 500 REP MOVSW >1000 bytes = 500 words >desplaza un word

O en doble palabra (DWord) MOV CX, 250 REP MOVSD >1000 bytes = 500 words = 250 dwords >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 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 MOV AX, 0 REP STOSB >nmero de repeticiones puestas en CX, aqu 10 >valor a mover, aqu 0 >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 .

By JUNLAJUBALAM M4Y4N PR0PH3CY T34M , 2009 www.mayanprophecyteam.xdir.org

16

From the Depths of ibalba 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
By JUNLAJUBALAM M4Y4N PR0PH3CY T34M , 2009 www.mayanprophecyteam.xdir.org

17

From the Depths of ibalba 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 MOV AL, 1 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 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 DEC EAX >EAX= 00000001 >EAX= FFFFFFFF (-1) >pondr el valor de ECX en el registro EAX >pondr 1 en AL (los 2 ltimos nmeros de EAX)

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.
By JUNLAJUBALAM M4Y4N PR0PH3CY T34M , 2009 www.mayanprophecyteam.xdir.org

18

From the Depths of ibalba Nota: Si EAX = 12345678 AL = 78

Si EBX= 12345678 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. 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.mayanprophecyteam.xdir.org
By JUNLAJUBALAM M4Y4N PR0PH3CY T34M , 2009 www.mayanprophecyteam.xdir.org

19

Das könnte Ihnen auch gefallen