Objetivo: Uedit 5.0.
Versión: 5.0 3/7/97
Nombre del ejecutable: uedit32.exe
Website: http://www.uedit.com
Tamaño del ejecutable: 812.514 bytes.
Tipo de protección: Por número de serie y
temporal.
Dificultad: Medio.
Tiempo de crackeo: 5 minutos.
Herramientas: W32dasm8.X, SoftIce.
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 estadoporcino@hotmail.com
En breve analizaremos tipos de protecciones mucho más
interesantes.
Recordad bebed de la fuente, buscad a +ORC
en la red.
|