| ESTUDIO COLECTIVO DE DESPROTECCIONES Última Actualizacion: 25/10/2001 |
Programa | Solid Edge 5.0 Spanish | W95 / W98 / NT
Descripción | Programa de modelado mecánico en 3D
Tipo | Trial de 30 dias + cd-check
Tipo de Tutorial | [X]Original, []Adaptación, []Aplicación, []Traducción
Url | Desconocida
Protección | Time Limit 30 Dias + cd check
Dificultad | 1) Principiante, 2) Amateur, 3) Aficionado, 4) Profesional, 5) Especialista
Herramientas | SoftIce v4, W32dasm , UltraEdit
Objetivo | Elimitar el límite de tiempo y el cd-check mediante parcheado de código.
Cracker | Black Fenix
Grupo | http://kickme.to/wkt
Fecha | Marzo del 2000
INTRODUCCION
Bueno este es el sexto 'elemento' y esta vez vamos a tratar un programa bastante bueno en lo referido a calidad ya que se trata de un programa tipo CAD para el modelado y ensamblaje de piezas mecanicas, por lo que en principio puede ser un reto superior a los anteriores. Conseguiremos tener una 'full version' del programa partiendo de una demo de 30 dias. Nota:Este crack esta hecho para la versión demostración del programa Solid Edge 5.0 (Spanish).
AL ATAQUE
Bueno, tras instalar el programa, se nos crean 3 diferentes accesos al programa en question, estos son : Solid Edge Chapa -> smetal.exe Solid Edge Conjunto -> assembl.exe Solid Edge Pieza -> part.exe Solid Edge Plano -> draft Cada uno de estos accesos corresponde a un ejecutable distinto como he indicado, por lo que seguramente cada uno deberá ser modificado para que funcione 'correctamente'. Probaremos primero con Solid Edge chapa haciendo click sobre este, veremos que el programa nos muestra un mensaje en el que nos comunica el fin de nuestro periodo de evaluación (esto es cierto si la fecha de nuestro sistema supera el 1 de Enero de 1998 ya que el periodo de evaluación empieza el 1 de diciembre de 1998 y dura 30 dias, si no te dice que ha caducado modifica la fecha para que el programa te diga que a caducado). El mensaje dice algo asi... The evaluation period for this software has expired bla bla bla .... Haz click en Aceptar y el programa finalizará. Bien, ya tenemos algo por donde comenzar un MessageBox, adivinas lo que haremos ahora ? No, pues mal eso es que no sigues mis tutoriales. Pero como soy buena persona te dire que es lo que haremos: - Activar el Soft-Ice (Ctrl+D) y poner un breakpoint en las siguientes funciones: bpx Messagebox bpx MessageboxA bpx MessageBoxEx Con esto intentaremos parar la ejecución del programa antes de que muestre el cuadro de dialogo que nos molesta tanto. Una vez establecidos los bpx ejecutamos de nuevo el programa Solid Edge Chapa. Boom !! el breakpoint MessageBoxEx a surtido efecto, estamos de nuevo en el Soft-Ice, dentro de la función MessageboxEx de la DLL user32 por lo que pulsaremos F12 y esto hará que se muestre el cuadro de dialogo, se activará el S-Ice de nuevo y volveremos a pulsar F12 para que se se continue ejecutando código hasta que el programa vuelva a la linea de código desde donde fue llamada la función que muestra el cuadro de dialogo. Soft-Ice aparecerá de nuevo y mostrará algo así:
* Reference To: USER32.MessageBoxExA, Ord:0196h
:00404BB1 | 8B3514A84000 | mov esi, dword ptr [0040A814] | // ESI apunta a la función MessageboxA
:00404BB7 | 57 | push edi
:00404BB8 | 53 | push ebx
:00404BB9 | 55 | push ebp
:00404BBA | 50 | push eax
:00404BBB | 6A00 | push 00000000
:00404BBD | FFD6 | call esi | // Esta es la llamada a MessageBoxA
:00404BBF | 8B4C2410 | mov ecx, dword ptr [esp+10] | // ESTAMOS AQUI!!!
:00404BC3 | 85C9 | test ecx, ecx
:00404BC5 | 7420 | je 00404BE7
:00404BC7 | 83F802 | cmp eax, 00000002
:00404BCA | 7413 | je 00404BDF
:00404BCC | F6C310 | test bl, 10
:00404BCF | 750E | jne 00404BDF
:00404BD1 | 8B4C2458 | mov ecx, dword ptr [esp+58]
:00404BD5 | 57 | push edi
:00404BD6 | 53 | push ebx
:00404BD7 | 55 | push ebp
:00404BD8 | 51 | push ecx
:00404BD9 | 6A00 | push 00000000
:00404BDB | FFD6 | call esi | // esto es otra llamada a MessageboxA
:00404BDD | EB08 | jmp 00404BE7 | // que no es ejecutada
Bueno la linea 404BBD realiza la llamada a la función MessageBoxA, los push anteriores son los parametros de creación del MessageBox. Llegados a este punto nos queda pensar lo siguiente: - Usar el W32Dasm y desensamblar el código del programa y ver que hay antes de estas lineas para comprobar si hay algun salto que nos envie a estas lineas y modificarlo. - Continuar la ejecución de esta rutina con F12 con la intencion de ir a la linea donde se llama a a esta rutina para comprobar si el lugar donde estamos no es exactamente lo que buscamos ya que podria tratarse de una rutina que muestra los diferentes cuadros de dialogo según la fecha. Lo lógico aquí es la opción B ya que como estamos dentro del Soft-Ice no nos cuesta nada hacer esta comprobacíon y así asegurarnos. Pues adelante, pulsamos F12 y se nos mostrará algo así:
:00403246 | 51 | push ecx
:00403247 | 52 | push edx
:00403248 | 56 | push esi
:00403249 | 50 | push eax
:0040324A | 53 | push ebx
:0040324B | E830120000 | call 00404480 | // Venimos de aquí...
:00403250 | 83C41C | add esp, 0000001C | // ESTAMOS AQUI!!! Restaura la pila
:00403253 | 83F802 | cmp eax, 00000002 | // comprueba valor de retorno (mmmmmm...)
:00403256 | 89442420 | mov dword ptr [esp+20], eax | // guarda dicho valor
:0040325A | 0F85EE020000 | jne 0040354E | // salta si el valor no es 2
:00403260 | B933000000 | mov ecx, 00000033
:00403265 | 8DBC240C040000 | lea edi, dword ptr [esp+0000040C]
:0040326C | F3 | repz
:0040326D | A5 | movsd
Examina este código antes de hacer nada. Que te parece? no es sospechoso el cmp eax,00000002 (linea 403253) Pues si bastante, normalmente las funciones retornan con un valor en EAX que es usado por el programa para comprobar ciertas condiciones :) . Y esto nos hace pensar que si despues de volver de esta función (404480) no volvemos con un 2 en EAX, el programa probablemente no continuará su ejecución. Otra cosa que lo hace más sospechoso aún es la linea 40325a en la que EAX es guardado, ¿ Para que guardar un valor de retorno de una función? Pues probablemente para hacer algún test más adelante. Bueno esto es teoria, ahora la practica, vamos a modificar EAX para que valga 2 ya que como puedes comprobar vale 3. Para hacer esto teclearemos > r eax > modificar el 3 por un 2 > pulsar ENTER y luego ESC Sólo queda seguir adelante pulsando g y ENTER, comprobaras sorprendido que el programa funcionara hasta que nos diga que no hay el CD-ROM original dentro de la unidad, pero por lo menos ya sabemos como evitar que el programa caduque. - Vamos a modificar el ejecutable para que nos deje entrar aunque haya caducado antes de entrar con la rutina de detección del CD original.Pensemos la mejor manera, necesitamos eliminar el mensaje y que el programa continue su ejecución normal. Para ello necesitamos eliminar la llamada de la linea 40324B y hacer que EAX valga 2 siempre. Parece dificil pero no lo es, en vez de llenar con NOP los bytes que ocupa la función, que son exactamente 6 bytes lo llenaremos con la instrucción MOV EAX,2 que ocupa exactamente 6 bytes. Con esto matamos dos pajaros de un tiro: Eliminamos la llamada y conseguimos que EAX valga 2. La codificación para MOV EAX,2 es B802000000. Adicionalmente podemos rellenar con NOPs el salto posterior y asi nos aseguramos del todo, esto significa cambiar los bytes 0F85EE020000 por 909090909090. Para modificar el ejecutable lo desensamblaremos con el W32Dasm si no los has echo ya hazlo. Iremos a las correspondientes lineas (40324B y 40325A) y apuntaremos los offset que el W32Dasm nos dice en la barra de estado inferior, saldremos del W32Dasm y abriremos nuestro fichero con el editor hexadecimal que uses normalmente y una abierto iremos a los correspondientes offsets y cambiaremos los bytes que marca por los nuevos.Creo que seras capaz de hacerlo tu solo asi que no me enrollo más. Nota: Para nuestra suerte y regocijo el resto de ejecutables usan el mismo esquema para la comprobación de la fecha, por lo que no tendremos ni que trazarlos con el S-Ice, simplemente busca las cadenas 0F85EE020000 (salto) y E830120000 (llamada) y modificalas como en el caso anterior. Una vez más la vagueza de los programadores de "elite" se pone de manifiesto :) - Ahora puedes ejecutar el programa y veras que funciona hasta que aparece el cuadro de dialogo que nos indica que no tenemos el CD original en la unidad (si tienes los bpx activos, comprobaras que antes del cuadro estos se activan en un MessageBoxA que pertenece al cuadro de dialogo en cuestion). Si no tienes activos los bpx activalos y vuelve a intentarlo... Ya?. Ok. estamos justo en el la función MessageboxA de la DLL User32, haremos lo mismo que antes ir a la linea que sigue a la que llama a esta función, por lo que pulsaremos F12. Y veremos algo así:
:04B51318 | E8A5020000 | Call 04B515C2
:04B5131D | 8D4DB0 | lea ecx, dword ptr [ebp-50]
:04B51320 | 8BF0 | mov esi, eax
* Reference To: JUTIL.??BGUserText@@QBEPBDXZ, Ord:0016h
:04B51322 | E89B020000 | Call 04B515C2
:04B51327 | 6A40 | push 00000040
:04B51329 | 56 | push esi
:04B5132A | 50 | push eax
:04B5132B | 6A00 | push 00000000
* Reference To: USER32.MessageBoxA, Ord:0195h
:04B5132D | FF15BC41B504 | Call dword ptr [04B541BC]
:04B51333 | 8D4DD0 | lea ecx, dword ptr [ebp-30] | // ESTAMOS AQUI!!!
:04B51336 | C645FC03 | mov [ebp-04], 03
* Reference To: JUTIL.??1GUserText@@QAE@XZ, Ord:000Ah
:04B5133A | E877020000 | Call 04B515B6
:04B5133F | 8D4DB0 | lea ecx, dword ptr [ebp-50]
:04B51342 | C645FC00 | mov [ebp-04], 00
* Reference To: JUTIL.??1GUserText@@QAE@XZ, Ord:000Ah
:04B51346 | E86B020000 | Call 04B515B6
:04B5134B | B805400080 | mov eax, 80004005
:04B51350 | 8B4DF4 | mov ecx, dword ptr [ebp-0C]
:04B51353 | 64890D00000000 | mov dword ptr fs:[00000000], ecx
:04B5135A | 5F | pop edi
:04B5135B | 5E | pop esi
:04B5135C | 5B | pop ebx
:04B5135D | 8BE5 | mov esp, ebp
:04B5135F | 5D | pop ebp
:04B51360 | C3 | ret
Bueno bueno, un primer vistazo no nos revela nada pero ojo ! Donde estamos mira lo que dice el SoftIce en la linea donde muestra el nombre del programa/dll donde estamos... KeyChk!.text+2C0, es una DLL y con un nombre bastante sospechoso, puede ser una DLL de uso interno del programa que se usa para la comprobación del CD. - Llegados a este punto no merece la pena continuar dentro del Soft-Ice para intentar algo como lo que hicimos anteriormente, por lo que desactivaremos los breakpoints y apuntaremos la dirección de código donde estamos que debe ser 4B51333, saldremos del Soft-Ice y del programa para desensamblar la DLL keychk.dll que podemos buscar con el explorador de windows, la encontraras dentro del directorio donde se encuentran los ejecutables del programa ( X:\..\Solid Edge\Program ), haremos una copia de seguridad y la desensamblaremos para ver que hace. Si hacemos click sobre el icono Exp Fnc (funciones que exporta la DLL) veremos que sólo hay una y se llama CheckKey (que te parece el nombrecillo, vaya programadores más lamers) no sacaremos mucho en claro si investigamos esta función por lo que vamos a ir la función donde nos dejo el Soft-Ice, vamos al menu Goto e introducimos la dirección que antes habiamos apuntado 4B51333, una vez alli (veremos exactamente el código que tienes encima de estas lineas) iremos marcha atras (tecla flecha arriba) buscando algun salto que nos envie o nos aleje de esta parte de código tras unas cuantas pulsaciones veremos algo así:
:04B512BD | 8D4DE0 | lea ecx, dword ptr [ebp-20]
:04B512C0 | 51 | push ecx
:04B512C1 | E8EA000000 | call 04B513B0 | // Llama a una función
:04B512C6 | 83C404 | add esp, 00000004 | // restaura pila
:04B512C9 | 85C0 | test eax, eax | // comprueba valor de retorno (mmmm....)
:04B512CB | 0F8CC4000000 | jl 04B51395 | // salta bastante lejos
:04B512D1 | 8B45E0 | mov eax, dword ptr [ebp-20] | // guarda valor de retorno
:04B512D4 | 85C0 | test eax, eax | // comprueba de nuevo
:04B512D6 | 0F85B4000000 | jne 04B51390 | // salta un poco menos lejos
:04B512DC | 8D4DB0 | lea ecx, dword ptr [ebp-50]
Cabe suponer que ninguno de estos saltos es tomado ya que son a direcciones más lejanas que la 4B51333. Hay dos cosas sospechosas en estas lineas, primero la llamada y luego el test eax,eax seguido del jl 04b51395 (SF<>0F). Si vamos al código que pertenece a la llamada call 4B513B0 (Menu Goto, teclear dicha dirección y enter) y examinamos por encima las referencias a las posibles cadenas veremos cosas como: * Reference To: KERNEL32.GetLogicalDrives, Ord:00FAh -> La función GetLogicalDrives retorna un DWORD que representa las unidades de disco disponibles * Reference To: KERNEL32.GetDriveTypeA, Ord:00DFh -> GetDriveType determina el tipo de unidad de disco: si es removible, fija, un CD-ROM, disco RAM, o una unidad de red. * Reference To: MSVCRT.fopen, Ord:0254h -> Abre un archivo * Possible StringData Ref from Data Obj ->"verLic.dll" -> referencia a un nombre de una DLL que no existe en nuestro disco duro pero si en el CD-ROM original :) * Possible StringData Ref from Data Obj ->"Products\Solidedg\verLic.dll" -> referencia a un nombre y ubicación de una DLL que no existe en nuestro disco duro pero si en el CD-ROM original :) * Possible StringData Ref from Data Obj ->"Products\SEDraft\verLic.dll" -> referencia a un nombre y ubicación de una DLL que no existe en nuestro disco duro pero si en el CD-ROM original :) * Reference To: MSVCRT.fclose, Ord:0249h -> cierra el archivo Bueno como habras podido deducir todo este código comprueba las unidades disponibles, busca una que sea de tipo CD-ROM
:04B514B2 | FFD5 | call ebp | // Llama a GetdriveTypeA
:04B514B4 | 83F805 | cmp eax, 00000005 | // Es un lector de CD-ROM
:04B514B7 | 0F858B000000 | jne 04B51548 | // NO, PUES MALAMENTE
y comprueba si existe el archivo "verlic.dll" en el CD intentandolo abrir
:04B514F5 | 50 | push eax
:04B514F6 | FFD6 | call esi | // llama a fopen
:04B514F8 | 83C408 | add esp, 00000008
:04B514FB | 85C0 | test eax, eax | // si retorno 0 = NULL
:04B514FD | 7530 | jne 04B5152F | // malamente ya que no puede ser NULL el valor de retorno
luego lo vuelve a cerrar comprobando de nuevo si se pudo cerrar.
:04B5153B | FF15A041B504 | Call dword ptr [04B541A0] | // llama a fclose
:04B51541 | 83C404 | add esp, 00000004
:04B51544 | 85C0 | test eax, eax | // comprueba si eax=0=NULL
:04B51546 | 7510 | jne 04B51558 | // si no se pudo cerrar malamente, no existe
> (no puedo asegurarte si hace alguna lectura pero diria que no ya que no hay ningun fread) ademas yo ya comprobé lo que es exactamente la dll verlic.dll y no es mas que un fichero de icono renombrado. Para ver que tipo de accesos se realizan a este archivo puedes usar el Filemonitor y veras lo que se hace con este archivo.Bueno hemos salido de dudas y ahora solo queda pensar como hacer para que el programa funcione en cualquier caso, haya o no CD original. - Podriamos modificar los saltos que hace al abrir y cerrar el archivo pero solo funcionaria en caso de que el CD original no estuviera, y queremos que funcione de ambas maneras. -Dejar en paz esta rutina y cambiar el salto que hay despues de la llamada a esta:
> :04B512BD | 8D4DE0 | lea ecx, dword ptr [ebp-20]
> :04B512C0 | 51 | push ecx
> :04B512C1 | E8EA000000 | call 04B513B0 | // Comprueba si existe el fichero verlic.dll en la unidad CD-ROM
> :04B512C6 | 83C404 | add esp, 00000004 | // restaura pila
> :04B512C9 | 85C0 | test eax, eax | // comprueba valor de retorno (mmmm....)
> :04B512CB | 0F8CC4000000 | jl 04B51395 | // salta bastante lejos (esto es lo que hay que cambiar)
> :04B512D1 | 8B45E0 | mov eax, dword ptr [ebp-20] | // guarda valor de retorno
> :04B512D4 | 85C0 | test eax, eax | // comprueba de nuevo
> :04B512D6 | 0F85B4000000 | jne 04B51390 | // salta un poco menos lejos
> :04B512DC | 8D4DB0 | lea ecx, dword ptr [ebp-50]
Bingo!! esto es lo que hay que cambiar por un salto incondicional, pero ojo, es un salto de más de 127 bytes, y ahora no me acuerdo de cual seria su codificación (mmmm....). No importa, usaremos el Soft-Ice, allí modificaremos esta linea y miraremos que código de operación tiene jejejejeje. Antes apunta el offset que es 6CBh. - Para poder establecer un bpx en 4B512CB deberas hacer primero que el programa se pare dentro de la DLL keychk.dll con el bpx messageboxa, apreta F12 2 veces y ahora pon el bpx en 4B512CB, ahora el programa saldrá ya que no hemos cambiado nada, vuelve a ejecutarlo y ahora si se parará justo donde queremos. Escribe lo siguiente > a 4b512cb > jmp 4b51395 > pulsa ENTER dos veces > d 4b512cb Ahora en la ventana donde se muestra el volcado veras la codificación de la instrucción que es E9C500000000 el proceso ahora es el mismo, salir de donde estas, abrir la dll con el editor hexadecimal, ir al offset de archivo 6CBh y modificar los seis bytes que encuentres allí por E9C500000000, salvar cambios y a correr. Si continuas la ejecución del programa este funcionará correctamente :) . Ahora funcionaran todos los ejecutables a la perfección ya que todos usan la DLL keychk.dll para comprobar el CD-ROM (el fichero que debe haber más que la unidad en si) esta es una gran ventaja ya que así nos evitamos tener que hacer cambios en todos los ejecutables. Nota: Los driver OpenGL de la number Nine Rev IV no funcionan bien con este programa y dan fallos en la dll w95glsrv.dll (que pertenece a estos drivers) al salir del programa o al cerrar ventanas de vistas en 3D, esto es debido a que los drivers son una versión Beta (los mios por lo menos) y no funcionan bien, no es por culpa de que el crack este mal hecho, como yo pensaba cuando este me petaba sin saber porque.Me volví loco hasta que descubrí que era lo que sucedia realmente. Con otras tarjetas funciona todo perfectamente. Por ej con la Intel 740. Para que luego digan que los crackers no servimos para nada, y como llamas a esto si no es buscar posibles bugs en el software?
[ Entrada | Documentos Genéricos | WkT! Web Site ]
[ Todo el ECD | x Tipo de Protección | x Fecha de Publicación | x Orden Alfabético ]
(c) Whiskey Kon Tekila [WkT!] - The Original Spanish Reversers. Si necesitas contactar con nosotros , lee esto antes e infórmate de cómo puedes ayudarnos