elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  Foro de elhacker.net
|-+  Programación
| |-+  Ingeniería Inversa (Moderadores: karmany, .:UND3R:., MCKSys Argentina)
| | |-+  Ayuda para modificar una dll .NET
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda para modificar una dll .NET  (Leído 10,437 veces)
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.866



Ver Perfil
Ayuda para modificar una dll .NET
« en: 7 Enero 2014, 06:54 am »

Hola, antes de nada quiero advertir que no se casi nada sobre el tema.

Agradecería cualquier ayuda para craquear esta dll ~> http://elektrostudios.tk/RapidDesign.zip
(símplemente por experimentar cosas nuevas, en plan educativo, pues la licencia solo cuesta 10$ y creo q todos podemos permitirnos esa pequeña cantidad de dinero).

Creo que la dll hace una comprobación online para decidir si un serial es válido o no, no se cuantas alternativas tendré, quiero decir:

1. omitir la comprobación del serial ?
2. no omitir la comprobación pero aceptar cualquier serial como válido ?
3. no mostrar el recordatorio de "programa caducado, registrese..." ?

...En un principio yo creo que omitiendo la comprobación del serial sería suficiente, así que eso estoy intentando.

El plugin se puede descargar aquí: http://www.rapiddesignaddin.com/Downloads.aspx?fn=RapidDesign.vsix

Como veis pide un serial de 12 caracteres:







La idea es manipular la dll para que acepte cualquier serial, o que se quede registrada sin pedir ningun serial ni hacer ninguna comprobación, u omitir el recordatorio de licencia expirada (aunque no se si eso sería suficiente).

Sé cosas muy básicas sobre Reflection, pero esto me supera y después de unas investigaciones sobre la iniciación en el cracking de dll's (de lo cual encuentro poquísimo o no se buscar bien) hasta aquí es hasta donde he llegado:

1. Lo primero que hice fue usar de4dot para comprobar si la dll está ofuscada/protegida, me dice que ha encontrado un tipo de ofuscación desconocido, pero también me dice lo mismo con otras dll's que no tienen ningún tipo de protección, así que doy por entendido que la dll no está protegida (claro que no lo está, si puedo ver todas las classes perféctamente).

2. Seguídamente busqué tutoriales y blablabla

3. Abrí el reflector (también probé con el SAE) y busque classes/métodos relacionados sobre el registro de licencia, encontré esto:



4. Examiné uno de los métodos (por alguna hay que empezar a probar suerte), copié el código del método y lo modifiqué a mi gusto en el bloc de notas:



5. Descargué el plugin Reflexil (esta es la parte que leí en un tutorial, si es que se le puede llamar así: http://forums.reflector.net/questions/1918/how-to-modify-code-in-net-dll-and-save-these-chang.html ) para intentar reemplazar el método antiguo por el que yo he modificado en el bloc de notas:

use Reflexil with the "Replace all with code" feature. Paste the code and fix imports. Should be ok.

Pero aquí es donde me pierdo, no sé como editar corréctamente las instrucciones para devolver un True, no devolver el resultado de otra función.

Tampoco sé si el código que hice en el bloc de notas puede reemplazarlo diréctamente por el código del método oriiginal, para no complicar más las cosas editando cada casilla de instrucciones manuálmente...

Al compilar me da errores de visibilidad inaccesible por el tipo de nivel de protección...





« Última modificación: 7 Enero 2014, 07:21 am por Eleкtro » En línea



MCKSys Argentina
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.513


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: Ayuda para modificar una dll .NET
« Respuesta #1 en: 7 Enero 2014, 14:17 pm »

En realidad, sólo necesitas modificar el return flag final por return True. No necesitas reemplazar TODO el codigo de la función (aunque deberías poder hacerlo).

Fijate el mismo codigo, pero en formato IL y verás cómo hace el primer return. Luego, modifica solo esa instruccion para que devuelva True...  ;)

La idea es que sigas jugando un poco...  :P

Saludos!

Te dejo un par de tutes de la web de ricardo sobre el tema:

tute1

tute2
En línea

MCKSys Argentina

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

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.866



Ver Perfil
Re: Ayuda para modificar una dll .NET
« Respuesta #2 en: 7 Enero 2014, 14:55 pm »

En realidad, sólo necesitas modificar el return flag final por return True.

Hola

Gracias por la información MCKSys Argentina pero eso es precísamente lo que intentaba hacer, devolver un valor predefinido (True) para evitar devolver el valor que devuelve la función que toma el HardwareId y demás

Intenté hacerlo como tu explicaste pero para mi es algo totálmente nuevo esto de las instrucciones MSIL y los opcodes, la forma interna en la que trabaja el compiler.

Si no me equivoco y esto es a lo que te refieres entonces ya lo intenté:
Código:
IL_0003: brfalse.s IL_0031
por:


(También probé a modificar otra instrucción igual a brtrue.s)

Pero al intentar validar un serial, el plugin dice que la clave no es válida.

Segúramente hice algo mal, o falta algo más por hacer.

EDITO: Así es como dejé las instrucciones por el momento:

Código:
    IL_0000: ldc.i4.0
    IL_0001: stloc.0
    IL_0002: ldarg.0
    IL_0003: brtrue.s IL_0031
    IL_0005: ldarg.0
    IL_0006: call bool ZUIINFRAspzoo.RapidDesign.Registration.RegistrationManager#0x02000002::VerifySignature(class [System.Xml]System.Xml.XmlDocument)
    IL_000b: brtrue.s IL_0031
    IL_000d: ldarg.0
    IL_000e: call class ZUIINFRAspzoo.RapidDesign.Common.RegistrationData ZUIINFRAspzoo.RapidDesign.Registration.RegistrationManager#0x02000002::GetRegistrationData(class [System.Xml]System.Xml.XmlDocument)
    IL_0013: stloc.1
    IL_0014: call class ZUIINFRAspzoo.RapidDesign.Common.MachineFingerprint ZUIINFRAspzoo.RapidDesign.Registration.RegistrationManager#0x02000002::GetCurrentMachineFingerprint()
    IL_0019: stloc.2
    IL_001a: ldloc.2
    IL_001b: callvirt instance string ZUIINFRAspzoo.RapidDesign.Common.MachineFingerprint#0x0200003e::get_HardwareId()
    IL_0020: ldloc.1
    IL_0021: callvirt instance class ZUIINFRAspzoo.RapidDesign.Common.MachineFingerprint ZUIINFRAspzoo.RapidDesign.Common.RegistrationData#0x02000035::get_MachineFingerprint()
    IL_0026: callvirt instance string ZUIINFRAspzoo.RapidDesign.Common.MachineFingerprint#0x0200003e::get_HardwareId()
    IL_002b: call bool [mscorlib]System.String::op_Equality(string, string)
    IL_0030: stloc.0
    IL_0031: ldloc.0
    IL_0032: ret
} // end of method RegistrationManager::CheckLicense

EDITO2:

Después de empezar a leer el magnifico tutorial que me diste, ahora lo veo un poco más claro, iba por el mal camino, lo que yo estaba haciendo al modificar "brtrue.s " era modificar la sintaxis de la condición (sin pecatarme) por ejemplo:
Código:
A = B
A != B

Pero es todo mucho más básico que eso, lo que debo cambiar es los opcodes, de 0 (false) a 1 (true) para conseguir modificar un valor boolean como este:
Código:
bool result = true;

eso ya lo conseguí, pero me falta algo más tengo que conseguir modificar el ultimo ret, sigo intentándolo.
« Última modificación: 7 Enero 2014, 15:37 pm por Eleкtro » En línea



Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.866



Ver Perfil
Re: Ayuda para modificar una dll .NET
« Respuesta #3 en: 7 Enero 2014, 15:42 pm »

Ahora lo tengo así, o consigo modificar el ultimo return para devolver un True, o elimino todo el if entero xD, ¿tienes idea de como podría eliminar la condicional del if?.

Código
  1. // ZUIINFRAspzoo.RapidDesign.Registration.RegistrationManager
  2. public static bool CheckLicense(XmlDocument licenseXml)
  3. {
  4.   bool result = true;
  5.   if (licenseXml != null && RegistrationManager.VerifySignature(licenseXml))
  6.   {
  7.       RegistrationData registrationData = RegistrationManager.GetRegistrationData(licenseXml);
  8.       MachineFingerprint currentMachineFingerprint = RegistrationManager.GetCurrentMachineFingerprint();
  9.       result = (currentMachineFingerprint.HardwareId == registrationData.MachineFingerprint.HardwareId);
  10.   }
  11.   return result;
  12. }
  13.  

He visto la opción "Nop" al editar las instrucciones, no se si es algo parecido a un "rellenar con ceros" ...para eliminar la instrucción, pero siempre me da fallos.
« Última modificación: 7 Enero 2014, 15:47 pm por Eleкtro » En línea



MCKSys Argentina
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.513


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: Ayuda para modificar una dll .NET
« Respuesta #4 en: 7 Enero 2014, 15:51 pm »

Fijate en esta parte:

Código:
    IL_002b: call bool [mscorlib]System.String::op_Equality(string, string)
    IL_0030: stloc.0
    IL_0031: ldloc.0
    IL_0032: ret

El call llama a la función System.String::op_Equality osea, compara dos strings. Ahora, la siguiente instrucción, le dice dónde guardar el resultado de esa comparación. stloc.0 sería algo como "store in local var 0", y 0 es la 1er variable definida (osea flag).

Si NOPeas esa instrucción y colocas TRUE al inicio en esa variable, debería funcionar sin mayores cambios.

En otras palabras, la posible solución sería:

1) Inicializar flag a True.
2) NOPear la parte que sobreescribe el valor de la variable (IL_0030: stloc.0)
3) Listo. (ldloc.0 seria algo como "load from local var 0". El ret sale de la función, por lo que cuando decompilás en alto nivel, te sale ret flag (flag es la variable local que esta en el index 0)

Como ves, hay varias formas de solucionar este tema. Como te dije antes, la idea es jugar un poco...   ;D

Saludos!
En línea

MCKSys Argentina

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

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.866



Ver Perfil
Re: Ayuda para modificar una dll .NET
« Respuesta #5 en: 7 Enero 2014, 15:59 pm »


Código:
    IL_0030: stloc.0

Si NOPeas esa instrucción y colocas TRUE al inicio en esa variable, debería funcionar sin mayores cambios.

2) NOPear la parte que sobreescribe el valor de la variable (IL_0030: stloc.0)
3) Listo.

he hecho esas dos únicas modificaciones, pero me da error al intentar leer el código:

Código:
Inconsistent stack size at IL_30

  en ICSharpCode.Decompiler.ILAst.ILAstBuilder.StackAnalysis(MethodDefinition methodDef)
  en ICSharpCode.Decompiler.Ast.AstMethodBodyBuilder.CreateMethodBody(IEnumerable`1 parameters, ConcurrentDictionary`2 localVariables)
  en ICSharpCode.Decompiler.Ast.AstMethodBodyBuilder.CreateMethodBody(MethodDefinition methodDef, DecompilerContext context, IEnumerable`1 parameters, ConcurrentDictionary`2 localVariables)

Código:
    IL_0030: nop



EDITO:

Como no funcionaba lo que me dijiste, empecé a nopear más indices extraños y llamadas de funciones, y miira como me quedó ahora -.-

Código
  1. // ZUIINFRAspzoo.RapidDesign.Registration.RegistrationManager
  2. public static bool CheckLicense(XmlDocument licenseXml)
  3. {
  4.   bool result = true;
  5.   return licenseXml;
  6. }

Estoy a un paso de conseguirlo pero no se muy bien como xD

Código:
    IL_0000: ldc.i4.1
    IL_0001: stloc.0
    IL_0002: ldarg.0
    IL_0003: nop
    IL_0004: ldarg.0
    IL_0005: nop
    IL_0006: nop
    IL_0007: ldarg.0
    IL_0008: nop
    IL_0009: nop
    IL_000a: nop
    IL_000b: nop
    IL_000c: nop
    IL_000d: nop
    IL_000e: nop
    IL_000f: nop
    IL_0010: nop
    IL_0011: call bool [mscorlib]System.String::op_Equality(string, string)
    IL_0016: nop
    IL_0017: ldloc.0
    IL_0018: ret
« Última modificación: 7 Enero 2014, 16:08 pm por Eleкtro » En línea



MCKSys Argentina
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.513


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: Ayuda para modificar una dll .NET
« Respuesta #6 en: 7 Enero 2014, 16:10 pm »

Tienes razón!!! El stack, el maldito stack.... perdón por eso  :-[

Bueno, entonces lo que podrías probar, es en el código original reemplazar el ldloc.0 por ldc.i4.1

Osea:

Código:
IL_0031: ldloc.0

por

Código:
IL_0031: ldc.i4.1

Dime si así funciona...
En línea

MCKSys Argentina

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

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.866



Ver Perfil
Re: Ayuda para modificar una dll .NET
« Respuesta #7 en: 7 Enero 2014, 16:17 pm »

Dime si así funciona...

Que grande, tengo que aprender a manejar los opcodes xD

Las instrucciones quedaron de forma que envia un True al final del método, pero aún así el plugin sigue diciendo que el serial es inválido, asi que me imagino que esto es en vano... y la manera de craquearlo será modificando otro method distinto.

PD: También probé devolviendo un False (por probar...)
Código:
IL_0031: ldc.i4.0
...pero tampoco funcionó.

Creo que no se puede hacer nada más por el momento, tendré que seguir investigando otros methods,
gracias.
« Última modificación: 7 Enero 2014, 16:19 pm por Eleкtro » En línea



MCKSys Argentina
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.513


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: Ayuda para modificar una dll .NET
« Respuesta #8 en: 7 Enero 2014, 16:20 pm »

La idea es jugar un poco con los opcodes. Así aprendes mas rapido (y en mayor cantidad).

Lo cual es muy útil para cuando te enfrentas a ofuscación y demás yerbas, donde no tienes codigo en alto nivel y sólo puedes tocar el IL...

Saludos!

En línea

MCKSys Argentina

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

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.866



Ver Perfil
Re: Ayuda para modificar una dll .NET
« Respuesta #9 en: 7 Enero 2014, 16:36 pm »

Es posible que a pesar de la modificación la causa de que no se valide la clave pueda ser debido a que quizás en el código original puede existir algo parecido a esto:

(al clickar el botón de 'OK')
Código:
If (MétodoDeValidación1 y MétodoDeValidación2) = True
 Validado = True
Else
 Validado = False
End

El problema es que no se como puedo verificar esto porque si busco por el evento "OnClick" (como me recomendó .:UND3R:.) no me sale ningún resultado de búsqueda, y el maldito SAE me está dando por culo con el sensitive-case en las búsquedas (arggg).

Aparte, se supone que el plugin tiene un trial de 14 días, y que al acabarse el periodo trial la aplicación se vuelve 'inaccesible', quizás esto último sería un mejor enfoque que lo de bypassear las posibles validaciones que existan, pero de todas formas tampoco encuentro nada relacionado.

Saludos!
En línea



Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda para modificar .exe de MS-DOS 16-bit para saltar serial
Ingeniería Inversa
pic16f876 5 9,183 Último mensaje 12 Febrero 2010, 15:05 pm
por ThunderCls
Ayuda para Modificar dll y exe en .NET para saltarse la licencia
Ingeniería Inversa
alfavigo 1 2,290 Último mensaje 3 Febrero 2014, 16:48 pm
por MCKSys Argentina
[ayuda] Crear para modificar archivos [ayuda]
Dudas Generales
stifmstr 1 2,472 Último mensaje 5 Febrero 2014, 22:27 pm
por z3nth10n
Ayuda para modificar plantilla de Prestashop
Desarrollo Web
Linton 0 1,882 Último mensaje 27 Febrero 2014, 19:39 pm
por Linton
Ayuda para modificar un .exe
Ingeniería Inversa
Soul9810 5 3,046 Último mensaje 16 Noviembre 2018, 20:29 pm
por Soul9810
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines