   ______   ______   ______   ______   ______   ______   ______   ______
  |  ____| |  ____| |  ____| |  ____| |  ____| |  ____| |  ____| |  ____|      
__| |______| |______| |______| |______| |______| |______| |______| |________
----------------------------------------------------------------------------
Codigo     Titulo                                                Autor
SWP05-04   Cracking Para Novatos I                               Silvermage
----------------------------------------------------------------------------


Introduccion

Bueno este  Manual de Cracking para novatos esta creado  para persona  que no
tienen ningun conocimiento de ingineria inversa o Cracking, tratare de ser lo
mas  claro  posible  cualquier  consulta ahi tiene  mi e-mail, espero  q este
trabajo le sea de utilidad.


1)	Recomendaciones
2)	Mentalidad crackear 
3)	Herramientas + breve descripcion
4)	Conversiones Numericas
5)	Lo + necesario de Asm (ensamblador) para Cracking
6)	Primera Practica de Cracking
7)	Soluciones a nuestra Primer Practica


1)  Recomendaciones :
    ---------------

- Bueno  la  primera  recomedacion  es  tratar  de  juntar  todas  las  tools
  necesarias  para Cracking  al  menos las  que  se vayan  a  usar para  cada
  programa dado.

- Tambien Seria buena  idea que tenga algun  conociento  de Asm (Ensamblador)
  ya  cada pc  interpreta los  programas que  se ejecuten  en ella  el lengua
  asm...  explicado mejor  nosotros  desarrollanos  un programa  en Cualquier
  lenguaje de Programacion  Sea Visual Basic, delphi, c++,etc.  al momento de
  ser compilado las sentencias escritas en nuestro programa el compilador  se
  encarga de transformarlo en asm para que nuestra pc la pueda enteder .. por
  eso seria muy buena idea saber algo de asm.

- Ponerle el maximo de  ganas y aprender no quedar con dudas  y sobre todo no
  leer por leer los tutoriales lo importante es Entender y aprender.



2) Para Que Crackear :
   -----------------

En la actualidad  los desarrolladores de Software o  mejor decir las empresas
que  distribuyen algun  software son  un  tanto inconcientes  al costear  sus
productos,  nadie le  dice que  no pongan  el valor  monetario que  mejor les
paresca pero  que sean un  poco concientes ya  que nadie asi nomas  tiene por
ejemplo  250 dolares  para comprar  windows original?  , es  mas como  lo que
estamos de  alguna u otra  forma relacionados con  una pc nos vemos  un tanto
supeditados a pagar el precio que le pida. 

Cracking  es una  forma de  que  los programas  sean accesibles  a todas  las
personas que no tengan la posibilidad de pagar el precio dado. Ademas otro de
los principales motivos para Crackear  tambien es para los programadores. Asi 
podremos  ense~arles que  sus  programas  no son  perfectos  y tienen  muchos
errores  tontos  que podrian  corregirlos.  Y  tambien  ense~arles a  no  ser
perezosos y crear buenas protecciones. 



3) Herramientas +Breve descripcion:
   -------------------------------

* Debugger  o  Depuradores:  Son  programas  que permiten  ir  deteniendo  el
programa en cada proceso que deseamos, es decir un programa es un conjunto de
instrucciones que hacen  uno u otro procesos, lo que  hace los depuradores es
detener el  programa en algun proceso  que desemos por ejemplo  el proceso de
generado de un Serial.

Los principales Debugger o Depuradores :

- SoftIce	: es el mas popular y el mas usado.
-OllyDbg	: Excelente Debugger con interfaz Windows.
-Trw		: Bueno tambien (parecido al SoftIce).



* Desensamblador : estos programas nos  muestra el codigo (de otros programas
hechos en otros lenguajes a ensamblador la diferencia con los Debugger es que
un programa Desemblado nos muestra el  Codigo muerto de los exes el decir los
codigos de los programas pero sin estar en ejecucion. 

 Los Principales Desensambladores:


 - W32dasm   : 	 desensambla programas  C++ .
 - DeDe	  : desensambla  programas Hechos en Delphi.
 - Smartchek  : desensambla programas  Vb.
 - IDA pro       : ----------------------------------

* Editor  Hexadecimal :  bien,  una  vez  que  tenemos  los  cambios a  hacer
ubicados no preguntamos ahora como aplicamos  los cambios en el exe original? 
Bueno para esto sirven los Editores Hexadecimal que permite cambiar al exe el
forma Hexadecimal (en el punto 4  se ense~ara  a hacer cambios de Hexadecimal
a decimal y a binario ) 

    Lo Principales Editores Hexadecimal :

    - HexaWorkshop :  el que uso yo y es muy bueno.



4)  Conversiones Numericas:
    ----------------------


Todos  los mortales  comunes  y  corrientes contamos  en  el sietema  decimal
Es decir (0 1 2 3 4 5 6 7 8 9) este sistema no es la que aplica las pcs , las
pc solo conoce el sistema binario trabaja con tal (0 1) donde 1= Verdader 0 =
falso.

*Sistema decimal
	Base =10

*Sistema binario
	Base  =  2	

*Sistema octal
	Base = 8

*Sistema Hexadecimal
	Base = 16


Base 10	 	Base 2		Base 8 		Base 16

0	 	0		0  =  000	0= 0000
1		1		1  =  001	1= 0001
2				2  =  010	2= 0010	
3				3  =  011	3= 0011
4				4  =  100       4= 0100			
5				5  =  101	5= 0101			
6			   	6  =  110	6= 0110	
7				7  =  111	7= 0111
8						8= 1000
9						9= 1001
  						A =   10= 1010
   						B =   11= 1011
   						C =   12= 1100
   						D =   13= 1101
                                              	E =   14= 1110
    						F =   15= 1111



* Conversion de base 10 a base 8

	38    -->   ? (8)	


38/8 = esta division daria como resultado 8*4 =32 y tendriamos como residuo 6

donde: 
	
	4= Cociente
       	6= Residuo
	

El resultado  de la  divison se lee  en el  orden de Cociente  hacia Residuo,
entonces quedaria asi: 


38 en base decimal  = 46 en base octal


* Conversion de base 10 a base 2

	38    -->   ? (2)	

38/2 conciste en hace multiples divisiones entre 2

38/2 = daria Cociente 19 Residuo 0
19/2 = daria Cociente 9  Residuo 1
9/2  = daria Cociente 4  Residuo 1
4/2  = daria Cociente 2  Residuo 0
2/2  = daria Cociente 1  Residuo 0

La forma los resultados se ordenarian de la Siguiete forma:
El ultimo cociente  + los Residuos de ultima hasta el primero, quedaria asi
el ejemplo:

100110

38 en base decimal  = 100110 en base Binario


* Conversion de base 2 a base 10


    	1010.01   -->    ? (10) 		
						*  =  Signo de Multiplicacion
						^  =  Signo o de potencia


	1*2^3     +     0*2^2   +   1*2^ 1   +   0*2^0     .    0*2^-1    +    1*2^-2

 
Analicemos : cada numero en base2  lo multiplicamos por 2 y apartir del punto
hacia  la  derecha  empezamos  elevando  -1 ,-2  ,-3,-4  .......  y hacia  la
izquierda de 0 en adelante 0,1,2,3,4,5,6...... 

efectuando la operacion Anterior quedaria asi:


		8+2+1/4   seria igual a  10+0.25 Final seria 10.25


		1010.01  en base 2 seria igual a 10.25 en base 10



* Conversion de base 2 a base 8


		1010010.101111   -->     ? (8)


	Para  hace  esta  conversion  se  usa  la  tablita  que  diagrame  al
	inicio  de la seccion de conversiones numericas mira arriba J (base8)


		OO1   010    010   .   101   111
                    	    <-  .  ->


	Vamos tomando  digitos de 3 en 3 y si faltan los rellenamos con ceros
	el resultado del ejemplo seria este:

								001 =1	
	1010010.101111    en base 2 en base 8 Seria 122.57   	010 =2	
								010 =2
								101 =5
								111 =7


	

* Conversion de base 2 a base 16


	 1010010.101111    -->   ? (16)


	Para hace esta conversion se usa la tablita que diagrame al inicio de
	la seccion de conversiones numericas  mira arriba  (base16)

 			    O101 0010   .   1011 11OO
                                    <-  .  ->


	Vamos tomando  digitos de 4 en 4 y si faltan los rellenamos con ceros
	el resultado del ejemplo seria este:


	1010010.101111    en base 2 en base 16 Seria 52BC


	Para convertir un numero de hexadecimal a binario solo es necesario
	invertir estos pasos.  


5) Lo + necesario de Asm (ensamblador) para Cracking:
   -------------------------------------------------

Bueno asumo que ninguno de ustedes  que leen este manual saben Ensamblador de
ahora en  adelante lo  llamare Asm ,  y para  los que ya  sepan asm  bien por
ustedes, bueno explicare lo mas necesario : 

* Registros

	EAX: se le llama 'acumulador' puesto que es en el donde se situan los
 	     resultados de  operaciones como DIV y  MUL. Su tama~o,  es de 32
 	     bits. Puede  dividirse en dos  sub-registros de 16 bits,  uno de
 	     los cuales (el menos significativo,  o sea, el de la derecha) se
 	     puede  acceder  directamente  como   AX.  Asu  vez,  AX  podemos
 	     dividirlo en dos sub-sub-registros de 8 bits, AH y AL.
	
	EBX:  Aqui  sucede  lo  mismo   que  con  EAX;  su  division  incluye
             subregistros BX (16 bits), BH y BL (8 bits).
	
	ECX: Aunque este registro es como  EAX Y EBX (con divisiones CX, CH y
             CL), tiene una funcion especial  que es la de servir de contador
             en bucles y operaciones con cadenas.
	
	EDX: Podemos dividir este registro 'generico' en DX, DH y DL; ademas,
	     tiene la  caracteristica de  que es aqui  donde se va  a guardar
	     parte de los resultados de algunas operaciones de multiplicacion
	     y division (junto  con EAX). Se le llama  'puntero de E/S', dada
	     su implicacion tambien en acceso directo a puertos. 

	EIP :  este es el PC  (Program Counter) o Contador  de Programa. Esto
              es, que en este registro de  32 bits (que no puede ser accedido
              por metodos  normales) se almacena  la direccion de  la proxima
              instruccion que va a ejecutar el procesador. Existe tambien una
              subdivision como 'IP' con sus 16 bits menos significativos como
              con EBP,  EDI, etc, pero no lo  vamos a tener en  cuenta; en un
              sistema como Linux o Windows se va a usar la combinacion CS:EIP
              para  determinar lo  que hay  que ejecutar  siempre, y  solo en
              sistemas antiguos como MS-Dos se utiliza el CS:IP para ello.

        ESI : Se trata de un registro  de 32 bits algo mas especifico, ya que
       	      aunque tiene  el sub-registro SI  (16 bits) refiriendose  a sus
       	      bits  0-15, este  a su  vez  no se  divide como  lo hacian  los
       	      anteriores  en sub-sub-registros de  8 bits.  Ademas, ESI  va a
       	      servir para algunas  instrucciones bastante utiles que veremos,
       	      como LODSX, MOVSX y SCASX (operando origen siempre)

	ESP :  Trata del registro  de pila, indicando  la direccion a  la que
              esta apunta. 



* Aqui  tienen  los  principales saltos  condicionales e  incondicionales del
  ensamblador: 


Hexadecimal	Assembler	Significa

75 o 0F85	jne	        Salta si no es equivalente
74 o 0F84	je	        Salta si es equivalente
EB	        jmp		Salta directamente a . . .
90		nop		( No OPeration ) Sin operacion
77 o 0F87	ja		Salta si esta sobre
OF86		jna		Salta si no esta sobre
0F83		jae		Salta si esta sobre o igual
0F82		jnae		Salta si no esta sobre o igual
0F82		jb		Salta si es inferior
0F83		jnb		Salta si no es inferior
0F86		jbe		Salta si esta debajo o igual
0F87		jnbe		Salta si no esta debajo o igual
0F8F		jg		Salta si es mayor
0F8E		jng		Salta si no es mayor
0F8D		jge		Salta si es mayor o igual
0F8C		jnge		Salta si no es mayor o igual
0F8C		jl		Salta si es menor
0F8D		jnl		Salta si no es menor
0F8E		jle		Salta si es menor o igual
0F8F		jnle		Salta si no es menor o igual


Adicional

	Cmp  sirve para Compara registros 
 	ejemplo
	:0040E827 3BC6 cmp eax, 01 Compara EAX como 01
	:0040E82A  0F85AF000000 jne  0040E8DF  si son  equivalentes salta  a
 	 0040E8DF 


6-7) Practica y Soluciones:
     ---------------------

Software: crackme Zebra 1.1 (esta adjunto swp05-04_files/zebrone.zip)
Herramientas: W32Dasm
	
Lo primero  q siempre se debe  hacer es analizar el  exe para ver  si no esta
empacado y sabes en que esta hecho  el Software (es muy util para saber  cual
de la  herramientas vamos a aplicar) en  este caso no es  necesario porque el
crackme no esta empacado ni protegido con alguna tecnica an-cracking.

Empecemos :

Abramos el W32Dasm y veremos algo asi


[ Visualizar archivo 'img 01.jpg']


Vayamos a  Disassenmbler/ Open  File to Disassenmbler  elegimos el  crackme y
esperamos  que el  W32dasm lo carge una vez que termino  de cargar hacemos lo 
siguiente:


[ Visualizar archivo 'img 02.jpg']


Presten mucha  atencion a el  boton STRN Ref  si pensamos un poco  el crackme
para mostrarnos  ese mensaje de error  en el serial necesita  esas cadenas de
texto, bueno el w32dasm y su boton  STRN Ref te muestra esas cadenas de texto
para  apartir de  alli analizar  el exe.  Presionando el  boton STRN  Ref nos
muestra esta ventana: 


[ Visualizar archivo 'img 03.jpg']


Y como les decia, allii estan las  cadenas de texto que usa el crackme. Ahora
denle click sobre Sorry... The Serial isn't correct y el w32dasm nos mostrara
este trozo de codigo:
                                  |
	:004012C5 E8E2010000              Call 004014AC
	:004012CA 8D45F6                  lea eax, dword ptr [ebp-0A]
	:004012CD 50                      push eax
	:004012CE 8D45EC                  lea eax, dword ptr [ebp-14]
	:004012D1 50                      push eax
	:004012D2 E873000000              call 0040134A
	:004012D7 83C408                  add esp, 00000008
	:004012DA 09C0                    or eax, eax
	:004012DC 7416                    je 004012F4  <- este es el Condicional q buscamos 							  Cabiemos 74  x 75
	:004012DE 6A00                    push 00000000

	* Possible StringData Ref from Data Obj ->"Great !!!"
                                  |
	:004012E0 6826324000              push 00403226
	
	* Possible StringData Ref from Data Obj ->"Congratulations, you have cracked "
	                                        ->"the Zebra Crackme ver 1.1"
                                |
	:004012E5 6830324000              push 00403230
	:004012EA FF7508                  push [ebp+08]

	* Reference To: USER32.MessageBoxA, Ord:018Ah
                                 |
	:004012ED E8C6010000              Call 004014B8
	:004012F2 EB14                    jmp 00401308

	* Referenced by a (U)nconditional or (C)onditional Jump at Address:
	
	|:004012DC(C)
	|
	:004012F4 6A00                    push 00000000

	* Possible StringData Ref from Data Obj ->"Hmmmm :P"

	:004012F6 68F8314000              push 004031F8

	Possible StringData Ref from Data Obj ->"Sorry... The Serial isn't correct " <-Caemos Aca

	La  idea  es buscar el Condicional q  decide hacer o no  el salto (de
 	eso depende si el serial es valio o no).


	* Aplicando los Cambios en el HexaWorkshop


[ Visualizar archivo 'img 04.jpg']


Vamos a File/Open y cargamos el crackme. Presionamos Control+G y colocamos el
offset donde  se van realizar los  cambios en este  caso el offset es  6DC. Y
vemos esto: 


[ Visualizar archivo 'img 05.jpg']


Vemos en la imagen Superior el Byte a Original 74 debemos cambiarlo por un 75
para que  acepte cualquier serial  como valido... reemplacen normal  el 74x75
quedaria asi: 


[ Visualizar archivo 'img 06.jpg']


Ahora File/save  (guardamos el cambio hecho)

Listo  ya esta crackeado  


Silvermage
www.Silvermage.da.ru
www.Silvermage.pe.kz
Silvermage@Linuxmail.org


   ______   ______   ______   ______   ______   ______   ______   ______
  |  ____| |  ____| |  ____| |  ____| |  ____| |  ____| |  ____| |  ____|      
__| |______| |______| |______| |______| |______| |______| |______| |______
--------------------------------------------------------------------------

                      --                             --
			 Security Wari Projects / SWP  |
		      (c) Todos los Derechos Reservados
		     |     PERU / 2002 - 2004           
                      --                              --
