Autor
|
Tema: ¿Alguien me aclara? (Leído 5,147 veces)
|
catalinilla
Desconectado
Mensajes: 28
|
Hola a todos, pues nada que estoy empezando un poco con esto de la ingenieria inversa y empapandome de tutos que encuentro por la red. La cuestion es que tengo un programa que me gustaria poder sacarle un keygen y despues de analizarlo con el reflector y teniendo unas ideas muy básicas creo que aqui se genera el serial, a ver si alguien me pudiera explicar un poquito, que es lo que hace aunque intente yo terminarlo. Un salu2 y gracias de antemano
Private Function ComprueboClavesHARDKeySTD(ByVal valores As Byte(), ByVal claves As Byte(), ByVal Lote As Integer, ByVal Serie As Integer) As Boolean Dim num3 As Integer = valores(3) Dim num4 As Integer = valores(7) Dim num5 As Integer = (((num3 + num4) * num3) + num4) Dim num As Integer = CInt(Math.Round(Conversion.Val(Strings.Mid(Serie.ToString, 1, 3)))) Dim num2 As Integer = CInt(Math.Round(Conversion.Val(Strings.Right(Serie.ToString, 2)))) Serie = CInt(Math.Round(Conversion.Fix(Math.Abs(CDbl((CDbl((Serie * num2)) / CDbl(num))))))) Dim num6 As Integer = CInt(Math.Round(Math.Abs(CDbl((CDbl((((num5 + Lote) + Serie) * Serie)) / 30))))) Do While (num6 > &H2710) num6 = CInt(Math.Round(Conversion.Fix(CDbl((CDbl(num6) / 2))))) Loop Dim buffer As Byte() = New Byte(8 - 1) {} Try buffer(0) = Me.ObtengoByte(CInt(Math.Round(Conversion.Fix(CDbl(((CDbl(num6) / CDbl(valores(0))) + 1)))))) buffer(1) = Me.ObtengoByte(CInt(Math.Round(Conversion.Fix(CDbl(((CDbl(num6) / CDbl(valores(1))) + 2)))))) buffer(2) = Me.ObtengoByte(CInt(Math.Round(Conversion.Fix(CDbl(((CDbl(num6) / CDbl(valores(2))) + 4)))))) buffer(3) = Me.ObtengoByte(CInt(Math.Round(Conversion.Fix(CDbl(((CDbl(num6) / CDbl(num3)) + 8)))))) buffer(4) = Me.ObtengoByte(CInt(Math.Round(Conversion.Fix(CDbl(((CDbl(num6) / CDbl(valores(4))) + 16)))))) buffer(5) = Me.ObtengoByte(CInt(Math.Round(Conversion.Fix(CDbl(((CDbl(num6) / CDbl(valores(5))) + 32)))))) buffer(6) = Me.ObtengoByte(CInt(Math.Round(Conversion.Fix(CDbl(((CDbl(num6) / CDbl(valores(6))) + 64)))))) buffer(7) = Me.ObtengoByte(CInt(Math.Round(Conversion.Fix(CDbl(((CDbl(num6) / CDbl(num4)) + 128)))))) Catch exception1 As Exception ProjectData.SetProjectError(exception1) Dim exception As Exception = exception1 Me.CodigoError = &H2710 ProjectData.ClearProjectError Return False End Try Dim index As Integer = 0 Do If (buffer(index) <> claves(index)) Then Me.CodigoError = &H378 Return False End If index += 1 Loop While (index <= 7) Return True End Function
|
|
|
En línea
|
|
|
|
KJD
Desconectado
Mensajes: 314
|
Pues tienes suerte de que pudieses decompilarlo, un consejo que te doy, es que empiezes a buscar en el MSDN de microsoft, que hace cada funcion y veas que arroja como resultado. Otra cosa que podrias hacer es crear con el Visual Studio un proyecto, pegar el codigo, que luego tendras que arreglar, y tracearlo haber que es lo que va pasando con las diferentes variables. PD: Te dejo el codigo en c# del mismo codigo que posteaste tu por si sabes c++ o c#, para entenderlo mejor private bool ComprueboClavesHARDKeySTD(byte[] valores, byte[] claves, int Lote, int Serie) { int num3 = valores(3); int num4 = valores(7); int num5 = (((num3 + num4) * num3) + num4); int num = (int)Math.Round(Conversion.Val(Strings.Mid(Serie.ToString, 1, 3))); int num2 = (int)Math.Round(Conversion.Val(Strings.Right(Serie.ToString, 2))); Serie = (int)Math.Round(Conversion.Fix(Math.Abs((double)((double)(Serie * num2) / (double)num)))); int num6 = (int)Math.Round(Math.Abs((double)((double)(((num5 + Lote) + Serie) * Serie) / 30))); while ((num6 > 0x2710)) { num6 = (int)Math.Round(Conversion.Fix((double)((double)num6 / 2))); } byte[] buffer = new byte[8]; try { buffer(0) = this.ObtengoByte((int)Math.Round(Conversion.Fix((double)(((double)num6 / (double)valores(0)) + 1)))); buffer(1) = this.ObtengoByte((int)Math.Round(Conversion.Fix((double)(((double)num6 / (double)valores(1)) + 2)))); buffer(2) = this.ObtengoByte((int)Math.Round(Conversion.Fix((double)(((double)num6 / (double)valores(2)) + 4)))); buffer(3) = this.ObtengoByte((int)Math.Round(Conversion.Fix((double)(((double)num6 / (double)num3) + 8)))); buffer(4) = this.ObtengoByte((int)Math.Round(Conversion.Fix((double)(((double)num6 / (double)valores(4)) + 16)))); buffer(5) = this.ObtengoByte((int)Math.Round(Conversion.Fix((double)(((double)num6 / (double)valores(5)) + 32)))); buffer(6) = this.ObtengoByte((int)Math.Round(Conversion.Fix((double)(((double)num6 / (double)valores(6)) + 64)))); buffer(7) = this.ObtengoByte((int)Math.Round(Conversion.Fix((double)(((double)num6 / (double)num4) + 128)))); } catch (Exception exception1) { ProjectData.SetProjectError(exception1); Exception exception = exception1; this.CodigoError = 0x2710; ProjectData.ClearProjectError(); return false; } int index = 0; do { if ((buffer(index) != claves(index))) { this.CodigoError = 0x378; return false; } index += 1; } while ((index <= 7)); return true; }
|
|
|
En línea
|
"Solo hay 10 tipos personas que saben leer binario, los que si y los que no"
"Keyboard not Found, press F1 To Continue" WTF???
|
|
|
catalinilla
Desconectado
Mensajes: 28
|
Gracias KJD por la respuesta.
|
|
|
En línea
|
|
|
|
KJD
Desconectado
Mensajes: 314
|
Otra cosa que me olvidaba, si cambias el
while ((index <= 7)); por while ((True)); y el if ((buffer(index) != claves(index))) por if ((True)) el programa ya esta crackeado siempre y cuando el programa no tenga mas chekeos.
|
|
|
En línea
|
"Solo hay 10 tipos personas que saben leer binario, los que si y los que no"
"Keyboard not Found, press F1 To Continue" WTF???
|
|
|
catalinilla
Desconectado
Mensajes: 28
|
Muchas gracias otra vez, no si el programa ya lo he crackeado, lo que quiero es aprender a generar un keygen. SALU2
|
|
|
En línea
|
|
|
|
KJD
Desconectado
Mensajes: 314
|
Bueno, entoces:
la funcion private bool ComprueboClavesHARDKeySTD ingresa con 4 valores
byte[] valores, byte[] claves, int Lote, int Serie;
Primero tendrias que ver que valores toman estas variables, si son fijos o dependen del hard que tengas instalado. Por ejemplo, me parece que la variable "claves" toma el valor del serial ingresado.
Trata de encontrar de donde provienen estas variables, osea que funcion las llama y que valor les asigna.
Despues es solo implementar la misma funcion que tienes y mostrar el valor de Buffer que es donde se guarda el serial valido y listo.
Postea las demas secciones de codigo y te sigo ayudando.
Saludos.
|
|
|
En línea
|
"Solo hay 10 tipos personas que saben leer binario, los que si y los que no"
"Keyboard not Found, press F1 To Continue" WTF???
|
|
|
catalinilla
Desconectado
Mensajes: 28
|
Hola muchas gracias otra vez por la gran ayuda que me estas prestando, verás te cuento: El programa en cuestión tiene una pantalla con un numero de seriede de 10 digitos y debajo el nombre del programa que yo he sustituido por xxxxx y al lado 8 casillas diferentes para introducir unos numeros en cada una, debajo un modulo que yo he puesto x1x1x1x con otras 8 casillas y debajo otro modulo x2x2x2x con otras 8 y un pequeño cuadradito que hay que marcar si no se tiene pastilla . Mas abajo un boton que comprueba los numeros que hemos introducido que se supone que van en funcion del numero de serie que aparece, pues bien esto es lo que hace cuando damos a dicho botón:
private void ProbarProteccion_Click(object sender, EventArgs e) { short num; short num2; short num3; short num4; short num5; short num6; short num7; short num8; string title = "Comprobando la protecci\x00f3n contra copia de xxxxxx."; Hardlock hardlock = new Hardlock(); bool flag = false; string prompt = ""; try { this.CodigoInterno.Text = Conversions.ToString(hardlock.CodigoInternal()); num = Conversions.ToShort(this.Clave_1.Text); num2 = Conversions.ToShort(this.Clave_2.Text); num3 = Conversions.ToShort(this.Clave_3.Text); num4 = Conversions.ToShort(this.Clave_4.Text); num5 = Conversions.ToShort(this.Clave_5.Text); num6 = Conversions.ToShort(this.Clave_6.Text); num7 = Conversions.ToShort(this.Clave_7.Text); num8 = Conversions.ToShort(this.Clave_8.Text); } catch (Exception exception1) { ProjectData.SetProjectError(exception1); Exception exception = exception1; if (exception.Message.Contains("La conversi\x00f3n")) { Interaction.MsgBox("Debe introducir n\x00famero entero en cada casilla. Por favor, revise los c\x00f3digos introducidos en las casillas de xxxxxx.", MsgBoxStyle.Critical, title); } ProjectData.ClearProjectError(); return; } if (this.Sin_Pastilla.Checked) { try { if (!hardlock.isCodigoInternal(num, num2, num3, num4, num5, num6, num7, num8)) { Interaction.MsgBox(hardlock.GetError(), MsgBoxStyle.OkOnly, null); Interaction.MsgBox("Los c\x00f3digos introducidos no coinciden con el n\x00famero de serie del programa.", MsgBoxStyle.Critical, title); } else { flag = true; } goto Label_0256; } catch (Exception exception6) { ProjectData.SetProjectError(exception6); Exception exception2 = exception6; Interaction.MsgBox("Se ha producido un error al intentar detectar la protecci\x00f3n s\x00edn pastilla del programa xxxxxx.\rEl error ha sido: " + exception2.Message, MsgBoxStyle.Critical, title); ProjectData.ClearProjectError(); return; } } if (!hardlock.isDriverInstalled()) { Interaction.MsgBox("Los drivers que gestionan la protecci\x00f3n contra copia no estan correctamente instalados.\rPor favor, instale estos drivers ejecutando un archivo llamado [Proteccion.BAT] que encontrar\x00e1 en el CD-ROM o DVD-ROM del programa xxxxxx.", MsgBoxStyle.Exclamation, title); } else { try { if (hardlock.isUSBHardlock()) { if (!hardlock.CheckTodasVersiones(num, num2, num3, num4, num5, num6, num7, num8)) { Interaction.MsgBox("!!! Los c\x00f3digos de protecci\x00f3n no coinciden con la pastilla que esta colocada en su ordenador. !!!", MsgBoxStyle.Critical, title); } else { flag = true; if (this.TipoVersion._ARK_Valor != hardlock.ElTipoversion) { Interaction.MsgBox("La pastilla de protecci\x00f3n que usted tiene colocada esta codificada para una versi\x00f3n: " + hardlock.ElTipoversion + " de xxxxx.", MsgBoxStyle.Exclamation, title); } this.TipoVersion._ARK_Valor = hardlock.ElTipoversion; } } else { Interaction.MsgBox(hardlock.GetError(), MsgBoxStyle.OkOnly, null); } } catch (Exception exception7) { ProjectData.SetProjectError(exception7); Exception exception3 = exception7; Interaction.MsgBox("Se ha producido un error al intentar detectar la protecci\x00f3n con pastilla del programa xxxxx.\rEl error ha sido: " + exception3.Message, MsgBoxStyle.Critical, title); ProjectData.ClearProjectError(); return; } } Label_0256: if (flag) { if (!this.Sin_Pastilla.Checked) { string str4 = "HardLock Aladdin"; if (hardlock.TipoPastilla == Hardlock.TipoHard.HardKeySTD) { str4 = "HARDKey STD"; } prompt = "## Tiene conectada un dispositivo USB del tipo: " + str4 + " ##\r\r"; } prompt = prompt + "xxxxx: El programa esta correctamente registrado.\r"; } try { int num9 = Conversions.ToShort(this.ClaveS_1.Text); int num10 = Conversions.ToShort(this.ClaveS_2.Text); int num11 = Conversions.ToShort(this.ClaveS_3.Text); int num12 = Conversions.ToShort(this.ClaveS_4.Text); int num13 = Conversions.ToShort(this.ClaveS_5.Text); int num14 = Conversions.ToShort(this.ClaveS_6.Text); int num15 = Conversions.ToShort(this.ClaveS_7.Text); int num16 = Conversions.ToShort(this.ClaveS_8.Text); if (hardlock.CheckSeguridadSalud(num, num2, num3, num4, num5, num6, num7, num8, num9, num10, num11, num12, num13, num14, num15, num16)) { prompt = prompt + "\rx1x1x1x: El programa esta correctamente registrado."; } else { prompt = prompt + "\rx1x1x1x: Los c\x00f3digos del programa no coinciden con la pastilla de protecci\x00f3n colocada."; } } catch (Exception exception8) { ProjectData.SetProjectError(exception8); Exception exception4 = exception8; if (exception4.Message.Contains("La conversi\x00f3n")) { Interaction.MsgBox("Debe introducir n\x00famero entero en cada casilla. Por favor, revise los c\x00f3digos introducidos en x1x1x1x.", MsgBoxStyle.Critical, title); } ProjectData.ClearProjectError(); return; } if (prompt != "") { prompt = prompt + "\r"; } try { int num17 = Conversions.ToShort(this.ClaveR_1.Text); int num18 = Conversions.ToShort(this.ClaveR_2.Text); int num19 = Conversions.ToShort(this.ClaveR_3.Text); int num20 = Conversions.ToShort(this.ClaveR_4.Text); int num21 = Conversions.ToShort(this.ClaveR_5.Text); int num22 = Conversions.ToShort(this.ClaveR_6.Text); int num23 = Conversions.ToShort(this.ClaveR_7.Text); int num24 = Conversions.ToShort(this.ClaveR_8.Text); if (hardlock.CheckRealidadVirtual(num, num2, num3, num4, num5, num6, num7, num8, num17, num18, num19, num20, num21, num22, num23, num24)) {
Aqui es donde yo he cambiado los saltos para que me acepte cualquier numero de serie. prompt = prompt + "\rx2x2x2x: El programa esta correctamente registrado.\r"; } else { prompt = prompt + "\rx2x2x2x: Los c\x00f3digos del programa no coinciden con la pastilla de protecci\x00f3n colocada.\r"; } } catch (Exception exception9) { ProjectData.SetProjectError(exception9); Exception exception5 = exception9; if (exception5.Message.Contains("La conversi\x00f3n")) { Interaction.MsgBox("Debe introducir n\x00famero entero en cada casilla. Por favor, revise los c\x00f3digos introducidos en x2x2x2x.", MsgBoxStyle.Critical, title); } ProjectData.ClearProjectError(); return; } if (prompt != "") { Interaction.MsgBox(prompt, MsgBoxStyle.Information, "Sistema de protecci\x00f3n Anti-Copia");
|
|
|
En línea
|
|
|
|
Amerikano|Cls
Desconectado
Mensajes: 789
[Beyond This Life]
|
Otra cosa que me olvidaba, si cambias el
while ((index <= 7)); por while ((True)); y el if ((buffer(index) != claves(index))) por if ((True)) el programa ya esta crackeado siempre y cuando el programa no tenga mas chekeos.
A caso while(true) no es un bucle infinito??, cuando terminaria?? salu2
|
|
|
En línea
|
|
|
|
KJD
Desconectado
Mensajes: 314
|
Otra cosa que me olvidaba, si cambias el
while ((index <= 7)); por while ((True)); y el if ((buffer(index) != claves(index))) por if ((True)) el programa ya esta crackeado siempre y cuando el programa no tenga mas chekeos.
A caso while(true) no es un bucle infinito??, cuando terminaria?? salu2 todavía estoy dormido. Hola muchas gracias otra vez por la gran ayuda que me estas prestando, verás te cuento: El programa en cuestión tiene una pantalla con un numero de seriede de 10 digitos y debajo el nombre del programa que yo he sustituido por xxxxx y al lado 8 casillas diferentes para introducir unos numeros en cada una, debajo un modulo que yo he puesto x1x1x1x con otras 8 casillas y debajo otro modulo x2x2x2x con otras 8 y un pequeño cuadradito que hay que marcar si no se tiene pastilla . Mas abajo un boton que comprueba los numeros que hemos introducido que se supone que van en funcion del numero de serie que aparece, pues bien esto es lo que hace cuando damos a dicho botón:
Catalinilla, el codigo que pusiste confirmo mi supocicion, este programa usa una mochila USB HardKeyStd. Este sistema de proteccion interactua directamente con un dispositivo USB conectado a la pc que hace de llave para que el programa sea registrado (si no es asi que me corrigan pls). Igualmente, en esta porcion de codigo no tiene una llamada a ComprueboClavesHARDKeySTD, puede ser que no sea esa la rutina de registro. Lo Unico que parece que valida o no el serial es hardlock.CheckRealidadVirtual, pero me parece que es una api del sistema de proteccion o una rutina. Fijate si aparece por algun lado que hay dentro de ahi, sino, no podras hacer un keygen. Si alguien ve algo mas que diga.
|
|
|
En línea
|
"Solo hay 10 tipos personas que saben leer binario, los que si y los que no"
"Keyboard not Found, press F1 To Continue" WTF???
|
|
|
catalinilla
Desconectado
Mensajes: 28
|
Gracias Kjd por la molestia que te estás tomando, sí efectivamente usa una mochila de protección (tengo que decir que el programa lo tengo comprado, pero es por no ir con la mochila del trabajo a casa y viceversa) lo que no veo es donde demonios genera el serial valido. Te dejaré descansar un poco y hasta que no encuentre algo nuevo, no lo postearé. SALU2
|
|
|
En línea
|
|
|
|
|
|