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

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Ingeniería Inversa (Moderadores: karmany, .:UND3R:., MCKSys Argentina)
| | |-+  ¿Alguien me aclara?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: ¿Alguien me aclara?  (Leído 5,071 veces)
catalinilla

Desconectado Desconectado

Mensajes: 28


Ver Perfil
¿Alguien me aclara?
« en: 21 Abril 2009, 12:34 pm »

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 Desconectado

Mensajes: 314



Ver Perfil
Re: ¿Alguien me aclara?
« Respuesta #1 en: 21 Abril 2009, 12:56 pm »

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

Código:
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 Desconectado

Mensajes: 28


Ver Perfil
Re: ¿Alguien me aclara?
« Respuesta #2 en: 21 Abril 2009, 13:04 pm »

Gracias KJD por la respuesta.
En línea

KJD


Desconectado Desconectado

Mensajes: 314



Ver Perfil
Re: ¿Alguien me aclara?
« Respuesta #3 en: 21 Abril 2009, 13:11 pm »

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 Desconectado

Mensajes: 28


Ver Perfil
Re: ¿Alguien me aclara?
« Respuesta #4 en: 21 Abril 2009, 13:25 pm »

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 Desconectado

Mensajes: 314



Ver Perfil
Re: ¿Alguien me aclara?
« Respuesta #5 en: 21 Abril 2009, 14:58 pm »

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 Desconectado

Mensajes: 28


Ver Perfil
Re: ¿Alguien me aclara?
« Respuesta #6 en: 21 Abril 2009, 16:23 pm »

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 Desconectado

Mensajes: 789


[Beyond This Life]


Ver Perfil WWW
Re: ¿Alguien me aclara?
« Respuesta #7 en: 21 Abril 2009, 16:51 pm »

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





Mi blog:
http://amerikanocls.blogspot.com
KJD


Desconectado Desconectado

Mensajes: 314



Ver Perfil
Re: ¿Alguien me aclara?
« Respuesta #8 en: 21 Abril 2009, 17:11 pm »

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

 :rolleyes: 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 Desconectado

Mensajes: 28


Ver Perfil
Re: ¿Alguien me aclara?
« Respuesta #9 en: 21 Abril 2009, 17:30 pm »

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

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

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
La UNAM aclara: la profecía maya del 2012 no existe « 1 2 »
Foro Libre
Fitoschido 16 7,492 Último mensaje 8 Enero 2011, 19:24 pm
por Garfield07
El Vaticano aclara: confesarse por iPhone no es válido
Noticias
wolfbcn 2 1,825 Último mensaje 9 Febrero 2011, 22:00 pm
por ignorantev1.1
[Js] Redacción confusa, ¿alguien me aclara lo del retorno?
Scripting
Linton 6 3,150 Último mensaje 17 Junio 2013, 11:58 am
por Linton
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines