-[ 0x0D ]--------------------------------------------------------------------
-[ Ensamblador orientado al cracking ]---------------------------------------
-[ by ThEnemI ]------------------------------------------------------SET-29--


	   ENSAMBLADOR ORIENTADO AL CRACKING 

		 		                  by ThEnemI
<thenemi@hotmail.com>





    ADVERTENCIA     

El autor no se hace responsable del mal uso que se le pueda asignar al 
contenido de este texto. Esto se hace con fines educativos. Ademas, no he sido 
yo, nadie me ha visto, y no teneis pruebas. xD

Haz lo que te de la gana con el texto


		INDICE

	0x00		Introduccion

	0x01		FAQ
				- Cracking
				- Ensamblador
				- Herramientas
				- Hexadecimal
				- Dificultad
				- Problemas

	0x02		El ordenador por dentro
				- Que es
				- Sistema de computo
					- memoria
					- entrada-salida
					- CPU
				- Procesador

	0x03		Atacando al lenguaje
				- para empezar
				- registros generales

	0x04		El primer programa

	0x05		Guardar y cargar programas
				- guardar
				- cargar

	0x06		Condiciones, ciclos y bifurcaciones
                                - teoria
				- practica

	0x07		Alguna cosa mas...

	0x08		Cracking
				- tecnicas de proteccion
				- atacar
				- practicar

	0x09		Despedida y Reflexion




0x00. Introduccion

    Este texto no pretende ser una guia avanzada, ni tan siquiera una guia. 
Es simplemente una "recopilacion" de textos LIBRES que vagan por la red. Si ya
sabes lo basico, deja este texto y coge algo mas complejo. ;>
   Pero si antes de leer textos sobre como crackear x crackme te gustaria 
saber algo de ensamblador... Este es tu articulo



0x01. FAQ (Frecuently asked questions)

    Se que a muchos de vosotros esto os parecera aburrido, y quereis pasar
enseguida a la accion (al ataquerrrr!!!) PERO.... Si no sabemos que es lo 
que estamos haciendo...
?:/ (no coment). Bueno, ahi van....


///     Que es el cracking?
	     Es una tecnica que consiste en la desproteccion de SOFTWARE. Ojo,
       no confundir con una tecnica de hacking que se llama igual, y es mas
       bien destrozar todo lo que pilles (desconectando ordenadores de Inet,
       jo$%!@  el HD*....)
       *HD: Hard drive (disco duro)


///     Que es ensamblador?
	    Ensamblador es un lenguaje de programacion de bajo nivel, con las
        consecuencias que ello conlleva:
	1. Es dificil de aprender (ya con cara de panico? tranquilo, solo te
           costara al principio)
	2. Exige conocer todos los componentes del ordenador (auch!)
	3. Obtenemos el maximo rendimiento!!
	   De momento no os preocupeis, para el cracking solo necesitareis 
           conocer las ordenes basicas, aunque os recomiendo enteraros un
           poquillo mas...


///     Que herramientas voy a necesitar?
	   Pues para aprender ensamblador, lapiz, papel, interes, y un debug
           (dios, no!!!!) tranquilo, si usas windows* (XP, ME, 9x*,NT...)Viene
           incluido. Dependiendo de la version, en accesorios, MS-DOS*,o
           en accesorios, simbolo del sistema, o en "ejecutar" escribe
           "command.com"

********Comenario SET
Me parece que command.com era en windows 3.11, apartir de Win-95 y desde luego
XP, 2000, NT se tiene que escribir "cmd"
********Fin


*windows: Es un sistema operativo. Es decir, el que interpreta las
instrucciones. Ya es hora de que sepas que hay mas sistemas operativos, como
puede ser MS-DOS, Linux y sus versiones (Suse, RedHat...), y la familia 
UNIX, SunOS, Solaris...

	    Para crackear: pues el progama objetivo, y un debugger mas
            potente (olly, softice...) y un editor hexadecimal. De momento,
            no os preocupeis.

*M$-DO$: Microsoft Disk Operative $ystem. El primer $istema Operativo
(O$ en ingles)de la queridisima compaia de Billy.

///	Hexadecimal
	   Pues supongo que todos han oido hablar del sistema decimal (10
        digitos, del 0 al 9) o del sistema binario (con 0 y 1) Pues HEXA, no
        es mas que un sistema, en que se usan numeros del 0 al 9, y letras de
        la A a la F.[0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F] Para que quede claro:
	1=1; 2=2; 3=3; 4=4; 5=5; 6=6; 7=7; 8=8; 9=9; A=10; B=11; C=12; D=13;
        E=14; F=15.


///     Yo valgo?
	  Pues si tienes interes, y usas un poquito lo que hay debajo del
        pelo... (eso no, la cabeza!)


///	Tengo un problema...
           Para cualquier duda, escribe a <thenemi@hotmail.com>



0x02. El ordenador por dentro
	Pues para conocer tu ordenador (un vistazo rapido), que mejor que unos
        apuntes de la Escuela Politecnica Superior de Alicante, y otros de la
        universidad de Guadalajara. Digo yo que tendran que saberlo... (se 
        pueden encontrar navegando por ahi, como ya dije esto tiene mucho de
        recopilacion)


A. Que es un ordenador?
   Un ordenador es una maquina para el tratamiento de informacion, que
funciona manipulando seales electricas binarias (0 y 1) y que se constituye
de los siguientes elementos:

[ELEMENTOS DEL SISTEMA DE COMPUTO]
Le llamamos sistema de computo a la configuracion completa de una computadora,
incluyendo las unidades perifericas y la programacion de sistemas que la hacen
un aparato util y funcional para un fin determinado. Se compone de los
siguientes elementos:


      * La memoria  (RAM/ROM/CMOS/EPROM/CACHEs)
  Es un conjunto de celdas (actualmente fabricadas con semiconductores) 
usadas para procesos generales, tales como la ejecucion de programas y el
almacenamiento de informacion para las operaciones.

  Cada una de las celdas puede contener un valor numerico y tienen la
propiedad de ser direccionables, esto es, que se pueden distinguir una de 
otra por medio de un numero unico o direccion para cada celda.

  El nombre genrico de estas memorias es Random Access Memory (Memoria de
acceso aleatorio) o RAM por sus siglas en ingles. La principal desventaja de
este tipo de memoria es que los circuitos integrados pierden la informacion
que tienen almacenada cuando se interrumpe la alimentacion electrica. Esto
lleva a la creacion de memorias cuya informacion no se pierda cuando se apaga
el sistema. Estas memorias reciben el nombre de Read Only Memory (Memoria de
solo lectura) o ROM.


      * Las unidades de entrada y salida
   Para que una computadora nos sea util es necesario que el procesador se
comunique al exterior por medio de interfaces que permiten la entrada y la
salida de datos del procesador y la memoria. Haciendo uso de estas
comunicaciones es posible introducir datos para su procesamiento y la
posterior visualizacin de los datos ya procesados.

   Algunas de las unidades de entrada mas comunes son teclados, lectoras de
tarjetas (ya en desuso), raton, etc. Las unidades de salida mas comunes son
las terminales de video(monitor...) y las impresoras.


      * La Unidad Central de Proceso o CPU
   Es la parte mas importante. Tambien se conoce como microprocesador.La CPU
esta formada a su vez por la unidad de control y la unidad aritmetica y logica.

   La funcion de la CPU  consiste en leer y escribir contenidos de las celdas
de memoria, llevar y traer datos entre celdas de memoria y registros especiales
y decodificar y ejecutar las instrucciones de un programa.

   * Analizando las unidades de la CPU
   Unidad de control: su funcion es intentar reconocer las instrucciones en 
binario y generar las ordenes para que se ejecuten.
   Unidad aritmetico-logica: trata de realizar las operaciones basicas de
calculo aritmetico,como puede ser la suma, resta, multiplicacion, o la
division, asi como las operaciones logicas bit a bit, and, or , xor, not, neg.
(lo aprenderas mas adelante)

   Sobre decodificar y ejecutar las instrucciones de un programa:
   El reconocimiento de las instrucciones ( secuencias de valores binarios
determinados ) es muy importante, pues de no ser reconocida, en procesadores
anteriores al 80286 provoca un cuelgue, o bien la ejecucion de operaciones
inesperadas, algo que puede aprovecharse para la deteccion de un determinado
procesador, o una determinada marca de procesadores.

   Procesador: como trabaja
   El procesador trabaja de manera distinta segun el modo de funcionamiento
activado. Los modos existentes en los 80x86 son el modo REAL ( para mantener
la compatibilidad con los 8086), el modo PROTEGIDO ( una extension muy amplia 
de este modo ), y el modo intermediario entre los dos, el VIRTUAL 86 ( V86 ).
Dependiendo del modo de trabajo activo se realiza de una manera distinta el
direccionamiento de la memoria, es decir que se interpretan de diferente modo
las direcciones a memoria. Aunque existen mayores diferencias entre los modos,
nosotros estudiaremos el mas sencillo, el modo REAL

   El procesador cuenta con una serie de celdas de memoria que se utilizan 
con mucha frecuencia y que, como ya hemos visto, forman parte de la CPU.

   Estas celdas son conocidas con el nombre de registros. Un procesador puede 
tener una docena o dos de estos registros. La unidad aritmetica y logica de la
CPU realiza las operaciones relacionadas con los calculos numericos y
simbolicos. Tipicamente estas unidades solo tienen capacidad de efectuar
operaciones muy elementales como: suma y resta de dos numeros de punto fijo,
multiplicacion y division de punto fijo, manipulacion de bits de los registros
y comparacion del contenido de dos registros.

   Un dato mas:
   Las computadoras personales pueden clasificarse por lo que se conoce como
tamao de palabra, esto es, la cantidad de bits que el procesador puede
manejar a la vez.


0x03. Atacando al lenguaje

  A.- Para empezar
  Antes de seguir conviene hacer una aclaracion: cuando hacemos un programa, 
primero lo escribimos en un lenguaje de alto nivel (que entendemos) y despues 
lo traducimos a lenguaje maquina. Ya esta, podemos seguir.

   La CPU tiene 14 registros internos, cada uno de 16 bits. Los primeros cuatro,
AX, BX, CX, y DX son registros de uso general y tambien pueden ser utilizados 
como registros de 8 bits, para utilizarlos como tales es necesario referirse a 
ellos como por ejemplo: AH y AL, que son los bytes alto (high) y bajo (low) del
registro AX. Esta nomenclatura es aplicable tambin a los registros BX, CX y DX.
Esto se hace en procesadores x86

   Los registros son conocidos por sus nombres especficos. Algunos de ellos:

AX Acumulador
BX Registro base
CX Registro contador
DX Registro de datos
DS Registro del segmento de datos
ES Registro del segmento extra
SS Registro del segmento de pila
CS Registro del segmento de cdigo
BP Registro de apuntadores base
SI Registro ndice fuente
DI Registro ndice destino
SP Registro del apuntador de la pila
IP Registro de apuntador de siguiente instruccin
F  Registro de banderas

   Mas adelante veremos mas concretamente los regsitros de banderas, pila,etc..

   Algo practico: Desde MS-DOS, escribe debug: aparecera un guion (interprete 
de comandos) Si escribes "r", veras el registro.


   B.-  Registros "generales".
Estos  registros son escribibles y legibles directamente mediante instrucciones de transferencia
de datos.

           Registro  Ancho.     Nombre.

                 AX  16 bits      ACUMULADOR

                 BX  16 bits

                 CX  16 bits      CONTADOR

                 DX  16 bits

                EAX  32 bits     (386+)

                EBX  32 bits     (386+)

                ECX  32 bits     (386+)

                EDX  32 bits     (386+)


   ALGO MAS COMPLEJO: a veces se quiere acceder a la parte baja y alta de uno 
deestos registros, por ello existen nombres para designar la parte baja rL, de
8 bits y la alta rH de 8 bits, donde r es A o B,o C o D. Por ejemplo, AL  
designa a la parte baja del registro AX.De igual manera existe AH,AL,BL,BH,CH,
CL,DL y DH.

   Toda direccion en modo REAL se descompone en un segmento y un offset, siendo
la representacion grafica tipica SEG:OFFS. Dicha direccion es virtual, es
decir que corresponde con una direccion fisica de longitud maxima 1Mb, y que
calculamos mediante la formula siguiente:

      16*SEG+OFFS  = direccion fisica.

   De esta manera al direccionar la direccion por ejemplo 0:100, estamos
accediendo a la posicion de memoria 0*16+100, es decir a la 100. Se puede por lo
tanto acceder a una misma posicion de memoria fisica(de 0 a 1Mb) de distintas 
maneras. Por ejemplo, acceder a la direccion 0:160h o 16h:0  implica acceder a 
la misma posicion fisica, la 160h. Si fijamos el segmento, el offset tiene el 
papel de indice dentro de un array de 64kb como maximo. Veamos varios ejemplos
practicos, pero antes es necesario conocer lo que son los registros de segmento.

Dispone el procesador de unos registros de segmento, que almacenan el segmento 
que se va utilizar en una operacion de  acceso a memoria, cargado por el 
intermediario de un registro general [no te desmoralices si no lo entiendes 
demasiado]


   Si te fijaste, en el registro del debug habia unas letras al final. Esto 
es lo que quieren decir:

Overflow
     NV = no hay desbordamiento;
     OV = si lo hay
	Que es el overflow? pues si un registro puede almacenar hasta un numero de 
2 cifras, si introducimos uno de 3, se desborda.

Direction
     UP = hacia adelante;
     DN = hacia atras;

Interrupts
     DI = desactivadas;
     EI = activadas

Sign
     PL = positivo;
     NG = negativo

Zero
     NZ = no es cero;
    ZR = si lo es
Esto va a ser util a la hora de comparar numeros.

Auxiliary Carry
     NA = no hay acarreo auxiliar;
     AC = hay acarreo auxiliar

Parity
     PO = paridad non;
     PE = paridad par;
Sobre el bit de paridad: Como ya sabes, 1 byte = 8 bits (una letra). Pues para
dar mayor seguridad, cada x cadenas(generalmente en todas) se aade un noveno 
bit. Si al recibir todas las cadenas tenemosun numero par de bits de paridad, 
quiere decir que todo ha funcionado correctamente.

Carry
     NC = no hay acarreo;
     CY = Si lo hay



0x04. Haciendo el primer programa

   Si! Por fin! Pero.. (joooo!!!) Solo una cosa mas:  en el lenguaje ensamblador
se pueden apreciar dos partes en el codigo: la primera es el nombre  de la 
instruccin, y la segunda, los parmetros de la misma. Por ejemplo: sabiendo que
la instruccion "mov" mueve el parametro indicado al registro que mandemos, y que
AX es el acumulador, se podria hacer lo siguiente:
En ms-dos, escribir "debug" teclear "a 0100 assamble".
Para ver una lista extendida de los comandos escribe "help" o bien "?"
Esta orden le indica al debug que queremos comenzar a indicar instrucciones 
en la direccion 0100 (os acordais de lo de las celdas?) Normalmente, al 
escribir "a" se colocara automaticamente en 0100, pero conviene recordarselo, 
ya que si no puede traer problemas.
Una vez hecho esto, teclear lo siguiente:

0CAE:0100 mov ax,0002
0CAE:0103 int 20
0CAE:0105
Comentarios: la instruccion mov ax, 002 mueve el valor HEXA 0002 a ax 
(primero le indicamos a donde lo movera, y despues que movera) Int 20 le indica
al programa que hemos terminado.

Para ejecutar nuestro programa escribimos:
-g

   Nos saldr el siguiente mensaje:
"El programa ha terminado de forma normal"

  Si queremos comprobar el valor de ax tecleamos:
-g 01013

  (genera hasta 103)


Nos mostrara el registro:

AX=0002  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0CAE  ES=0CAE  SS=0CAE  CS=0CAE  IP=0103   NV UP EI PL NZ NA PO NC
0CAE:0103 CD20          INT     20

   Los demas pueden cambiar, pero ax debe valer dos.

  Otras instrucciones:
La instruccion ADD, suma dos numeros.
Ejemplo:
ADD bx,ax  ;Esto sumara A BX el valor de ax (dos en este caso). Por lo 
tanto, bx pasara a valer 2h*
*:la h se usa para indicar que es hexadecimal.

Ejercicios: Crea un progama que almacene en cx la suma de dos numeros 
cualesquiera,
estando x en ax, e y en bx (p.ej, ax=2,bx=3,cx=2+3)


SOLUCION:
  Un posible programa seria este:

-a
0CAE:0100 mov ax,0007  	/indica que ax vale 7/
0CAE:0103 mov bx,0004	/indica bx vale 4/
0CAE:0106 add cx,ax	/queremos que ax y bx almacenen el valor de nuestros 
numeros,
0CAE:0108 add cx,bx          /con lo  cual estos no se pueden usar para 
almacenar la suma. Por
0CAE:010A int 20               /tanto le indicamos que aada al valor de cx 
(0000)) el valor de uno de ellos, para luego
0CAE:010C	             /sumarle el otro	/
-g

El programa ha terminado de forma normal

-g 010a

AX=0007  BX=0004  CX=000B  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0CAE  ES=0CAE  SS=0CAE  CS=0CAE  IP=010A   NV UP EI PL NZ NA PO NC
0CAE:010A CD20          INT     20

Por que aparace CX=000B? Pues porque 000Bh(hexadecimal) = 0011d (decimal)
   Y ya est!




0x05. Guardando y cargando programas

A.- GUARDAR:
   Para guardar un programa se necesita saber el tamao del mismo, indicarle 
a cx
lo que ocupa y guardar. Lo mejor es un ejemplo, con el programa anterior:


-a
0CAE:0100 mov ax,0007
0CAE:0103 mov bx,0004
0CAE:0106 add cx,ax
0CAE:0108 add cx,bx
0CAE:010A int 20
0CAE:010C
-n prueba.com
-h 10c 100
020C  000C
-rcx
CX 0000
:000c
-w
Escribiendo 0000C bytes

Explicamos:
n le indica el nombre. Estos archvos tienen la extension "com"
h nos indica el tamao que hay entre la celda 010c y 0100. El primer parametro
es la suma (100+ 10c) y el segundo la resta, es decir, el tamao de nuestro 
programa.
rcx: nos muestra el valor del regisro cx y nos deja modificarlo. CX indica 
el espacio que queremos reservar para nuestro programa, en este caso, 000c
w: (write) pues guarda. va a guardar en el primer sitio que pille, es decir, 
si en msdos antes de escribir debug aparece C:/ archivos de pepito, ahi se 
guardara. Si aparece solo c:/ pues en C...


B.- CARGAR:
  para cargar, primero le indicamos el nombre, y despues le decimos hasta 
donde cargamos.
Ejemplo:
-debug
-n prueba.com
-l
-u 100 10a

0CFA:0100 B80700        MOV     AX,0007
0CFA:0103 BB0400        MOV     BX,0004
0CFA:0106 01C1          ADD     CX,AX
0CFA:0108 01D9          ADD     CX,BX
0CFA:010A CD20          INT     20

la instruccion "l" (load) le indica que cargue el programa cuyo nombre 
introducimos.
"u" (unasamble) le dice que nos muestre lo que hay. para evitar ver lineas 
que no pertenecen a nuestro programa le indicamos que abra desde 100 hasta 10a.
Y ya esta.


0x06. Condiciones, ciclos y bifurcaciones

A. Teoria
   Pues esto sirve si queremos hacer un programa que, por ejemplo, dependiendo
de si quieres o no, te muestre un mensaje por pantalla. O si la contrasea es 
correcta o no te deja registrarte xD. He aqui cosas nuevas:


Instruccion	Funcion
jmp		salta a  la direccion que le indiquemos e (direccion)
                almacena cadenas de texto. Ej: e 105 "hola" 0d 0a "$". 0d 0a 
                es el valor hexa de intro (retorno de carro)
int 21		ejecuta una determinada funcion dependiendo del valor ah*. Por 
                ejemplo,
		si ah vale 9, muestra un mensaje. (el que se encuentre en dx)
loop [valor]	loop trabaja con cx. Si cx es mayor que 0, salta a la direccion 
                que le indiquemos
dec		resta uno a valor. Ej: dec cx
jnz [valor]	jnz trabaja con bx. Si bx es distinto a cero salta a valor
jcxz [valor]	si cx es cero, salta a valor. Se puede usar bx, ax....

*ah: este registro que nos aparece nuevo, indica lo que debe hacer int 21


B. Practica

La forma mas sencilla de comprender este tema es por medio de ejemplos. (UNI 
DE GUADALAJARA). Vamos a crear tres programas que hagan lo mismo: desplegar un 
nmero determinado de veces una cadena de caracteres en la pantalla.

- a100
0C1B:0100 jmp 125 ; brinca a la direccin 125H
0C1B:0102 [Enter]
- e 102 "Cadena a visualizar 15 veces" 0d 0a "$"
- a125
0C1B:0125 MOV CX,000F ; veces que se desplegara la cadena
0C1B:0128 MOV DX,0102 ; copia cadena al registro DX
0C1B:012B MOV AH,09 ; copia valor 09 al registro AH
0C1B:012D INT 21 ; despliega cadena
0C1B:012F LOOP 012D ; si CX>0 brinca a 012D
0C1B:0131 INT 20 ; termina el programa.

Por medio del comando "e" es posible introducir una cadena de caracteres en 
una determinada localidad de memoria, dada como parmetro, la cadena se 
introduce entre comillas, le sigue un espacio, luego el valor hexadecimal del 
retorno de carro, un espacio, el valor de linea nueva y por ultimo el simbolo 
$ que el ensamblador interpreta como final de la cadena. La interrupcion 21 
utiliza el valor almacenado en el registro AH para ejecutar una determinada
funcion, en este caso mostrar la cadena en pantalla, la cadena que muestra es 
la que est almacenada en el registro DX. La instruccion LOOP decrementa 
automaticamente el registro CX en uno y si no ha llegado el valor de este 
registro a cero brinca a la casilla indicada como parametro, lo cual crea un 
ciclo que se repite el numero de veces especificado por el valor de CX. La 
interrupcion 20 termina la ejecucion del programa.

Otra forma de realizar la misma funcin pero sin utilizar el comando LOOP es 
la siguiente:


- a100
0C1B:0100 jmp 125 ; brinca a la direccion 125H
0C1B:0102 [Enter]
- e 102 "Cadena a visualizar 15 veces" 0d 0a "$"
- a125
0C1B:0125 MOV BX,000F ; veces que se desplegara la cadena
0C1B:0128 MOV DX,0102 ; copia cadena al registro DX
0C1B:012B MOV AH,09 ; copia valor 09 al registro AH
0C1B:012D INT 21 ; despliega cadena
0C1B:012F DEC BX ; decrementa en 1 a BX
0C1B:0130 JNZ 012D ; si BX es diferente a 0 brinca a 012D
0C1B:0132 INT 20 ; termina el programa.

En este caso se utiliza el registro BX como contador para el programa, y por 
medio de la instruccin "DEC" se disminuye su valor en 1. La instruccion "JNZ" 
verifica si el valor de B es diferente a 0, esto con base en la bandera NZ, en 
caso afirmativo brinca hacia la direccin 012D. En caso contrario contina la 
ejecucin normal del programa y por lo tanto se termina.

Una tima variante del programa es utilizando de nuevo a CX como contador, pero
en lugar de utilizar LOOP utilizaremos decrementos a CX y comparacion de CX a 0.

- a100
0C1B:0100 jmp 125 ; brinca a la direccin 125H
0C1B:0102 [Enter]
- e 102 "Cadena a visualizar 15 veces" 0d 0a "$"
- a125
0C1B:0125 MOV DX,0102 ; copia cadena al registro DX
0C1B:0128 MOV CX,000F ; veces que se desplegara la cadena
0C1B:012B MOV AH,09 ; copia valor 09 al registro AH
0C1B:012D INT 21 ; despliega cadena
0C1B:012F DEC CX ; decrementa en 1 a CX
0C1B:0130 JCXZ 0134 ; si CX es igual a 0 brinca a 0134
0C1B:0132 JMP 012D ; brinca a la direcci&oaute;n 012D
0C1B:0134 INT 20 ; termina el programa

En este ejemplo se usa la instruccion JCXZ para controlar la condicin de salto,
el significado de tal funcion es: brinca si CX=0

El tipo de control a utilizar depender de las necesidades de programacin 
en determinado momento.


Ejercicios: En funcion de lo visto deberias ser capaz de crear un programa 
que imprima tu nombre UNA vez por pantalla. Te crees capaz?


Solucion:
Una posible solucion seria esta:

-a 100
0CAE:0100 jmp 125
0CAE:0102
-e 102 "Hola, soy x" 0d 0a "$"
-a 125
0CAE:0125 mov dx,0102
0CAE:0128 mov cx,0001
0CAE:012B mov ah,09
0CAE:012D int 21
0CAE:012F int 20
0CAE:0131
-g
Hola, soy x

El programa ha terminado de forma normal



0x07. Alguna cosilla mas

   A la hora de crackear (Si ese es el objetivo!) debes saber lo que es la pila
(donde se almacenan las cadenas) y la instruccion "cmp" esta compara dos valores
y en funcion de esto hara una cosa o no (te dejara registrarte...)

  Si te interesa este tema, te aconsejo de que busques guias que te ayuden mas
en el mundo del assambler, esto es solo el principio....

  Se me olvidaban los saltos condicionales! Pues estos hacen x cosa en funcion
de como haya ido la comparacion. Ejemplo:

CMP EAX,EBX
JE 0102

  Mande?? Si, veras: compara EAX con EBX. Estos podrian contener por ejemplo
el serial bueno y el que nosotros hemos introducido. Si son iguales (Jump if 
Equal) pues salta a 102, donde podria comenzar el cdigo que nos dice que 
estamos registrados. Esto es solo un ejemplo.

Aunque podra saltar siempre (JMP) Saltar si vale cero (JZ) si no vale cero 
(JNZ) si no son iguales... (JNE) etc etc etc. Pero esos son los mas usados.


0x08. Cracking.

A.Tecnicas de proteccion.

  Pues hay pogramas que hay que pagar para usar. Te dejan un tiempo para que 
los pruebes, y despues... se acabo. Por supuesto, no se borran, ya que ES ILEGAL
que un programa borre archivos sin la autorizacion del usuario. He aqui los 
sistemas de proteccion mas comunes (por d4rkm4st3r, numero anterior):

*******************************************************************************
*********************** Sistemas de Proteccion Por Tiempo**********************
*******************************************************************************

Los sistemas de proteccion por tiempo pueden operar de distintas formas:

*El software COMPRUEBA SI HAN TRANSCURRIDO X CANTIDAD DE DIAS desde la
instalacion del mismo, y si es asi el software procede a su salida inmediata. 
Durante la salida del software este puede mostrar algun mensaje informando al 
usuario del hecho en cuestion (The Evualuation Period has expired).

*El software COMPRUEBA SI HA LLEGADO A UNA FECHA LIMITE, si es asi procede de 
la misma manera que en el caso anterior. La diferencia esta en que el
software dejara a partir de una fecha determinada y no volvera a funcionar
si se vuelve a instalar.


*******************************************************************************
************************ Sistema de Proteccion Por Nags************************
*******************************************************************************

Este sistema no es propiamente un sistema de proteccion, sino es un sistema
para molestar al usuario del software y recordarle q debe adquirir el software
original. Estas son cuadros de dialogo q aparecen al inicio o al final de la
aplicacion y estan activos hasta q el usuario un determinado boton o se termina
una cuenta atras.


*******************************************************************************
********************* Sistema de Proteccion Por CD-Check***********************
*******************************************************************************

Este sistema de proteccion comprueba que el CD del software se encuentra en la
unidad de CD-ROM cada vez q se ejecuta. Estos sistemas no evitan q el CD sea
duplicado, lo q significa q si introducimos una copia funcionara normalmente.
Hay dos variantes de este sistema: en el primero identifica al CD-ROM mediante
la etiqueta q este posee, si el CD tiene la etiqueta esperada continua su
ejecucion. El segundo metodo se ocupa de comprobar si existe un determinado
archivo dentro del CD-ROM, si el archivo existe, continua con la ejecucion. La
dificultad de estos sistemas va aumentando cuando si necesita los datos que hay
en el CD para poder continuar.
  ***Los juegos, lo usan para que necesariamente tengas que introducir el CD, es
decir, que no baste con que te instales el juego de un amigo....



B. Atacar
   Pues el programa no se va a dejar atacar facilmente. Estas son las tecnicas 
que usara para protegerse:
*Anti-Debugging: El software usa tecnicas para detectar nuestra presencia y
evitar ser trazado (significa correr un fragmento de la aplicacion con un
debugger). Normalmente Intentara detectar la presencia de un debbuger y parar
la ejecucion del software mientras este presente.

*Encriptacion/Compresion de datos: El software utiliza tecnicas q ocultan el
verdadero codigo del programa hasta q se ejecuta, inutilizando asi cualquier
intento de desamblado del codigo.

  Para atacar un programa lo mejor es usar las cadenas conocidas
(pincipalmente mensajes de texto). Lo veras en las practicas.


C. Practicar:
   Vas a necesitar un debug (el olly, p.ej) y un editor de textos hexadecimal.
para que el editor? para cambiar los valores, esto no lo hace el debug. Para 
que el debug? para ver el programa!!

Esta leccin corre de tu cuenta. Pero, crackmes sencillios hay...
Los crackmes son programas para que la gente practique, y amplie sus 
conocimientos. Sin ir ms lejos, en el nmero anerior de SET te explican uno 
paso a paso.


C bis. Practicar
   Esto cuenta el doble. Ademas, no te quedes en este texto continua en los 
siguientes....


0x09 Despedida y Reflexion

   Si este texto llega a publicarse, se confirmara la teoria de que la "scene" 
esta en crisis. Hay gente muy buena ahi fuera que posee grandes conocimientos 
como para que se tengan que publicar cosas con un nivel... bajo (en relacion al
habitual) Cualquiera que se haya dado una vuelta por la web habra podido 
comprobar de que hablo.

   Con esto simplemente espero que nos demos cuenta (yo tambien) de que la 
scene no son solo los mas "31337", somos todos. Y en SET no solo escriben 3, 
todos los lectores pueden hacerlo (mirarme a mi...) Todos los que se quejan del
nivel: Por que no escribis? Comprendo que esteis hasta arriba de examenes 
(incluso... 4?6 meses seguidos? ) Pero... y los que escriben?
No tienen obligaciones? Viven de esto? ...
Yo, desde luego, no estoy dispuesto a dejar que una de las mejores publicaciones
que ha existido/existe se derrumbe por vagueza. Y si hace falta escribir
cosas sencillas, que reunan otros texos, se escriben. Ya iremos aprendiendo.
Pero ser solidarios, y participar (parece una campaa del Domund xD)

   Nota final: Como dije al principio es una recopilacion de textos que 
circulan libremente por internet. Que os haya servido de ayuda!


SIGNIFICA ESTO QUE LA AUDIENCIA PIDE UN NIVEL MAS SENCILLO? (la audiencia es la
que "manda", y si no escribe, es porque no entiende?)

"Alter, Glaube, Geld, Rasse... Was macht das?
(Edad, pasta, raza, religion.... Todo eso que importa?)


En fin, el caso es que espero que os haya servido
Un saludo de ThEnemI.

*EOF*