Hack x Crack - Comunidad de Seguridad informática

Programación => C / C++ => Mensaje iniciado por: Calantra en Febrero 08, 2015, 02:12:45 pm

Título: Pequeño código que nos muestra la clave de Windows (Sistemas de 32 y 64 bits)
Publicado por: Calantra en Febrero 08, 2015, 02:12:45 pm
Hola,

Os dejo este código para extraer, descodificar y mostrar la clave de producto del sistema operativo windows en el que se ejecute:

Código: [Seleccionar]
#include <cstdlib>
#include <iostream>
#include <Windows.h>


#define KEY_WOW64_64KEY 256 // For 64bits OS
#define key_offset 0x034    // Offset of coded key
#define binary_key_size 15  // Size of coded key
#define decoded_key_size 25 // Size of decoded key
#define buffer_size 168     // Binary regeistry value size

using namespace std;

/* Print error code in operatrion, for debug purposses only */
int perror(int error,int pos ) {
    printf ("Error opening the key [Err n.:%i] in pos:%i\n",error,pos);
    system("PAUSE");
    return error;   
}

int main(int argc, char *argv[]) {
    HKEY hkey;
    int error;     
    DWORD dwType=0; // 0 for binary data? I don´t now, some people change this for NULL.
    DWORD dwDataSize = buffer_size;
    char  Buffer[buffer_size];          // Store register binary value
    uint8_t binarykey[binary_key_size]; // Store binary key from buffer
    char decodedkey[decoded_key_size];  // Stores decoded key.
    uint32_t a;
    int boffset= key_offset+decoded_key_size;     // Binary key start offset.
    char keychars[] = "BCDFGHJKMPQRTVWXY2346789"; // Used to decode binary key
    /* 1. try to open register key from root key HKEY_LOCAL_MACHINE */
    error=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\microsoft\\Windows NT\\CurrentVersion", 0, KEY_READ | KEY_WOW64_64KEY,&hkey);
    if (error != ERROR_SUCCESS) return perror(error,1);
    /* 2. try to read register value from DigitalProductID */
    error=RegQueryValueEx(hkey, "DigitalProductID", NULL,  &dwType, (BYTE*)Buffer, &dwDataSize);
    if (error != ERROR_SUCCESS) return perror(error,2);
    for (int i=0;i<binary_key_size;i++) binarykey[i]=Buffer[key_offset+i]; // Copy binary key  from buffer to binary key array
    printf ("Windows key:");
    /* Decode key */
    for (int i=decoded_key_size-1;i>-1;i--) {
        a=0;
        for (int j=binary_key_size-1;j>-1;j--) {
            a = (a << 8) + binarykey[j];
            binarykey[j]= a / 24;
            a = a % 24;
        }
        decodedkey[i] = keychars[a];
    }
    /* Print key */
    for (int i=0;i<decoded_key_size;i++) {
        printf ("%c",decodedkey[i]);
        if ( (i + 1) % 5==0  && (i < decoded_key_size-1) ) printf("-");
    }
    printf ("\n");
    system("PAUSE");
    return EXIT_SUCCESS;
}

No respondo de la calidad de los comentarios en Inglés, fui poco al cole  :P
Si vas corriendo a comparar el resultado obtenido con la aplicación con lo que pone en la pegatina de tu equipo y no coincide, te puedo decir que en las instalaciones del S.O en equipos nuevos de 'marca' algunas empresas utilizan una clave diferente a la de la pegatina. A mi me ha pasado con 2 equipos (ACER y AIRIS), ambas llaves suelen ser validas, aunque en un caso reciente, no puede validar la pre-instalada (AIRIS) usando el servicio telefónico de Micro$oft, la voz pre-grabada me indicó que se trataba de una clave pirata  ???

Salu2.