Tutorial de 3D Studio Max R2.5 & v3.1

http://www.ktx.com - Página Web.
3D Studio Max R2.5

Cersión 3.1 - 3 de Junio del 2000 (Sólo para Windows NT )

Después de que se censurase este tutorial en Febrero por la fanática BSA(no se bien que quiere decir ¿?) he decidido correr el riesgo actualizándolo y reeditándolo, si yo recibo alguna demanda judicial de Autodesk para eliminar este documento,desaparecerá sin previo aviso (hay ya demasiados cracks para 3DSMax v3.1 así que este documento no perjudicará a nadie, el mejor que yo he visto es el de Harvest , el peor es DOD's el cuál sería mejor olvidar). Nosotros veremos en esta práctica sobre protección v3.1's que AutoDesk realmente ha aprendido bastante desde su fallido intento de proteger R2.5, a pesar de eso, tristemente, lo que permite realmente esta practica es la gran vulnerabilidad del Sentinel, a sí mismo Kinetix también podría aceptar ciertamente parte de la culpa (observad las comprobaciones del CRC abajo). Comenzaremos observando la protección del asistente para la intalación(Install Shield),un serial # de formato 3-8 y una CD-Key.

Los cuadros de entrada de datos aceptan todo lo que se introduzca,observamos el directorio temporal del asistente de instalación vemos unas cuantas dll's pero la que realmente nos interesa es Identify.dll , (InstUtil.dll aparenta ser una dll de la instalación y que sus 4'5k son demasido pequeños para contener una protección tan magnífica, Browse.dll y Regplugs.dll son también fácilmente suprimidos). Observando alrededor de las exportaciones y descompilando el script tu podrás encontrar que Identify.ValidateKeyWithPrefix() es la función a analizar, puedes verificar que parchear 1 en EAX autoriza que a la instalación que prosiga.

Yo eché un pequeño vistazo para ver como trabaja esta función, es bastante simple con una tabla un poco de aricmética básica y un simple XOR, lo que fastidia acerca del esquema es que trabaje aparte con las combinaciones del número de serie generado con el correspondiente CD-Key, (es fácil encontrar los códigos correcto porque son comparados en el Offset 0x2651). Verás mas tarde que 3DSMax también comprueba si los tres primeros dígitos de tu número de serie son 110, el resto puedes ponerlo tu líbremente (dentro del rango 00000000-99999999), así que un ejémplo de número de serie podría ser 110-99999999, CD Key 2SERDV, vamos a instalarlo.

Ahora cargamos 3dsmax.exe con el IDA (si quieres puedes grabar alguna aplicación de búsqueda como el Sentinel de Killer_3K de la firma FLIRT ), lo que tu encontrarás es que la protección está realizada alrededor de sproFindFirstUnit(), sproRead() y sproQuery(), la utilización del query es nueva. lo primero que hay que hacer es parchear sproFindFirstUnit(sub_5D8B61) , es muy fácil y no voy a describirlo ahora. Después debemos encontrar el código correcto de autorización, esto es bastante intrascendente, 5D2251 comprueba la longitud (8) y 5D2497 hace la comparación real, para mi ejemplo anteriormente citado el código es B63A197B.

sproRead(_5D8D30) tiene 2 referencias, cada vez que 0 es cargado como la dirección de la dirección a leer, esto es igual que para la R2.5, yo no he podido comprobarlo en un uso normal de 3DSMax , yo estoy bastante seguro de que se ha sunministrado como una interfaz para desarrolladores de Plugins. Trivially rewrite sproRead() just in case, debemos colocar un bpx en sproQuery(_5D9120) pienso,que esto llevará algún tiempo para comprobarse. Como no tenemos métodos para averiguar como responder esta query debería estar bien reescribir sproQuery() para regresar a la última string que nosotros podemos reconocer :-

:005D9142 JZ 005D9144 <-- Hacia nuestra rutina.
:005D9144 PUSH EBP <-- graba EBP.
:005D9145 MOV EAX, [ESP+18] <-- Obtiene el número de bytes la query string.
:005D9149 XCHG ECX, EAX <-- en ECX.
:005D914A CALL $+5 <-- prefija delta.
:005D914F POP EBP <-- Delta.
:005D9150 LEA ESI, [EBP+12] <-- Comienza el query de regreso (max. 56 bytes).
:005D9153 MOV EDI, [ESP+20] <-- Dónde almacenarlo.
:005D9157 REPZ MOVSB <-- Move.
:005D9159 XCHG ECX, EAX <-- Restore ECX and clear EAX.
:005D915A POP EBP <-- Requerido.
db 56 dup(0) <-- Respuesta simulada para el query.

Como tu podrás ver con el SoftICE, solo 4 bytes de la query de respuesta son comprobados por el strcmp() en 0046F65A,sinembargo las query strings no son las mismas en cada occasion . De hecho es más complicado porque esta área del código es comprobada por el CRC en muchas ocasiones, aquí hay una de esas comprobaciones:-

:00431058 MOV ESI, 0046F190 <-- Comienza aquí.
:0043105D XOR EAX, EAX <-- Limpia EAX.
:0043105F CMP ESI, 0046F900 <-- Comprueba hasta aquí.
:0043106A MOV ECX, 0046F190
:00431071 XOR EDX, EDX <-- Limpia EDX.
:00431073 MOV DL, [ECX] <-- Obtiene byte @ [ECX].
:00431075 INC ECX <-- Incrementa ECX.
:00431076 CMP ECX, 0046F900 <-- Hace todas las comprobaciones.
:0043107C NOT EDX <-- EDX es comprobado.
:00431082 JB 00431071
:00431084 SUB EAX, [006298A4] <-- Debe valer 0.

Si tu parcheas strcmp() tu crearás problemas con todas las comprobaciones de CRC y "eso es malo,muy malo" (En el estilo de Rainman , si tu has visto la película de Dustin Hoffman :-) ). No es muy práctico sentarse a esperar o buscar todas las comprobaciones. En lugar de eso nosotros modificaremos nuestro código de emulación sproQuery() para asegurarnos de que nos haga el trabjo dificil :-

:005D9142 JZ 005D9144 <-- Hacia nuestra rutina.
:005D9144 MOV EAX, [ESP+14] <-- Número de bytes en la string del query .
:005D9148 XCHG ECX, EAX <-- La coloca en ECX.
:005D9149 LEA ESI, [ESP+38] <-- Obtiene una respuesta de la dirección.
:005D914D MOV EDI, [ESP+1C] <-- Dónde colocarla.
:005D9151 REPZ MOVSB
:005D9153 XCHG ECX, EAX <-- Restaura ECX/Limpia EAX.

Nuestro strcmp() trabaja ahora como nosotros queremos y no hay necesidad de ensuciarnos las manos parcheando y cambiando la modificación de Kinetix's para comprobar nuestra rutina. Así que nosotros vemos aquí que aunque Kinetix ha hecho algunas modificaciones , su protección es igual, sigue siendo fácil de aislar y ha incluido errores, he oido un rumor que dice que en la versión 4 veremos un aumento de protecciónn, esperaremos para ver eso :-). Mira Kinetix, aqui no hay un crack listo para hacerse, los perdedores que se encargan de piratear tu software no encontraran una respuesta ni la forma de hacerlo aquí.

R2.5 - 6 de Octubre de 1999

Bienvenidos a este turial de Dongle en el cual estoy repasando un antiguo enemigo, un Sentinel.Yo asumo que que tu has descargado los ficheros necesarios para este tutorial o tienes acceso a ellos, el primer paso es ejecutar maxauth.exe para autorizar tu copia de 3D Studio Max. Yo no estoy interesado en mostrar como crackear esta parte, bpx GetDlgItemTextA y trazar, parchear y trabajar con el message box (desensamblar), o simplemente ver el contenido de 1039120D (Serial # 661-93842762, CD-Key V13M).

Cargar 3DSMax produce un error esperado, aún así tu deberías ser capaz de encontrar la dirección de la nag screen con bpx MessageBoxA. 00450F21 parece ser la rutina ofensiva, observa la instrucción CALL EBP , la cuál es por supuesto la responsable de la llamada a la MessageBoxA. Nosotros podemos intenter examinar ahora el contenido de 3dsmax.exe con el W32Dasm, aún así ocurre algo, inténtalo y lo verás, a pesar de desensamblarlo, W32Dasm parece que lanza involuntariamente 3DSMax y tendrás si suerte lo peor que puede te ocurrir es que regreses a SoftICE con un error.

En este punto tenemos algunas opciones, cualquiera de ellas muestra que trucos se estan usando para inhabilitar W32Dasm o usar IDA el cual no parece tener el mismo problema. yo usé el W32Dasm durante un rato cuando con un bpx ReadFile en el diálogo de abrir archivo y tracé con detenimiento através de la memoria, archivo abierto y encontrada la instrucción ofensiva en 0045C6D2, desafortunadamente revertir el Flag causa un error interno en cw3220.dll al cuál no veo forma de resolver .

Esto nos deja a solas con el IDA, sin embargo desensamblar 3dsmax.exe temo que puede llevar un rato. Por ahora nos permite comenzar nuestra pruebas usando SoftICE, una posible línea de ataque puede ser un bpx CreateFileA, la razón es la siguiente. Sabemos que el programa debe abrir un driver para comunicarse con el dongle (en este caso sentinel.vxd) y como este archivo no está instalado en nuestro sistema la llamada API va a fallar ciértamente así que nosotros podemos colocar un IF condicional encima de este breakpoint. Vamos a hacer lo siguiente:

bpx CreateFileA if EAX==ffffffff <-- 2 signos iguales.

* Observa que tu puedes utilizar bpio -h 378 rw también.

Seguro que tras varias interrupciones irrelevantes en el SoftICE, paramos en lo siguiente:

:0055214C PUSH 00552120
:00552151 CALL KERNEL32!CreateFileA

Este código está donde nosotros queremos empezar a trazar, probablemente es más fácil seguir con el SoftIce lader usando el comando g. No es necesario decir que el salto condicional después de esta ruptura necesita ser invertido. Una vez de vuelta a este punto nosotros comenzaremos a presionar el F12 hasta que nuestro messagebox aparezca, seguramente lo encontrarás tras pulsarlo 6 veces aprox (o más depende)y deberás encontrarte en la dirección 00450DFD es lo más lejos a lo que puedes llegar.

Evidentemente, 00450DFD es un buen entry point, recordemos que nosotros sabemos la dirección del messagebox (0045FD21), this is not too en gran medida y un análisis del código aconsejable. Sólo un simple paso y quizás algo de Pensamiento Zen debería hacernos ver este código sospechoso(lo siguiente ha sido extraido del IDA).

:00450E5C MOV EDX, DWORD_561248
:00450E62 XOR EDX, 73ADh
:00450E68 PUSH EDX
:00450E69 LEA EDX, [ESP+678+var_464]
:00450E70 PUSH EAX
:00450E71 CALL SUB_552A50
:00450E76 TEST AX,AX <-- AX = 3 aquí el dongle no está presente.
:00450E79 JZ loc_450F23

Miremos este código e intentemos entender porqué esto debe ser una comprobación , también miremos que ocurre cuando nosotros fallamos en el prime JZ, increible pero cierto, el progrma hace una repetición muy vista del código , 3DSMax evidentemente trata de acceder al código tres veces al dongle antes de mostrarnos la messagebox. Nosotros podemos usar el Sentinel como una guía propia del API para hacer coincidir una función específica, esto me parece un sproFindFirstUnit() o algo parecido , A0A3 creo que es el creador de ID de Kinetix's. Naturalmente nosotros usaremos este '7242'como una cadena de búsqueda para identificar otra comprobación del Sentinel.

Como yo he estado viendo unos cuantos Sentinels através de los años yo espero localizar una 15 referencias'7242', la proximidad de la dirección debe eliminarse porque ciertamente es una biblioteca que cada desarrolladorestá usando independientemente para desarrollar todas sus funciones. Utilizando IDA te será posible ver que el resto de las funciones no son alcanzadas nunca, lo mejor del IDA es su seguimiento a todos los caminos de ejecución así que a menos que tu recibas páginas de error tu puedes estar muy satisfecho de sus resultados.

Así como aparte, también hay una comprobación dentro de util.dll, uno de los cuales es sunministrado como interfaz para algún diseñador de Plugins, es exportado como HardwareLockID, y parece llamar sproFindFirstUnit (CALL 2802BEF0) y a sproRead() (CALL 2802C0C0) para recuperar el serial,los cuales tu debes parchear al final de la función EAX debe estat tu número de serie dongle :-), de otra forma XOR EAX, EAX no te permitirá verlo.


© 1998, 1999, 2000 CrackZ. 3rd June 2000.

Traducido por John Keeper 2.000 JKEEPER@CORREO.DE
www.000webhost.com