Quitar Protección en DLL para usarlo en otros Emuladores

Iniciado por henryxs87, 2 Noviembre 2010, 23:04 PM

0 Miembros y 1 Visitante están viendo este tema.

henryxs87

Veran estaba averiguando la razón por la cual el Plugin de Video Jabo Direct.3D8 1.7 creada para emulador proje.ct64 1.7 No funciona para los demas emuladores y me he dado cuenta que no es un problema de compactibilidad sino mas bien un sistema de protección "al menos eso parece"

El Proje.ct64/El Mupen64 son emuladores de juegos para nintendo 64 y todos ellos aceptan plugins de distintos fabricantes y los plugins de un emulador le sirven al otro y viceversa, pero el plugins que les muestro a continuacion es un caso especial, ya que Proj.ect64 1.7 tiene proteciones por todos lados, hasta en las DLL les incluyen sistema de protecion online, para que cada beta sea usada por cada donante

Ahora vamos al problema: Si cargo el Plugin Jabo 1.7 el cual solo solo funciona en proje.ct64 1.7 en el Mupen64 me sale esta ventana


Ahora buscado dentro de la Jabo Direct.3D8.DLL con el ollydbg encuentro los datos de la misma ventana de arriba


Para probar que funciona la DLL con el emulador cambien JNZ por JMP


Y salio justo la ventana que yo queria


Claro la cosa no es tan buena como se pinta si quiero acceder la pestaña advance se cuelga el emulador de N64, porque el cambio debe hacerse antes, porque nisiquiera con eso se puede emular la parte grafica del juego


A otro detalle A pesar de que en Pruebo la DLL modificada en el emulador Proje.ct64 1.7 funciona como si nada todo normal? raro?


A pero todo No termina aqui, miren este pequeño detalle que consegui en Proje.ct64.exe (Ver 1.7), Dice Proje.ct64 2.0, cosa que parecio extraña???


Lo que hice fue modificar Proje.ct64 2.0 ==> Prxject64 2.0,(En el emulador) cuando intente cargar el plugin no me carga el plugin Jabo Direct.3D8 1.7, ni la ventana ni el juego me corre, pero si pruebo con el resto de los plugins habidos y por haber del Nintendo 64 todos me funcionan a la perfección excepto el que les mencione. Lo que quiere decir Que la constante "Proje.ct64 2.0" es la llave para abrir el plugin Jabo Direct.3D8 1.7

Ahora si intento buscar alguna string relacionada dentro de la DLL ni rastros de que diga Pro.ject64 2.0

A pero claro yo marque un Breakpoint en hardware Access y memory Access en donde decia "Proje.ct64 2.0"y el unico momento que accesa es antes de que el emulador aparezca en pantalla, ya que despues no se detiene en ese punto, lo que hace pensar es que mediante operaciones matematicas "Proje.ct64 2.0" se transforma en otra cosa, que se guarda en memoria y se usa cada vez que se quiera usar Jabo 1.7(La DLL)

Yo quisiera ver como se va ejecutando la Dll con el Proje.ct64 1.7 porque es el unico que logra hacer funcionar el plugin a la perfección
El loaddll.exe que viene con ollydbg no creo que me ayude mucho en esto, porque el proje.ct64 1.7 es el unico que logra abrirlo con exito

Por si las moscas ya habia desempacado todo

Nose que me sugieren ustedes, ya les mostre todo lo que intente hacer, Espero su ayuda saludos!!!

>>> Descarga<<<
Citar
El emulador: http://www.multiupload.com/NKE7TPVP0T
El ROM ejemplo: http://www.coolrom.com/roms/n64/7581/Super_Mario_64.php

MCKSys Argentina

#1
En la imagen de Olly, fijate la direccion 1000A5B6. Ahi esta comparando la variable ubicada en 100C39A4 con cero (el valor de ESI).

Podrias buscar las referencias que hay a esa variable, a ver cuando cambia de valor...

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


henryxs87

#2
Si tambien habia visto la dirección 100C39A4 pero me extraña que haya todo ese poco de 00000, lo que quiere decir que ESI deba valer 0, para que se cumpla la condicion del salto


Por cierto estuve preparando una versión reducida 2 los dos emuladores para que cargue rapido y estan en la misma carpeta ambos emuladores desempacados,
Citar
El emulador: http://www.multiupload.com/NKE7TPVP0T
El ROM ejemplo: http://www.coolrom.com/roms/n64/7581/Super_Mario_64.php

MCKSys Argentina

#3
Pero.. buscaste las referencias a esa variable dentro de la DLL??

Asi podes ver las partes del codigo que la acceden/escriben...

MODIFICADO

Estas son las referencias a la variable:

References in Jabo_Dir:.text to 100C39A4
Address    Disassembly                               Comment
10007EC3   CMP DWORD PTR DS:[100C39A4],EDI
10007F2A   MOV DWORD PTR DS:[100C39A4],EDI
10008107   CMP DWORD PTR DS:[100C39A4],0             DS:[100C39A4]=00000000
100082A3   CMP DWORD PTR DS:[100C39A4],0             DS:[100C39A4]=00000000
100083F9   CMP DWORD PTR DS:[100C39A4],1             DS:[100C39A4]=00000000
1000842D   MOV DWORD PTR DS:[100C39A4],EAX
10008930   CMP DWORD PTR DS:[100C39A4],1             DS:[100C39A4]=00000000
1000A5B6   CMP DWORD PTR DS:[100C39A4],ESI           (Initial CPU selection)
1000A763   CMP DWORD PTR DS:[100C39A4],0             DS:[100C39A4]=00000000
1000A940   CMP DWORD PTR DS:[100C39A4],1             DS:[100C39A4]=00000000
1000AF71   CMP DWORD PTR DS:[100C39A4],EDI
1000B040   MOV DWORD PTR DS:[100C39A4],EAX
1000B0C0   CMP DWORD PTR DS:[100C39A4],1             DS:[100C39A4]=00000000


Fijate que hay 3 MOV's. Poniendo un BP en cada uno ves cual para antes de que se inicialice la DLL.

Luego, podes tracear hacia atras, buscando que es lo que verifica para que esa variable termine con el valor cero....

Parece que eso es todo.

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


henryxs87

#4
EL problema de colocar Breakpoints es que el loaddll.exe no pasa por ninguno de esos puntos lo que hice fue NOPEAR los 3 MOV de todos lo que accesan 100C39A4
Si fuese posible ver los movimientos de la DLL cuando se esta ejecutando cualquiera de los 2 emuladores seria bueno
Si la DLL fuese un exe seria mas facil porque podria tracear normalmente

MCKSys estos son los mismas referencias que me mostraste arriba solo que nopee los 3 MOV


Y fue la unica forma de obligar a que saliera esta ventana, NOPEANDO los 3 MOV


Ya que si bloqueo uno por uno Solo, NO sale esa ventana que muestro arriba o sale la ventana de abajo de error Direct3D8(ver mas abajo) o la normalita que debe salir(esa donde uno configura el plugin para el juego)

Ahora si solo NOPEO el ultimo MOV sale esto(notese que ya quite los otros 2 NOP, en comparación con la ventana anterior)



Pero en el Mupen64 sigue saliendo esta ventanita apesar de que ya NOPEE los 3 MOV y tambien sale de igual forma si solo NOPEO el 3 MOV de los que me mencionaste arriba, cosa que no sale en el Proj.ect64


Eso me hace pensar que la ventana Direct3D8 iniciateGFX error sale despues que evalua la condicion de salto JZN, porque sino se hubiese visto en el emulador

Ok sabiendo eso pues hice esto NOPEE los otros MOV de arriba y el Projec.t64 abre normal



Pero en el Mupen sigue saliendo otra vez la ventana que no quiero que salga, bueno ya esta arriba(en la ventana con la M azul que dice mupen64), para que repetirla xDD

Ha otra cosa tambien justo antes de los MOV que me mencionaste tambien probe con cuestiones asi
Para obligar que en 100C39A4 adquiera otro valor
INC EAX
INC ESI
INC EBX
Y nada que conseguí desaparecer esa ventana en el mupen, pero en el porjec,t64 tan solo sigue saliendo y en otros cambios no abre ninguna ventana

Cuando logro que el projct64 no salga ninguna ventana en el Mupen64 sigue apareciendo la misma ventanita.

Editado

Ahora que lo veo En el primer mensaje que postee justo abajo de la cara de mario, donde esta la ventana de ollydbg, donde hago notar que dice Projet64 2.0 resaltado en verde, eso despues de ciertas operaciones matematicas se guarda en algun registro de la memoria, que luego utiliza la DLL para comprobarlo y luego decidir si se deja utilizar o No ó mejor dicho que no aparezca la ventana que ya hemos visto durante el post, que ojala exista alguna manera de que responda de otra manera

LSL

en vez de nopear, cambia el MOV DWORD PTR DS:[100C39A4],xxx, para que se mueva a dicha dirección el valor 1, ya que las comparaciones por 0 son las malas, cuando se compara por 1 debe ser el valor idoneo según se ve en otras comparaciones de las expuestas por MCKSys.

como a la dirección 100C39A4 se mueve por ejemplo el valor de EAX en ese momento, intenta previamente poner a EAX con el valor 1, por ejemplo con

XOR EAX,EAX        ; pones EAX a cero
INC EAX                ; incrementas el valor de eax en 1, 0+1= 1
MOV DWORD PTR DS:[100C39A4],EAX

Tambien prueba a sumarle 2, ó incluso a mover el valor FF, pues segun las comparaciones posteriores puede que necesite valores superiores a 0 ó 1 (o valores negativos -FF)

Saludos.

LSL.

karmany

Yo quiero darte henryxs87 mi punto de vista: mira en la primera imagen que has puesto te sale el mensaje "initialize the dll before you try config it!". Es fácil saltarlo y seguramente si modificas todos los saltos te funcione pero... yo me preguntaría ¿por qué narices sale ese mensaje? ¿realmente es una protección a posta del programador?

Mi opinión es que tal vez deberías indagar un poco más con ese mensaje. Fíjate está diciendo que no configures el plugin porque todavía no ha sido inicializado. Podría ser verdad. Por eso también es posible que se haya colgado el programa. Tal vez la protección real haya sido que ha saltado por alto la subrutina de inicialización. ¿Por qué? PUes esto es lo que hay que buscar.

Con un editor de PE cualquiera puedes examinar dónde se encuentra esa subrutina. Puedes ponerle un bp y ejecutar el programa desde el emulador project a ver de dónde es llamada y después haces lo mismo desde el otro emulador y comparas a ver...

Yo es que primero iría a ver por qué sale el mensaje no lo evitaría directamente sin saber por qué...
Saludos

henryxs87

#7
Cita de: LSL en  3 Noviembre 2010, 18:45 PM
en vez de nopear, cambia el MOV DWORD PTR DS:[100C39A4],xxx, para que se mueva a dicha dirección el valor 1, ya que las comparaciones por 0 son las malas, cuando se compara por 1 debe ser el valor idoneo según se ve en otras comparaciones de las expuestas por MCKSys.

como a la dirección 100C39A4 se mueve por ejemplo el valor de EAX en ese momento, intenta previamente poner a EAX con el valor 1, por ejemplo con

XOR EAX,EAX        ; pones EAX a cero
INC EAX                ; incrementas el valor de eax en 1, 0+1= 1
MOV DWORD PTR DS:[100C39A4],EAX

Tambien prueba a sumarle 2, ó incluso a mover el valor FF, pues segun las comparaciones posteriores puede que necesite valores superiores a 0 ó 1 (o valores negativos -FF)


Por suerte donde aparece los primeros MOV añadi otro MOV arriba

MOV EAX,1
MOV DWORD PTR DS:[100C39A4],EAX

tambien intente con MOV EAX,0 y MOV EAX,-1 antes de eso y nada si pruebo un juego en el proj.ect64 1.7 funciona apesar de que tuvo que sacrificar 2 intruciones mas arribas de eso, pero sigue saliendo la misma ventana

Ahora hablando del tercer MOV, si modifico antes no funciona ni la ventana, ni el juego, claro el projec.t64 1.7 abre, pero en el Mupen 64 sigue apareciendo la mis ventana de Direct3D8

El caso es que es dificil hacer que aparezca la ventana de configuración del plugin en Mupen64 y el que aparezca la ventana de error de Direct3D8 en el Proje.ct64 1.7 tambien por ese lado pasa que sigue sin aparecer la ventana

Si por ejemplo yo obligara que 100C39A4 que valiera 0 la ventana de direct3d8 tampoco aparece en el Projec.64 1.7 antes de los 3 MOV eso es como raro???

----------------------------------
----------------------------------

Eso me hace pensar que de haber algo que modifique la direccion 100C39A4 antes o despues y ese algo podria ser el mismo emulador digo?? para ve que ocurre con el emulador proje.ct64.exe modifique esto para ver que pasaba

(OJO esta captura es del emulador EXE)
hasta incluso con una sola letra, ejemplo una k el emulador tambien
Y cuando hago ese cambio y busco cambiar la configuracion grafica no abre ninguna ventana por mas que lo intento, ah pero en el mupen64 si saca la ventanita???
Con ese cambio en el emulador puedo jugar normalmente con otros plugins, menos con el bendito plugin

Quise averiguar que ocurria si colocaba todo en cero

(OJO esta captura es del emulador EXE)

Y con eso siquiera carga el emulador, solo se queda colgado en memoria y la unica forma de verlo es con el administrador de tareas

Cita de: karmany en  3 Noviembre 2010, 18:56 PM
Yo quiero darte henryxs87 mi punto de vista: mira en la primera imagen que has puesto te sale el mensaje "initialize the dll before you try config it!". Es fácil saltarlo y seguramente si modificas todos los saltos te funcione pero... yo me preguntaría ¿por qué narices sale ese mensaje? ¿realmente es una protección a posta del programador?

Mi opinión es que tal vez deberías indagar un poco más con ese mensaje. Fíjate está diciendo que no configures el plugin porque todavía no ha sido inicializado. Podría ser verdad. Por eso también es posible que se haya colgado el programa. Tal vez la protección real haya sido que ha saltado por alto la subrutina de inicialización. ¿Por qué? PUes esto es lo que hay que buscar.

Con un editor de PE cualquiera puedes examinar dónde se encuentra esa subrutina. Puedes ponerle un bp y ejecutar el programa desde el emulador project a ver de dónde es llamada y después haces lo mismo desde el otro emulador y comparas a ver...

Yo es que primero iría a ver por qué sale el mensaje no lo evitaría directamente sin saber por qué...
Saludos
En verdad gracias por el punto de vista, mientas mas ayuda reciba mejor

Lo que ocurre es que elegi comenzar por alli fue porque es la primera ventana que sale al intentar abrir el plugin en el caso del Mupen y en el otro emulador si se cumple la condicion saca la ventana que deberia(la de configurar la parte grafica) y como todo ta de una vez junto

Si vez el primer mensaje que puse en la 2 y 3 era captura se puede ver que aparecen casi todos los elementos de las 2 ventanas para ambos emuladores, por eso me parecio bien comenzar por alli

Y si cambio el JZN por un JE(que esta en las primeras capturas que puse), las ventanas del emuladores se invienten, la que salia en uno sale en el otro y viceversa

Lo del editor PE la verdad que no se de que manera me podria ayudar, pero mas o menos pude deducir que te refieras a esto, creo??
Con eso se pued visualizar muchas de las ventanas que mustra el plugin, pero la ventana que aparece en el mupen no se relaciona con ninguno de esos valores
Pero claro mas o menos con los nombres se podria deducir, que DLLConfig es la que mas se relaciona con esa rutina

en el resto de la ventana del LORD PE sale esto
->Export Table
  Characteristics:        0x00000000
  TimeDateStamp:          0x495BED80  (GMT: Wed Dec 31 22:09:04 2008)
  MajorVersion:           0x0000
  MinorVersion:           0x0000  -> 0.00
  Name:                   0x000BDAD8  ("Jabo_Direct3D8.dll")
  Base:                   0x00000001
  NumberOfFunctions:      0x00000018
  NumberOfNames:          0x00000018
  AddressOfFunctions:     0x000BD9E8
  AddressOfNames:         0x000BDA48
  AddressOfNameOrdinals:  0x000BDAA8

  Ordinal RVA        Symbol Name
  ------- ---------- ----------------------------------
  0x0001  0x0000A940 "CaptureScreen"
  0x0002  0x000083E0 "ChangeWindow"
  0x0003  0x00007EA0 "CloseDLL"
  0x0004  0x0000A530 "DllAbout"
  0x0005  0x0000A5A0 "DllConfig"
  0x0006  0x000080A0 "DrawFullScreenStatus"
  0x0007  0x00007FB0 "DrawScreen"
  0x0008  0x00008010 "GetDllInfo"
  0x0009  0x00007F80 "GetRomBrowserMenu"
  0x000A  0x0000ADD0 "InitiateGFX"
  0x000B  0x00008060 "MoveScreen"
  0x000C  0x0000BD10 "OnRomBrowserMenuItem"
  0x000D  0x00008050 "PluginLoaded"
  0x000E  0x000080C0 "ProcessDList"
  0x000F  0x00008290 "ProcessRDPList"
  0x0010  0x00008930 "RomClosed"
  0x0011  0x0000B0C0 "RomOpen"
  0x0012  0x00036640 "SetSettingInfo"
  0x0013  0x00036670 "SetSettingInfo2"
  0x0014  0x000083B0 "ShowCFB"
  0x0015  0x00008320 "SoftReset"
  0x0016  0x0000A760 "UpdateScreen"
  0x0017  0x00028680 "ViStatusChanged"
  0x0018  0x000083C0 "ViWidthChanged


No entendi muy bien de que manera que puede ayudar Lord PE y eso de que debo colocar los breakpoints desde el emulador, si el breakpoint deberia colocarlo en la Dll y el problema es que si cargo la DLL directamente desde Loaddll.exe no se ejecuta como deberia para marcar los breakpoint y que almenos pase por algunos de esos puntos

La unica forma posible que encontre para tracear en la dll es usando "New origin here" desde un punto anterior a lo que quise analizar

Bueno ya dije mas menos lo que pude analizar, Saludos!!!

karmany

#8
Cita de: henryxs87 en  4 Noviembre 2010, 04:57 AM

Si vez el primer mensaje que puse en la 2 y 3 era captura se puede ver que aparecen casi todos los elementos de las 2 ventanas para ambos emuladores, por eso me parecio bien comenzar por alli

Y si cambio el JZN por un JE(que esta en las primeras capturas que puse), las ventanas del emuladores se invienten, la que salia en uno sale en el otro y viceversa


Pues con esto que me respondes me estás dando la razón. Ese messagebox que quieres eliminar NO es una protección del programa(en un primer vistazo, tal vez lo sea de forma secundario... me entiendes no?): es real y te lo dice claramente. Te está diciendo que lo estás intentado configurar sin haber pasado primero por la call initialize. Tiene que iniciarse primero.!!
Por eso si modificas el salto a JE en el project te sale error.. normal le estás diciendo lo contrario. Es algo lógico.
Yo estoy convencido a un 80% que no tienes que seguir el camino que has tomado. Tienes que conseguir que el plugin se inicialize antes.
Yo miraría a ver de dónde es llamada esa subrutina del msgbox.

karmany

#9
Estoy descargando project 64 1.7, el Mupen 64 y el plugin Jabo que he encontrado por ahí que no sé si estará modificado ya.

Voy a echarle un vistazo en cuanto pueda.


PD. No consigo el plugin Jabo. Todos los que me he descargado están ya modificados y alguno ni me da error en el Mupen 64. Si puedes subir el original podré echarle un vistazo.