Karpoff Spanish Tutor

Cracking desde cero para súper newbies 4

 

LOS TERRENOS DEL SOFTICE

Dek_Oin   FECHA: 22/10/2000

 

 INTRODUCCION

    Saludos a todos!!!!. Como les va?. Después de un bien merecido período de descanso vuelvo a estar activo para escribir este tutorial. Desde ahora, olvídense de JE a JNE o EB. Supongo que ya aprendieron todo eso y que lo hacen bien. Ahora la cosa se complica aunque con la práctica todo se vuelve
fácil. Aprenderemos a utilizar una herramienta completamente nueva para ustedes. Empezaremos con el Soft Ice, desde ahora en adelante le llamaremos SiCE ok?. Basta de introducciones y a trabajar.


 

 AL ATAKE

No hablaremos acerca de la configuración del SICE o del Winice.dat ya que esos temas los vimos en el manual número 1.Estos son los temas que se tratarán a lo largo de este manual:

 

Temas que trataremos

 

 

1) Descripción

2) Utilización básica

       2.1) Teclas de funciones

       2.2) Break Points

       2.3) Break Points on Memory Access

       2.4) Comandos para manejar los Break Points

       2.5) Comandos para ver los procesos en ejecución

3) A buscar un serial !!!

4) Despedida

1) Descripción

        Se podría definir como un programa creado para identificar los errores lógicos de los otros programas (bugs) y proporcionar medios para repararlos. Los debuggers o depuradores son utilizados al mismo tiempo en que el programa está ejecutándose con el fin de facilitar la obtención de información relativa a los procesos mientras estos están teniendo lugar. Un buen depurador debe disponer de opciones para mostrar el contenido de la memoria y de los registros, e incluso para modificarlos, y para provocar la ejecución de rutinas durante la presentación de datos importantes que faciliten el diagnóstico de fallos.

       

2) Utilización básica

         El SiCE aparecerá si pulsamos las teclas ctrl+d, estas teclas están predeterminadas por defecto. No podríamos decir que se ejecuta cuando presionamos estas teclas ya que el SiCE está siempre monitoreando los procesos que se ejecutan en la PC, es decir, si lo tenemos cargado en el autoexec.bat, siempre que usemos la computadora estará ejecutándose, pero si creamos un bat y tenemos que reiniciar la PC para cargar el SiCE éste se ejecutará en el momento que se cargue el bat. Si abren el SiCE, notarán que hay un montón de cosas, números que seguro que les son familiares (nuestro querido ensamblador) y números que no les son familiares. Notarán también que el SiCE está dividido en ventanas. Cada uno de ustedes pueden tener o más o menos ventanas según como las tengan configuradas. Les pueden cambiar el tamaño, las pueden quitar y pueden hacer alguna que otra cosilla más con las ventanas.

 

2.1) Teclas de funciones

 

A continuación, les doy las teclas que utilizaremos y su función:

F1<----------------- Ayuda

F2<----------------- Activa la ventana de registro

F4<----------------- Muestra como va todo fuera del SiCE en ese instante pero sin salir de él. Es como que "minimizamos" el SiCE. Se vuelve al SiCE con F4 también. Podremos ver como está Windows pero solo como una foto. No podremos hacer nada, ni siquiera mover la flechita.

F5<---------------- Salir del SiCE. Más precisamente hace que el programa que estemos monitoreando corra normalmente hasta que se tope con algún breakpoint que hallamos puesto anteriormente. Es igual que presionar Ctrl+ D.

F8<---------------- Ejecutamos el programa paso a paso (esto es tracear) entrando en los procesos.

F10<-------------- Igual que F8 pero sin entrar en las call. Se las salta hasta que llegue a un ret (retorno).

F11<-------------- La utilizo igual que F12

F12<-------------- Nos retorna al punto en donde ha terminado una call. Por ejemplo ponemos bpx (breakpoint) por ejemplo en la API de la User32.dll MessageBoxA el programa hace la llamada con call MessageBoxA y la llamada termina en la User32.dll ya que ahí está la MessageBoxA. Lo que siempre se hace es presionar F12 o F11 para ir al punto del programa que hizo la llamada a esa API. Lo veremos más abajo en la práctica.

G<---------------- Pulsando G, nos vamos directamente a una dirección de memoria, ejemplo: G 0054545, nos vamos a esa dirección

Traten de memorizarse estas teclas para que cuando usen el SiCE las cosas les queden más claras. Es fácil, no son tantas así que no se quejen.

 

2.2) Break Points

        Esto es una de las cosas más importantes que tiene el SiCE. Sin esto, no podríamos descubrir ningún número de serie válido ni nada de eso sin los Break Points. Recuerdas que el SiCE (cuando lo teníamos cargado) estaba permanentemente monitoreando los demás programas en ejecución. Pues un Break Point (o punto de ruptura) es una instrucción que le damos al SiCE para que detenga la ejecución de un programa en el momento que éste llama a una API de una dll. Recuerdas todo lo de las dll supongo, no?. Recuerdan que el programa tenía que recurrir a las API de las dll para ejecutar distintos tipos de procesos como la muestra de un mensaje que diga "Invalid serial number". Esto se debe a alguna función API que el programa desde un determinado lugar del código (podrían ser MessageBoxA de la user32.dll o Getdlgitemtexta también de la User32.dll). Después de haber detenido el programa en ese lugar del código tracearemos hasta encontrar nuestro número de serie válido, o el salto a parchear, etc. 

        Ya sabemos que son los Break Points, ahora debemos saber como ponerlos. Es mucho más fácil de lo que creen, simplemente tienen que escribir bpx xxxxxxxxx. Las x serían la función en la que queremos poner el Break Point o la dirección de memoria!!!(de ahora en más, a los Break Points les llamaremos bpx, ok?). Por su no en

        Abren el Paint, hacen algún cambio y les aparece el mensaje de ¿Desea guardar los cambios?, se debe a la API de MessageBoxa de la User32.dll. Pero esta no es la única que hay, es común pero igualmente lo son GetWindowTextA de la User32.dll, GetDlgitemTexta también de la User32.dll, y demás.

Aquí, una lista de los BPX más usados:

 

Propósitos generales
bpx hmemcpy
bpx MessageBox
bpx MessageBoxExA
bpx MessageBeep
bpx SendMessage
bpx GetDlgItemText
bpx GetWindowText
bpx GetWindowWord
bpx GetWindowInt
bpx DialogBoxParamA
bpx CreateWindow
bpx CreateWindowEx
bpx ShowWindow
bpx UpdateWindow
Relacionadas con el TIEMPO
bpint 21 if ah==2A (DOS)
bpx GetLocalTime
bpx GetFileTime
bpx GetSystemtime
Acceso al Disco Duro y CD Rom
bpint 13 if ah==2 (DOS)
bpint 13 if ah==3 (DOS)
bpint 13 if ah==3 (DOS)
bpx GetFileAttributesA
bpx GetFileSize
bpx GetDriveTypeA
bpx GetLastError
bpx ReadFile
bpio -h (La dirección del puerto de tu CD-ROM) R
Relacionadas con archivos
bpint 21 if ah==3dh (DOS)
bpint 31 if ah==3fh (DOS)
bpint 21 if ah==3dh (DOS)
bpx ReadFile
bpx WriteFile
bpx CreateFile
bpx SetFilePointer
bpx GetSystemDirectory
Relacionadas con Ficheros INI
bpx GetPrivateProfileString
bpx GetPrivateProfileInt
bpx WritePrivateProfileString
bpx WritePrivateProfileInt
Relacionadas con el REGISTRO
bpx RegCreateKey
bpx RegDeleteKey
bpx RegQueryValue
bpx RegCloseKey
bpx RegOpenKey

Extraído del tutorial de Profesor X, con algunas modificaciones adaptándolo a su nivel.

        Por ahora, deben saber los del tiempo, los del acceso al disco duro y al CD (los de Windows claro) y todos los que puedan sobre los propósitos generales, que en su mayoría sirven para mostrar ventanas. Por supuesto que todas estas son las funciones API que más utiliza un programa. Obvio que hay muchas más (las API son más de 2000) pero básicamente estas son las más que nos sirven. Hay otra función que personalmente no la conocía hasta hace poco, se llama EnableMenuItem. Esta API de la user32.dll es muy útil para los programas que tienen funciones restringidas como el botón para introducir el número de serie. Esto también se puede hacer con programas como The Customiser, pero los cambios se realizan en la memoria, como en el SiCE, y al cerrar la ventana y volverla a abrir ya no nos guarda los cambios. Por eso es útil utilizar EnableMenuItem para hacer los cambios permanentemente (utilizando un editor hexadecimal por supuesto). También hay otras como ModifyMenu o CheckMenuItem pero creo que esta es la más común. De todas maneras las menciono para que sepan que existen, por ahora no pueden usarlas ya que hay que tener un domino absoluto del SiCE para no estar pegado a un manual.

2.3) Break Points on memory access

        Los breake points on memory acces son iguales que los bpx. La diferencia que tienen (como su nombre lo indica) es que no se pone un punto de ruptura cuando un programa llama a una API, sino que se pone un break point en el acceso o en la lectura de una dirección de memoria. No se ponen con bpx, sino que con bpm. No se puede poner por ejemplo bpm messageboxa ya que , solo se pueden poner bpm en direcciones de memoria.

        Pero... habíamos dicho que se podían poner bpx en direcciones de memoria, ¿cual es la diferencia entre poner un bpx en una dirección de memoria y poner un bpm?

        Pues que al poner un bpx estaríamos accediendo al lugar en que el programa "llama" a esa dirección de memoria y poniendo un bpm estaríamos accediendo al lugar en donde el programa accede o lee a esa dirección de memoria. Fácil no?. Al poner por ejemplo bpm 0054876 le estaríamos diciendo al SiCE que se pare cuando el programa lea esa dirección de memoria y no que se detenga cuando la escriba (o sea que la modifique por ejemplo introduciendo nuestro número de serie válido).

        Para indicarle al SiCE que queremos que pare cuando el programa escriba en la dirección de memoria se le pone una W al final del bpm que hayamos puesto. Ejemplo: bpm 0068954 W. Aquí le estaríamos indicando al SiCE que salte cuando el programa escriba en esta dirección de memoria, la puede leer y sacar datos de ella un millón de veces pero el SiCE no saltará.

2.4) Comandos para manejar los break points

 

        Aquí abajo la abreviatura bpx se refiere a todos los que hay ya sean bpx en APIs, bpm, bpio (para las mochilas), etc.

Para manipular los bpx:

BL: nos da una lista de todos los bpx, el orden es desde el cero en adelante.

BC: borrar bpx. Escribimos bc0 y nos borra el primer bpx que pusimos. Si ponemos bc1 nos borra el segundo. Pero lo que más usaremos (por lo menos lo que más uso yo) es el comando bc*, el cual nos borrará todos los bpx que hayamos puesto.

BD: desactivará el bpx que indiquemos. Igual que bc. Bc0 , desactiva el primer bpx que hayamos puesto. Se desactivan todos igual que antes, escribiendo bd*.

BE: Activa un bpx. Ni explico porque es igual que los otros.

 

2.5) Comandos para ver los procesos en ejecución

        ¿Recuerdan que el SiCE era un depurador?. ¿Y para que fueron creados los depuradores originalmente? (no fueron creados para crackers que buscan un número de registro válido). Los depuradores fueron creados para descubrir errores en los programas, y para eso es necesario poder ver los procesos en ejecución. A continuación, los comandos para manejarlos:

D EAX (u otro registro o dirección de memoria)<----muestra el contenido de lo que hayamos marcado en la ventana de datos.

La ventana de datos es igual a la que ven en el editor hexadecimal, pero en el SiCE. Muchas veces veremos ahí nuestros números de serie válidos.

? EAX(u otro regustro o dirección de memoria)<---- nos muestra el valor que hayamos marcado en la línea de comandos

        Ante cualquier duda que pueda haber con las ventanas he hecho este esquema de ellas ya que no se como conseguir una foto verdadera:

 

 

Así es como tengo configuradas las ventanas del SiCE. Recuerden que las ventanas del SiCE son altamente configurables y que podemos cambiarles la altura, desactivarlas, el ancho, etc. No voy a explicar todo esto porque sino el tutorial se vuelve muy largo pero si quieren saberlo, pueden leer el tutorial de SiCE de Black Fenix, que explica exhaustivamente todo esto de las ventanas y en definitiva la utilización básica del SiCE. Este manual que están leyendo les puede servir de una introducción para entender mejor el otro y para saber lo que hacemos cuando vayamos a utilizar por primera vez esta herramienta para conseguir un número de serie válido un poco más abajo.

 

A buscar un serial !!!

        Después de esta introducción al SiCE creo que ya pueden más o menos manejarse con él y poder encontrar un serial válido. Aquí van los detalles de nuestra Víctima:

 

Víctima: Stay Connected! v 3.0
URL: ftp://zdftp.zdnet.com/pub/private/sWlIB/internet/internet_tools/stycon.zip
Descripción: Evita que el servidor te desconecte de internet después de un tiempo estando inactivo
Tamaño del ejecutable: 776 kb
Tipo de Protección: Serial
Método de ataque Depurar
Objetivo Extender el período de prueba
Dificultad Newbie - Aficionado - Avanzado - Experto - Élite
Herramientas  Soft Ice
Fecha: 28/9/2000

  Les recomiendo que se familiaricen con el SiCE antes de seguir con esta parte. Prueben, pongan por ejemplo un bpx en messageboxa, abran el Paint hagan algo y luego salgan. Verán que el SiCE saltará inmediatamente y podrán observar (apretando F12) el lugar en el que se hizo la llamada a esa API dentro del código del programa.

        El programa que elegí es un programa que evita que el servidor que te conecta a Internet, te desconecte después de un tiempo estando inactivo. Lo que me pareció raro es que el código que encontraremos, no nos servirá para registrar el programa, sino que servirá para extender el período de prueba. De todas maneras, elegí este programa, por la facilidad con que podemos encontrar un número válido aunque no nos servirá para registrarnos. El límite de tiempo, se los dejo a ustedes, háganlo con el W32Dasm y el editor hexadecimal. Yo ni siquiera lo probé, talvez lo haga pero en principio se los dejo a ustedes.

        Ejecutemos el programa, hmmm, cuando empezamos ya nos aparece algo como "Unregistered evaluation copy". El programa está en la barra de tareas del menú inicio. Pongan la opción para introducir un número de serie:

Hasta ahora todo bien. Llenemos los datos que nos piden, yo lo haré como se muestra en la imagen:

Muy bien. Ahora pulsamos "Aceptar", y como era de esperar, nos aparece el mensaje de "Wrong registration code!". Pensemos. Para mostrar este mensaje el programa tiene que haber llamado a una API, seguramente la user32.dll. Y si ponemos un bpx para que el SiCE detenga al programa cuando llame a esa API?. Pero recuerden que el programa debe llamar la función que que nos muestra el mensaje por alguna razón. O sea que si podemos ver los alrededores del código que llamó al mensaje de error, podremos encontrar la comparación del serial que introducimos con el correcto.

        Sin esperar más ponemos un bpx. Pero que bpx???. Lo que podemos hace es poner varios a ver cual cae. Como varias veces me ha pasado que no cae ninguno, podemos usar la API que cae el 99,9% (más bien diría 100%, nunca me falló), HMEMCPY. Hmemcpy es una API de la kernell32.dll. Esta API utiliza la memoria RAM para leer, manipular, comparar y almacenar strings (el texto que has introducido en un programa). La función toma la información que has escrito los pone en la memoria. Luego manipula los strings moviendo y comparándolos (por ejemplo, comparando tú número de serie al correcto), y entonces decide si tu string es correcto o incorrecto. Luego HMEMCPY devuelve la información obtenida a la aplicación y luego salta el mensaje de "Gracias por registrarse" o el de "Mal!". La desventaja que tenemos con esta función es que es mucho más difícil encontrar la comparación de los dos seriales ya que no caemos en un lugar determinado del código, y la ventaja es que pica casi siempre.

        Antes de usarla hay que probar con otros bpx así que pulsamos [Ctrl+D], y ponemos tres bpx, bpx messageboxa, bpx Getdlgitemtexta y bpx getwindowtexta. De nuevo [Ctrl+D] o F5 o [X+Enter] para volver a Windows y ahora pulsamos "Aceptar". Que bien!!!, directamente al SiCE. El bpx que pico fue GetWindowTexta. 

        Si se fijan bien, aparecemos en la User32.dll, y esta no es la zona que nos interesa, nos interesa el ejecutable del programa. Así que como deben recordar, presionamos F12, yo dos veces, para ver quien hizo la llamada a GetWindowTexta, ubicada en la user32.dll.

F12 dos veces y ahora apareceremos en este lugar:

:00421E83 E813A60200       call 0044C49B<---------- Aquí aparecemos
:00421E88 8D5F60           lea ebx, dword ptr [edi+60]
:00421E8B 53               push ebx
:00421E8C 68FA030000       push 000003FA
:00421E91 56               push esi
:00421E92 E804A60200       call 0044C49B
:00421E97 68FE000000       push 000000FE
:00421E9C 53               push ebx
:00421E9D 56               push esi
:00421E9E E85BA70200       call 0044C5FE
:00421EA3 83C764           add edi, 00000064
:00421EA6 57               push edi
:00421EA7 68FB030000       push 000003FB
:00421EAC 56               push esi
:00421EAD E8E9A50200       call 0044C49B
:00421EB2 68FE000000       push 000000FE
:00421EB7 57               push edi
:00421EB8 56               push esi
:00421EB9 E840A70200       call 0044C5FE
:00421EBE 5F               pop edi
:00421EBF 5E               pop esi
:00421EC0 5B               pop ebx
:00421EC1 C20400           ret 0004
<---------------------- Retorno
Este lugar me parece interesante. Lo que deben hacer en estos casos, es ir viendo que valor tienen los registros o sea que ponemos d eax,(mira la ventana de datos) nada interesante, d ebx, tampoco, d ecx, si!!!, es nuestro código, en mi caso 55555!!!.

        Genial, ahora borramos el bpx que habíamos puesto con bc*. Lo que haremos en este caso es poner ?ecx a ver que vemos. EN MI CASO (las direcciones de memoria pueden variar) veo esto en la ventana de comandos:

00135175C   0020256604 "...

        Lo que resalté en amarillo es la dirección de memoria en la cual se encuentra nuestro código válido. Y si pensaran un poco..... si!!!, pondremos un bpm en esa dirección para saber cuando el programa la lee o la escribe y a ver si encontramos el serial válido.

        OK. En mi caso lo que debo poner es bpm 00135175C. Después de poner el bpm presionamos F5 para salir a Windows... ¿pero que pasa?, entramos de vuelta al SiCE, porqué?. Porque el programa acabó de leer esa dirección de memoria y con el bpm le habíamos indicado al SiCE que saltara cuando lo hiciera.

Apareceremos en un lugar más o menos así: 

:004378E0 8A06           mov al, byte ptr [esi]<------Aparecemos aquí
:004378E2 46             inc esi
:004378E3 8A27           mov ah, byte ptr [edi]
:004378E5 47             inc edi
:004378E6 38C4           cmp ah, al
:004378E8 74F2           jz 004378DC
<-------Si vamos a esta dirección, nuestro número está por todos lados 
:004378EA 2C41           sub al, 41            
pero no le veo nada interesante.
:004378EC 3C1A           cmp al, 1A
:004378EE 1AC9           sbb cl, cl
:004378F0 80E120         and cl, 20
:004378F3 02C1           add al, cl
:004378F5 0441           add al, 41
:004378F7 86E0           xchg al, ah
:004378F9 2C41           sub al, 41
:004378FB 3C1A           cmp al, 1A
:004378FD 1AC9           sbb cl, cl
:004378FF 80E120         and cl, 20
:00437902 02C1           add al, cl
:00437904 0441           add al, 41
:00437906 38E0           cmp al, ah
:00437908 74D2           jz 004378DC
<----En esta lo mismo, pero despierta más sospechas que la primera
:0043790A 1AC0           sbb al, al
:0043790C 1CFF           sbb al, FF
 

  Como podrán ver, hay varias operaciones y después hay dos JZ. JZ es igual que JE, o sea que significa salta si es equivalente. Para que no se se armen un lío, les digo que ya fui a la jz 004378DC (a esta dirección de memoria) pero la segunda dirección de memoria, a la que saltará el programa si todas las operaciones que se realizaron dieron como resultado un valor equivalente (más fácil, si AL y AH son iguales (miren arriba del segundo jz). Vamos a ver.

        Para ir a una dirección de memoria usaremos el comando G del SiCE. O sea que escribimos G dirección de memoria (en mi caso 004378DC) y pulsamos enter y listo. Pero... ATENCIÓN!!!!!!!!!!!!. Hay una manera mucho más fácil y rápida de hacerlo. Recuerdan que el registro que contenía el serial que habíamos introducido era ECX. Probemos, pongamos d eax, d ebx, d ecx, esto tiene pinta de número válido. Una curiosidad, pongan d esi y verán. Para los despistados este es mi número (varía con lo que hayamos puesto en name y company) EXTENDING-92385-..... mejor vayan por el suyo!!!!.

        Como ven, este código no les registra el programa, sino que les extiende el período de evaluación. No se preocupen por el límite de tiempo, dice Evaluation time expired pero no expira. Solo nos recuerda que gastemos nuestro dinero en el programa.

        Ante toda duda que pueda haber, les comunico que este tutorial ha sido creado solo con fines educacionales y que yo no me puedo hacer responsable del uso que ustedes le puedan dar. Si te gusta alguno de los programas que crackeas, CÓMPRALO!!! 

Si TiENEN UN PROGRAMA QUE LES ESTÉ DANDO LiO PARA CRACKEAR, MÁNDENME UN MAiL DiCiÉNDOME DE DONDE LO PUEDO BAJAR Y SI NO ES NADA DE OTRO MUNDO, HAGO UN TUTORIAL!!!.

4) Despedida

El manual ha terminado. Espero que se lean buena cantidad de manuales donde haya que encontrar seriales válidos, ya que no es solo teórico, también es práctico. Cuando empecé con el SiCE me lo conocía de punta a punta (lo teórico) pero iba a buscar un serial válido y me perdía. Por suerte eso ya se fue y no me pasa más hace tiempo pero traten de que no les pase a ustedes. Gracias a K-FoR, por invitarme a ser miembro del grupo a Profesor X, por su compilación (ahora hay una nueva sobre cursos de una gran variedad!!!) y por toda su ayuda. A karpoff, por su gran apoyo y sus recomendaciones, Txeli, por su apoyo moral y por dejarme algunos programas interesantes. Gracias a ustedes por leer mis manuales.

Este fue nuestro inicio con el SiCE,

 

A S T A L A V I S T A


Página oficial del grupo K-FoR: http://pagina.de/kfor
Mi dirección de E-Mail: dek_oin@hotmail.com

 

 

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