Este programa lo consegui crackear con jump/nop, pero ahora estoy intentando crear un keygen
El programa esta compuesto por un ejecutable .net, una libreria .net y otra en ensamblador
El programa crea una license.cfg cuando te registras, compuesto de 640 caracteres que estan en el rango hexadecimal ( es decir "e4bb2..." )
donde creo que se deshace el archivo es en una funcion a la que no se como acceder
se que extern significa que esta en otra libreria, pero donde?
otra duda que tengo es en
esto parece que copia los datos de license de una a otra, y lo hace de forma mas o menos directa
una de las cosas que contiene la licencia es el generate time
He creado varias licencias con los mismos datos (solo varia el generate time)
cambia a partir de la posicion 496 del archivo de licencia
esto deberia ser una tipo de timestamp codificado
muchas gracias por leer y si teneis alguna ida decirmela XD
Un saludo
edit:
del 28 al 56 se guarda la hardwarekey (28 digitos)
en otra parte del programa se calcula (puede que de otra forma otra hw key) con MD5 (es decir 32 digitos)
Y tambien hay que tener en cuenta que la codificacion se tiene que poder hacer en los dos sentidos
El programa esta compuesto por un ejecutable .net, una libreria .net y otra en ensamblador
El programa crea una license.cfg cuando te registras, compuesto de 640 caracteres que estan en el rango hexadecimal ( es decir "e4bb2..." )
donde creo que se deshace el archivo es en una funcion a la que no se como acceder
Código [Seleccionar]
// <Module>
[SuppressUnmanagedCodeSecurity]
[MethodImpl(MethodImplOptions.Unmanaged | MethodImplOptions.PreserveSig)]
public unsafe static extern AuthenticateResult DoAuth(char*);
se que extern significa que esta en otra libreria, pero donde?
otra duda que tengo es en
Código [Seleccionar]
// <Module>
internal unsafe static License* =(License* ptr, License* ptr2)
{
<Module>.std.basic_string<char,std::char_traits<char>,std::allocator<char> >.=(ptr, ptr2);
<Module>.std.basic_string<char,std::char_traits<char>,std::allocator<char> >.=(ptr + 28, ptr2 + 28);
<Module>.std.basic_string<char,std::char_traits<char>,std::allocator<char> >.=(ptr + 56, ptr2 + 56);
<Module>.std.basic_string<char,std::char_traits<char>,std::allocator<char> >.=(ptr + 84, ptr2 + 84);
<Module>.std.basic_string<char,std::char_traits<char>,std::allocator<char> >.=(ptr + 112, ptr2 + 112);
<Module>.std.basic_string<char,std::char_traits<char>,std::allocator<char> >.=(ptr + 140, ptr2 + 140);
*(ptr + 168) = *(ptr2 + 168);
return ptr;
}
esto parece que copia los datos de license de una a otra, y lo hace de forma mas o menos directa
una de las cosas que contiene la licencia es el generate time
Código [Seleccionar]
public static string GetLicenseGenerateTime()
{
return new string(<Module>.std.basic_string<char,std::char_traits<char>,std::allocator<char> >.c_str(ref <Module>.g_licence + 140));
}
He creado varias licencias con los mismos datos (solo varia el generate time)
cambia a partir de la posicion 496 del archivo de licencia
Código [Seleccionar]
f9a8828716eb09ebbc230efcad39d2a3
esto deberia ser una tipo de timestamp codificado
muchas gracias por leer y si teneis alguna ida decirmela XD
Un saludo
edit:
del 28 al 56 se guarda la hardwarekey (28 digitos)
en otra parte del programa se calcula (puede que de otra forma otra hw key) con MD5 (es decir 32 digitos)
Y tambien hay que tener en cuenta que la codificacion se tiene que poder hacer en los dos sentidos