Karpoff Spanish Tutor 1999-2002

Programa:

SuperCleaner v 2.21


 

PROTECCION: limite de trabajo a 30 días
Objetivo: Obtener un número de serie válido y hacer el generador
Descripcion:
 
Dificultad: Aficionado
DOWNLOAD: http://www.southbaypc.com
Herramientas: File Inspector , SoftIce
CRACKER:
@GZRiP
  FECHA: 01/04/2002

 

 INTRODUCCION

 

NOTA: Lo que aquí se expresa es sólo con fines educativos. El divulgar conocimientos no puede hacerme responsable del uso que se le quiera dar a este material. Así que disfrutalo , destripalo y finalmente , compraló ( si puedes ).


  Hola amigos!! esta vez se trata de como muy bien indica su nombre de un programa para borrar ficheros indeseados llamado SuperCleaner v 2.21. Es bastante configurable permitiendonos además eliminar las molestas "cookies" dejadas siempre por Internet.

 

 AL ATAKE

  

Vamos como siempre a utilizar el File Inspector para saber con que nos enfrentamos.

Está hecho con Microsoft Visual C++ 6.0. Ahora vamos a la pestaña Secciones para saber si tiene algún tipo de protección anti - Desensamblado

Como veis no tiene nada que nos impida su desensamblado o el trabajar con el SoftIce así que le vamos a arrancar para ver que nos cuenta :

Vamos a intentar registrarnos para lo cual picamos sobre el botón Enter Registration con lo que nos aparece la típica ventana de registro :


Pulsamos sobre el boton Ok e inmediatamente nos comunica que como siempre nos hemos equivocado al meter nuestros datos


Carguemos el programa con el Loader del SoftIce y pongamos los Breakpoints pertinentes , yo suelo poner : " GetDlgItemTexta , MessageBoxA y GetWindowTexta " pero aunque caemos en SoftIce con GetDlgItemTexta empiezo a dar vueltas y nos consigo mucho así que utilizaré el que casi nunca falla " Hmemcpy " Cuando salte al SoftIce damos una vez en F5 para saltar el nombre y a continuación damos F12 todas las veces necesarias hasta llegar al cuerpo del programa cosa que ya nos indica el mismo SoftIce cuando en la parte inferior de la ventana de desensamblado aparece algo como SUPERCLEANER!.Text + AD17 .


0040BD19 . 8D84240801000   LEA EAX,DWORD PTR SS:[ESP+108]      <---- Caemos aquí (Nuestro número)
0040BD20 . 8D4C2408           LEA ECX,DWORD PTR SS:[ESP+8]          <---- Nuestro nombre
0040BD24 . 50                      PUSH EAX
0040BD25 . 51                      PUSH ECX
0040BD26 . E845080000        CALL 0040C570

Como veis carga en los registros EAX y ECX nuestro número y nuestro nombre respectivamente , a continuación los guarda en la pila y hace una llamada. Vamos , lo típico en una rutina de generación de un número , asi que vamos a entrar en dicha llamada con F8:


0040C570 .81EC00010000     SUB ESP,100
0040C576 .A074F14100         MOV AL,BYTE PTR DS:[41F174]
0040C57B .57                       PUSH EDI
0040C57C .88442404            MOV BYTE PTR SS:[ESP+4],AL
0040C580 .B93F000000         MOV ECX,3F
0040C585 .33C0                   XOR EAX,EAX
0040C587 .8D7C2405            LEA EDI,DWORD PTR SS:[ESP+5]
0040C58B .F3AB                   REP STOS DWORD PTR ES:[EDI]
0040C58D .8B942408010000  MOV EDX,DWORD PTR SS:[ESP+108]
0040C594 .8D4C240              LEA ECX,DWORD PTR SS:[ESP+4]
0040C598 .66AB                   STOS WORD PTR ES:[EDI]
0040C59A .51                       PUSH ECX
0040C59B .52                       PUSH EDX
0040C59C .AA                      STOS BYTE PTR ES:[EDI]
0040C59D .E8AE000000        CALL 0040C650              <---- Rutina que genera número de serie
0040C5A2 .8B8C241401000   MOV ECX,DWORD PTR SS:[ESP+114]
0040C5A9 .83C408               ADD ESP,8
0040C5AC .8D442404            LEA EAX,DWORD PTR SS:[ESP+4]
0040C5B0 .50                       PUSH EAX
0040C5B1 .51                       PUSH ECX
0040C5B2 .FF15F8914100     CALL DWORD PTR DS:[]
0040C5B8 .F7D8                   NEG EAX
0040C5BA .1BC0                   SBB EAX,EAX
0040C5BC .5F                       POP EDI
0040C5BD .40                       INC EAX
0040C5BE .81C400010000     ADD ESP,100
0040C5C4 .C3                       RET


Después de ejecutar con F10 la rutina que genera el dichoso numerito vemos que ha variado el registro EAX por lo que haciendo un sencillo D EAX obtenemos el número de serie válido para el correspondiente nombre que yo he metido. En este caso 720-xxxxx-yyy-zzzz.
¿ Porqué digo esto ? es facil averiguar que lo genera siempre en función del nombre que se introduce , ¿ como? pues entrando en dicha rutina y trabajando en ella .

Primera parte del número :

Nombre
ASCII
Operación
Número "X"
Parcial
Total
@
64
+
38
102
102
G
71
+
38
109
211
Z
80
+
38
118
329
R
82
+
38
120
449
i
105
+
38
143
592
Z
90
+
38
128
720



Como veis ya hemos descubierto de donde saca la primera parte del número. Coge el valor ASCII de cada uno de los caracteres introducidos como nombre ( espacios incluidos ) los va sumando uno a uno a un número que en esta tabla yo he llamado Número "X" que es dado por el programa ( 38 en este caso ) y luego va sumando los distintos resultados.
Aún nos quedaría por encontrar las otras 3 partes del número de série válido , pero eso ya lo dejo para que lo hagais vosotros , os aseguro que es bastante facil el ver como lo hace solamente teneis que ir siguiendo el código .
Bueno pues vamos a meter el número encontrado para ver si efectivamente nos registra , como veis no nos dice en absoluto si hemos acertado o fallado , pero si cerrais el programa y volveis a arrancarlo ya no saca la primera pantalla donde nos pedia registrarnos y nos decia cuantos dias de prueba quedaban .
Por último solo nos queda ver en donde guarda dicho registro , lo localizamos en :

HKEY_CURRENT_USER\Software\SuperCleaner\Registration

Code          720-xxxxx-yyy-zzzz
Name         @GZRiP

Por descontado si borramos las claves volveremos a estar con el programa sin registar.

 

Generador de claves



Private Sub Generador_Click()
Dim user_name As String
Dim L As Integer, x As Integer
Dim key1 As Double, key2 As Double, key3 As Double, key4 As Double
user_name = Text1.Text
L = Len(user_name)
x = 0
key1 = 0
key2 = 0
key3 = 0
key4 = 0
For x = 1 To L
user_name = Asc(Mid$(Text1.Text, x, 1)) + 38
key1 = key1 + user_name
user_name = Asc(Mid$(Text1.Text, x, 1)) * xx ´El número xx lo teneis que descubrir , lo siento
key2 = key2 + user_name
user_name = Asc(Mid$(Text1.Text, x, 1)) + yy ´El número yy lo teneis que descubrir , lo siento
key3 = key3 + user_name
user_name = Asc(Mid$(Text1.Text, x, 1)) * zz ´El número zz lo teneis que descubrir , lo siento
key4 = key4 + user_name
Next x
For x = 1 To L
If Asc(Mid$(Text1.Text, x, 1)) > 126 Then ´Al utilizar la función ADD que no tiene en cuenta el acarreo da errores si pasamos de códigos mayores de 126
MsgBox "Nombre no válido , sólo números y letras sin acentuar, vbExclamation"
Text2.Text = ""
Exit For
Else
Text2.Text = CStr(key1 & "-" & key2 & "-" & key3 & "-" & key4) 'Visualizamos el Serial
End If
Next x
End Sub
__________________________________________________________________________________
Private Sub Exit_Click()
End
End Sub
__________________________________________________________________________________

CONCLUSIONES

Espero que lo hayais entendido , he de reconocer que me cuesta bastante más el hacer el tutorial en sí que desproteger el programa , cada día me parece más " coñero " esto del HTML. Como siempre si quereis preguntarme algo me encontrareis aquí : @GZRiP . Un abrazo.

 

Karpoff Spanish Tutor: Pagina dedicada a la divulgacion de informacion en Castellano, sobre Ingenieria Inversa y Programacion. Email "Colabora con tus Proyectos"
www.000webhost.com