Observar los registrosEntrar en softcite Ctrl+D y escribir "D EAX". En la ventana de datos aparecerá el contenido en ascii del registro EAX. Hacer la misma prueba con el resto de registros y observareis que la ventana cambia indicandonos lo que hay en cada uno de ellos pero ojo, no nos enseña lo que hay en EAX sino lo que hay en el lugar al que apunta EAX, si EAX=04043567 estaremos viendo los datos que hay en la posición de memoria 04043567.
Si hacemos "D *EAX" softcite cojerá el valor de los primeros 4 bytes a los que apunta EAX y nos enseñará lo que hay en esa dirección. Se que es un poco lioso pero hacer pruebas hasta que comprendáis lo que está sucediendo.
Veamos un ejemplo práctico:Supongamos que en la ventana de registros observamos que EAX = 0050F608
entonce, si hacemos "D EAX" veremos que la ventana de datos apunta a la dirección 0050F608 y veremos los bytes que contiene. Estos pueden ser por ejemplo 11-01-00-00-FF-FF-FF-FF etc...
Ahora vamos a hacer "D *EAX" ¿ que hace softice ? pues carga los primeros cuatro bytes (11-01-00-00), los coloca en orden inverso (00-00-01-11) y nos muestra el contenido de esta dirección (00000111). ¿ lo habeis entendido ?. Este dato es muy importante ya que las funciones son llamadas pasandoles como parámetros una dirección concreta y otras veces son llamadas diciendoles en qué dirección se encuentra la dirección donde están los datos. Sería como decir "la dirección es 00000111" y "la dirección se encuentra donde apunta EAX"
Se que es un poco complicado pero practicar con esto hasta que entendáis este detalle y no paséis a otro punto hasta tenerlo bien claro.
Break PointEl break point (bp) hay que entenderlo como un lugar (el que a nosotros nos interese) donde haremos que el programa se detenga y softice nos de el control enseñandonos el código desensamblado o descompilado. Para hacer una prueba sobre esto hacer lo siguiente:
1.- Dentro de windows pulsar Ctrl + D para entrar en softice
2.- Escribir "BPX GETWINDOWTEXTA"
acabamos de decirle que cuando se ejecute la función de capturar el texto de una ventana interrumpa ese programa y nos de el control.
3.- Salir de softice con F5
4.- Ejecutar cualquier programa que tenga una ventana donde se escriba alguna cosa (digamos, por ejemplo, la introducción de un número de serie)
5.- Escribir lo que sea y pulsar aceptar.
6.- Si en este momento estáis dentro de softice es que vuestro bp ha funcionado, si no es así es que el programa que habeis arrancado no utiliza "getwindowtexta" para la captura de texto, así que probar con "getwindowtext", "getgdlgitemtexta" o "getdlgitemtext".
7.- Estamos antes de que el programa capture el texto que hemos introducido, para que termine la función y saber quien la ha llamado pulsar F12 y F12 otra vez.
8.- Ahora estamos después del código que ha capturado el texto introducido... y a partir de este momento hay que trabajarselo.
9.- A partir de aquí, el programa hará una serie de comprobaciones de la cadena introducida. Esta comprobación varía dependiendo del programador que ha hecho la aplicación. Es posible que realice varias operaciones con el valor de cada byte que compone la cadena (sumas, restas, multiplicaciones, operaciones XOR, Etc.) y lo compare con el número que se supone es el adecuado (de aquí que varios números de serie sean validos para registrar un mismo programa). También es posible (aunque rara vez sucede) que se compruebe la cadena con otra cadena (la buena) en cuyo caso veremos la buena y la introducida por nosotros en la memoria, no estarán muy alejadas la una de la otra. En cualquier caso, despues de la comparación siempre hay una instrucción que nos envía al código que continua la ejecución normal del programa o nos tira a la calle en caso de que la comparación no sea la adecuada. Estas instrucciones son mas o menos así:
cmp dword ptr tal_y_cual, pascual compara un número con otro
je 00123456 salta al código bueno si es igual
jmp 00345678 salta al código de tirarnos a la calleEs lógico pensar que si variamos la instrucción
je 00123456 por
jne 00123456 ó
jmp 00123456 el código se ejecutará como si el programa fuera legal o registrado y no importa el tipo de protección que tenga, nos da lo mismo que sea un disco llave, una mochila o un número de serie. Da lo mismo el tipo de protección que utilice el programador y lo sofisticada que ésta sea, a nosotros nos importa un pepino, tan solo tenemos que dar con la instrucción que la comprueba y parchearla.
Podemos poner un BP en cualquier función de las API's de Windows. Las que capturan el texto introducido en una ventana son:
BPX GETWINDOWTEXT
BPX GETWINDOWTEXTA (para la versión de 32 bites)
BPX GETDLGITEMTEXT
BPX GETDLGITEMTEXTA (para la versión de 32 bites)Hay que tener en cuenta que cuando softice detiene la ejecución del programa por el BPX nos encontraremos ANTES DE QUE ESTA FUNCION SE EJECUTE, así que tendremos que pulsar F12 para ejecutarla y ver quien la ha llamado ya que la comparación se efectuará después. Este fundamento es la base para destripar cualquier protección del tipo nº de serie. Os aseguro que una vez comprendido el mecanismo es muy fácil saltarse la mayoría de estas protecciones, tan sólo tendremos que dar con el fragmento de código que realiza esta tarea..
Puntos de ruptura importantesAdemás de los puntos de ruptura ya comentados y dependiendo del comportamiento de la aplicación, podemos probar los siguientes:
Supongamos que despues de introducir un número de serie no válido nos sale una ventan advirtiendonos de ello, bien pues deberemos detener el programa en algún sitio, así que porbaremos con alguna de estas funciones:
MESSAGEBEEP
SENDMESSAGE
MESSAGEBOX
SHOWWINDOW
GETPRIVATEPROFILESTRING
GETPRIVATEPROFILEINT
HMEMCPYEs importante observar el comportamiento de cada programa para meterle mano por un sitio u otro. Colocando un BPX en la función que utilice el programador para mostrarnos el mensaje de error (tendremos que probarlas todas) estaremos en la parte del código que ya HA HECHO la comprobación de la protección, con lo que estaremos muy cerca del código que deberemos parchear, sólo tendremos que tener en cuenta que éste código está detras de lo que estamos traceando. Para no perdernos sobre un millón de paradas que nos hará Softice sobre las funciones interceptadas, hay que colocar los BPX SOLAMENTE antes de que el código llame a la función en el momento oportuno, o sea, que no hay que colocar los BPX antes de rodar la aplicación, hay que ponerlos en el preciso instante en el que sabemos que va a ser llamada para comprobarla. Supongamos que rodamos la aplicación y estamos sobre la ventana de introducción del numerito, pues introducimos el numerito y antes de pulsar sobre el botón de aceptar es cuando colocamos el BPX, de esta forma sabemos que softice dentendrá la aplicación en el momento que a nosotros nos interesa.
COMANDOS DEL SOFTICE:pera ver el resto del tut este es el
linkautor: Crack El Destripador