| COMO CRAKEAR POR ESTADO+PORCINO |
| CAP�TULO II. Diseccionando a los
Muertos Uedit 5.0 |
Enero 1998
| Indice |
| INTRODUCCI�N DESCENSO A LOS INFIERNOS: - Mu bien y esto pa que co�o me sirve. EL LISTADO MUERTO: - Manos a a la obra. |
|
INTRODUCCI�N !Saludos Familia ! Empezemos este a�o con una de las t�cnicas crack m�s importantes "El Listado muerto" o "death listing". Hasta ahora hemos visto la "aproximaci�n en vivo" o "live approaching" con el maravilloso Softice. |
|
DESCENSO A LOS INFIERNOS. Veamos de una vez por todas como se ejecuta una sentencia en el procesador, desde el inicio hasta el final. Supongamos que estamos programando en un lenguaje de Alto Nivel (C, C++, Pascal,Delphi,Visual Basic). Se llaman de Alto Nivel para diferenciarlos de los lenguajes m�s pr�ximos al procesador, como el Ensamblador, a los que se llama lenguajes de Bajo Nivel. Cuanto m�s "Alto" programemos, m�s control perderemos sobre nuestro programa, y esto es un grave problema. Supongamos un programa, escrito en Alto Nivel, que pinta la frase "HOLA MUNDO" en pantalla. � Qu� pasos se siguen hasta que realmente se pinta la frase?. Nuestro programa debe de residir en un fichero, al que se denomina fichero fuente, en el que aparece la sentencia para pintar la frase. Este fichero no es entendible por el procesador, s�lo es un conjunto de caracteres, mu diferente del conjunto de 0 y 1 que necesita para trabajar. Es aqu� donde entra el compilador, transforma el fichero fuente en un fichero intermedio, tambi�n llamado fichero objeto. En esta transformaci�n se comprueba la sintaxis de las sentencias ( falta el punto y coma) y la sem�ntica (has pasado un entero cuando se esperaba un real). El compilador realiza entonces una fase de linkado para reunir los distintos ficheros objeto que conforman nuestro programa final (aunque tengamos un �nico fichero fuente). En esta fase se determinan el mapeo final del program en memoria (que direcci�n de memoria va a tener cada instrucci�n del conjunto de ficheros objeto). Tras la fase de linkado, el programa final se encuentra en un lenguaje llamado pseudoc�digo, mu sencillote. Aqu� se pueden tomar 3 v�as. Primera: Dejar el programa como est�, y que otros pogramas o librer�as (como la vbrun500.dll de Visual Basic) lo traduzcan (lo interpreten) a sentencias entendibles por el porcesador. Segunda: Transformar el pseudoc�digo a un lenguaje de Bajo Nivel como el ensamblador. En tal caso, se necesitar� un compilador de ensamblador para que el programa pueda ser ejecutado. OJO, el ensamblador no es entendible por el tonto procesador que s�lo ve unos y ceros, son dos cosas distintas. Tecera: La m�s com�n, transformar directamente de pseudoc�digo a ejecutable Un fichero ejecutable consta de unos y ceros (o de n�meros en hexa, seg�n se mire) ordenados de una forma especial; ordenados en instrucciones: Los 3 primeros n�meros son el tipo de instrucci�n, los 4 siguientes el operando1, el siguiente el operador...Cada instrucci�n es depiezada dentro del procesador y dan a lugar a la ejecuci�n de un conjunto de programas presenten dentro del procesador, son las microrutinas. Estas microrutinas son las encargadas de bloquear buses, activar multiplexores, dar tensi�n a un transistor o no, pa enterndernos. Accionando correctamente buses, multiplexires... se pintar� relamete la frase en pantalla. Bien, esto es todo. Mu bien y esto pa que co�o me sirve. Existe una correspondencia directa entre lenguaje ensablador y programa ejecutable. Gracias a un desensamblador (W32DASM, IDA PRO), a partir de un ejecutable podemos obtener el programa el lenguaje ensablador sin disponer del fichero fuente. Un program en ensamblador puede ser f�cilmente entendido por los humanos (o eso dicen algunos). Esto nos da un poder tremendo a los crackers. Podemos saber como funciona un programa sin necesitar del programa original. Y lo que es m� a�n, independientemente del lenguaje de Alto Nivel. Todos los lenguajestienen que pasar a ejecutable de alguna u otra forma, y es aqu� cuando usamos nuestro desensamblador y extraer su listado en ensablador. Da igual que programa est� hecho en Pascal, O C++, lo entederemos igualmente ya que leeremos ensamblador. |
|
EL LISTADO MUERTO La idea es sencilla. Cojemos nuestro desensamblador favorito y se lo pasamos al objetivo. Obtendremos un listado en ensamblador de nuestro programa a crackear. La t�cnica crack se llama Listado muerto porque entenderemos y manejaremos el programa con este listado, sin tener que ejecutarlo, con el programa muerto. A diferencia de cuando lanzamos el SoftIce y entendemos el programa cuando se est� ejecuntandose, cuando "vive". Hay tre ventajas fundaentales para utilizar el Listado Muerto. - Podemos seguir el programa f�cilmemte de atr�s hacia adelante, basta con pasar de p�gina, no hace falta volver a ejecutatlo. - Es mucho m�s relajado imprimir y estudiar 4 p�ginas de c�digo que rastrear con el SoftIce. Este es uno de los consejos de +ORC. - Se descubren peque�os secretos, como rutinas inactivas. La paciencia y la tranquilidad son dos requisitos fundamentales en un cracker. Es f�cil perderte trazando con el SoftIce e imposible con el Listado Muerto. Manos a la Obra Una vez desensamblado el objetivo, la idea es buscar cadenas de texto interesantes, como "unregistered", "expired", "congratulations" y mirar al rededor de estas cadenas buscando un salto m�gico. Las palabras en concreto dependen del programa y son las que aparecen para recordarte que a�n no te has registrado. |
|
C�MO CRACKEAR UEDIT 5.0 Objetivo: Uedit 5.0. Siguiendo la recomendaci�n del maestro +ORC, continuamos con el crack a nuestras herramientas de trabajo. En este caso nos encontramos ante un excelente editor hexadecimal, vital para nuestros negocios :-) Instalemos el programa, ejecut�moslo y veamos lo que nos encontramos. ARRJJ!!, una horrible ventana nos dice que tenemos 45 di�s para registranos. Adem�s tiene un bonito bot�n "Enter Authorization Code". Pulsemos y veamos. Un t�pico nombre de usario y n�mero de serie (al que le llamar� passwod o pass). Si pulsamos cuaquier guarrada en ambos, sorpresa, ning�m mensaje advirtiendo del error, ning�n pitido (recordais el cap�tulo I), nada excepto una ventana de mensaje que dice que hace falta cerrar el programa para validar el c�digo. �Habr� leido Ian D. Mead las lecciones de Estado+Porcino?. Bien, �por donde atacar?. No tenemos nada que nos indique que nos hemos equivocado. �Que tal si usamos el Listado Muerto amiguitos? Una vez desensablado el programa y dentro del W32dasm pulsemos el bot�n de Strn Ref (el boton que est� al lado del bot�n de impresora) para ver las cadenas de caracteres que aparecen en el nuetro objetivo. Que vemos, que casualidad , tenemos la frase "Thank you fot supporting Shareware" , hagamos doble click y veamos donde aparecemos: * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00401B77(C) | :00401B7D 83FB09 cmp ebx, 00000009 :00401B80 7504 jne 00401B86 :00401B82 C645EC20 mov [ebp-14], 20 * Referenced by a (U)nconditional or (C)onditional Jump at :00401B86 8D45C8 lea eax, dword ptr [ebp-38] * Possible Reference to String Resource ID=00010: " Thank you for supporting Shareware." | :00401B89 6A0A push 0000000A En :00401B89 tenemos una referencia a la cadena que nos interesa. Cada frase del programa tiene asociado un n�mero, en este caso es el 0000000A y este n�mero se les pasa al las rutinas que tienen que imprimir los mensajes. La forma tradicional de pasarle par�metros a una rutina es a trav�s la pila mediante push (como en :00401B89 ). Los par�metros se pasan empezando por el �ltimo, es lo que se llama paso de par�metros mediate el modelo de PASCAL, existen otros modelos, pero son poco utilizados. �Estamos en el camino adecuado�, nop, ya que el n�mero de nuestra frase, el 0000000A (en es n�mero 10 en decimal) es muy utilizado en cualquier programa y cada vez que aparezca, el desensamblador pensar� que se est� haciendo referencia a nuestra frase. Bien pensemos un poco. Nuestro programa est� limitado por 45 d�as de uso, pasado ese tiempo, lo normal es que nos aparezca una frase deciendo algo as� como "Evaluation time expired". Busquemos (Con el bot�n de la linterna ) la palabra expired pasada a una rutina mediante push a ver que encontramos. :043F7D3 E8375DFCFF call 0040550F :0043F7D8 391DDC0C4A00 cmp dword ptr [004A0CDC], ebx :0043F7DE 758A jne 0043F76A :0043F7E0 8D4D10 lea ecx, dword ptr [ebp+10] :0043F7E3 E829C00100 call 0045B811 :0043F7E8 8D4D14 lea ecx, dword ptr [ebp+14] :0043F7EB C645FC01 mov [ebp-04], 01 :0043F7EF E81DC00100 call 0045B811 * Possible Reference to String Resource ID=00068: "UltraEdit 45 Day Evaluation time expired!!!!" | :0043F7F4 6A44 push 00000044 BINGO. No sent�s el c�digo, no percibis como estamos en el camino correcto. Si, tenemos en :0043F7F4 un push con el n�mero asociado a la frase que buscamos y justo en :0043F7DE un salto a 0043F76A que evita imprimir el mesaje, pero el punto clave es ver la comprobaci�n del salto en :0043F7D8. Se comprueba si el contenido de EBX es igual a una direcci�n fija de memoria la [004A0CDC]. Las direcciones fijas son las t�picas variables globales tan mal utilizadas en los programas. Tenemos una variable global que controla la aparici�n de un mensaje de error. En alg�n punto del programa debe de inicializarse [004A0CDC] con un valor ,si localizamos este trozo de c�digo, estaremos en plena rutina de comprobaci�n. �Facil, verdad? Busquemos [004A0CDC] y veamos quien la inicializa, s�lo nos interesan las sentencias que inicializen la variable, no las sentencias que comprueban su valor. Normalmente se inicializa por defecto a un valor de error (indicando que no estamos registrados) y se inicializa corectamente cuando nos registrmemos. Conforme aparecen occurencias de nuestra variable glabal sabemos que estamos en el buen camino porque siempre est� rodeada de mensajes de error o de felicitaci�n. Buscando [004A0CDC] encontramos las siguientes sentencias que modifican la variable (el resto de apariciones son comprobaciones del valor) :00405541 893DDC0C4A00 mov dword ptr [004A0CDC], edi :004056A3 891DDC0C4A00 mov dword ptr [004A0CDC], ebx :004057D4 8325DC0C4A0000 and dword ptr [004A0CDC], 00000000 :00426924 891DDC0C4A00 mov dword ptr [004A0CDC], ebx :0043F684 C705DC0C4A0001000000 mov dword ptr [004A0CDC], 00000001 Que tenemos aqu�. Parece l�gico pensar que en :004057D4 tenemos la incializaci�n por defecto, ya que un AND con ceros da cero. La sentencia contraria la tenemos en :0043F684 que mueve 1 a la variable, esto sin duda indica que nos hemos registrado. Tambi�n podr�a ser al rev�s, cero registrado, uno no registrado, pero este no es el caso. Basta ejecutar el Softice y poner bpr 004A0CDC 004A0CDC rw , la primera modificaci�n debe ser la asignaci�n por defecto, en este caso la :004057D4. Por tanto solo debemos centrarnos en la asignaci�n a uno :0043F684, olvidando el resto de asignaciones. Esto es un axioma fundamental ante la duda, elige siempre la soluci�n m�s sencilla. Bien, veamos que hay entorno a la :0043F684 :0043F65C E89A560300 call 00474CFB :0043F661 8B7804 mov edi, dword ptr [eax+04] :0043F664 8B4514 mov eax, dword ptr [ebp+14] :0043F667 48 dec eax :0043F668 7478 je 0043F6E2 :0043F66A 48 dec eax :0043F66B 0F85F9000000 jne 0043F76A :0043F671 391DDC0C4A00 cmp dword ptr [004A0CDC], ebx :0043F677 0F85DA010000 jne 0043F857 :0043F67D 833DBC024A0000 cmp dword ptr [004A02BC], 00000000 :0043F684 C705DC0C4A0001000000 mov dword ptr [004A0CDC], 00000001 Tenemos diversos saltos que evitan nuestra asignaci�n a uno. El primer salto, sest� en :0043F668 7478 je 0043F6E2 que tal si lo cambiamos por EB1A jmp 43F684. Osea, siempre saltamos a 43F684 evitando las comprobaciones de :0043F66B y :0043F677.El c�digo EB es la instrucci�n de salto incondincional JMP, 1A es el n�mero de bytes desde la sentencia condicional hasta la sentencia donde queremos saltar. F�cil, �verdad?. Perfecto, rula. Basta con buscar en el ejecutable uedit32 la secuencia 8B451448747848 y cambiarla por 8B451448EB1A48. Pero hay un peque problema, el crack funciona pero no tenemos un n�mero de serie correcto. En principio basta, pero pensando un poco podremos sacar nuestro propio n�mero de Serie. � Qu� se os ocurre? Sip, exactamante,� que tal si le seguimos la pista a nuestro n�mero de serie basura y vemos con qui�n se comparar�? . La pregunata es, donde coloco un bpx para pararme justo antes de que se compruebe mi n�mero de serie. La respuesta es sencilla, en :43F618 (echarle un vistazo al listado muerto) comienza la rutina en la que se asigna a 1 nuestra variable glabal. Este puede ser un buen comienzo. Abrimos el Softice con el uedit, ponemos nuestro nombre Estado+Porcino y un n�mero basura 1212121212121212 . Cerramos el uedit y lanzamos de nuevo el SoftIce poniendo la sentencia bpx 43F618. Aparecemos en :43F618, ahora es el momento de buscan nuestro n�mero de serie con s 30:00 l ffffffff �12121212� lo encontramos es :942F9C (esta direcci�npuede cambiar en tu ordenador). Borramos el punto de ruptura anterior con bc 0 y creamos uno nuevo con la direcci�n donde est� nuestra password con bpr 942F9C 942F9C+f rw seguimos adelante con Crtl+D para ver quien caen en buestra trampa. Aparecemos en :40B73A con varios movsd , nuestra password se est� copiando en otro sitio. La sentencia movsd, copia caracteres de ees:esi a ees:edi. Pongamos en el SoftIce d ees:edi para ver como realmente se va a copiar, adem�s pongamos otro punto de ruptura en la nueva posici�n de nuestra password con bpr ees:edi ees:edi+f rw .Curiosamente, si nos movemos un poco con los cursores por ees:edi aparecen las passwords correctas, pero todav�a no es el momento. Lancemos de nuevo el SoftIce con Crtl+D y aparecemos en :444FOE ,aqu� encontramos una peque�a comprobaci�n, en ecx tenemos nuestra pass (para comprobarlo basta con poner d ecx) y en edx apuntamos a una zona de nuestro nombre, concretamente a "tado+Porcino". Esto no es exactamente lo qu buscamos, as� que sigamos adelante con Crtl+D y aparecemos en :444EBO con una comprobaci�n entre edx y ecx a trav�s de al. Curiosamente edx apunta a nuestra pass y ecx apunta a Y2+cHdcBd6=DBC/P este churro es la pass correcta, si seguimos con Crtl+D aparecemos en el mismo sitio con edx apuntando a nuestra pass y ecx apunta a JWKTUUTH02166710 otra pass correcta. A lo largo de la evoluci�n del programa desde sus primeras versiones, se ha cambiado 2 veces de generador de pass por cuestiones de seguridad, �qu� est�pidos!. Por eso la doble comprobaci�n, ver si nuestra pass es del antiguo generador o del nuevo. Eso es todo por ahora, no seais unos descerebrados y utilic�is mi pass, buscad la vuestra, es mu sencillote. Espero vuestras opiniones, sugerencias y ensayos en [email protected]En breve analizaremos tipos de protecciones mucho m�s interesantes. Recordad bebed de la fuente, buscad a +ORC en la red. |