Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
XPKeygen — Windows XP Keygen | Kitploit
Strumenti/GitHubGitHub/endermanch/xpkeygen
Reverse EngineeringCryptographyBinary Analysis
GitHubendermanch/xpkeygen

XPKeygen

Windows XP Keygen

Vedi Repository
1.1k681 mese faRevisionato da Kitploit

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

XPKeygen

Un generatore di chiavi VLK per Windows XP / Windows Server 2003. Questo strumento consente di generare chiavi Windows XP valide basate sulla Raw Product Key, che può essere casuale. La Raw Product Key (RPK) viene fornita sotto forma di 9 cifre XXX-YYYYYY ed è necessaria solo per generare una chiave Windows XP.

XP Keygen

Download

Vai alla scheda Releases e scarica l'ultima versione da lì.

Piani

Questo progetto non è morto: farò del mio meglio per portarlo a compimento.

Il problema

In generale, l'unica cosa che ci separa dalla generazione di chiavi Windows XP valide per OGNI EDIZIONE e OGNI BUILD è la mancanza delle rispettive chiavi private generate dalle loro controparti pubbliche all'interno di pidgen.dll. Non esiste codice ampiamente disponibile online per la funzione del logaritmo discreto su curve ellittiche, ci sono solo informazioni vaghe su come farlo.

Col passare del tempo, il problema è stato parzialmente risolto.

La risorsa BINK non era codificata in alcun modo e i dati venivano semplicemente scritti in sequenza nella risorsa. sk00ter ha anche spiegato completamente il formato BINK sui forum MDL. Utilizzando le conoscenze precedenti della comunità sull'argomento, ho scritto un BINK Reader in Python 3. Il file è pubblico in questo repository, clicca qui per visualizzare il codice sorgente.

La soluzione del logaritmo discreto è l'area di ricerca più inesplorata al 28 maggio 2023. Tuttavia, il mio amico nephacks ha trovato quell'elusivo strumento per risolvere quel difficile problema negli angoli più oscuri di Internet. Si chiama ECDLP (Elliptic Curve Discrete Logarithm Problem) Solver di Mr. HAANDI. Poiché trovarlo online è stato estremamente frustrante, l'ho ricaricato sul mio sito web. Puoi scaricare lo strumento qui.

Il file ReadMe incluso nella versione 0.2a del solver è già abbastanza chiaro di per sé, quindi chiunque abbia un minimo di cervello sarà in grado di configurare lo strumento. Tuttavia, non è open-source, quindi integrarlo nel mio keygen si è rivelato impossibile.

Nello scenario ideale, il keygen ti chiederebbe una risorsa BINK estratta da pidgen.dll, che poi decomporrebbe nei seguenti segmenti:

  • Chiave pubblica (pubX; pubY)
  • Generatore (genX; genY)
  • Punto base (a; b)
  • Conteggio dei punti p

Conoscendo questi segmenti, il keygen potrebbe forzare l'ordine del generatore genOrder usando l'algoritmo di Schoof, seguito dalla chiave privata privateKey, sfruttando il genOrder calcolato per usare l'algoritmo più ottimale di Pollard's Rho. Non c'è dubbio che possiamo violare qualsiasi chiave privata in circa 20 minuti usando la potenza di calcolo moderna, a patto di avere l'algoritmo funzionante.

Una volta che il keygen ha terminato di forzare la chiave privata corretta, il compito si riduce a generare effettivamente una chiave, cosa che questo keygen fa. Per darti una prospettiva migliore, posso fornirti il flusso del keygen ideale. Ciò che è barrato è ciò che il mio keygen implementa:

Principio di funzionamento

Dobbiamo usare una Raw Product Key casuale come base per generare un Product ID nella forma AAAAA-BBB-CCCCCCS-DDEEE.

Product ID

La costante della famiglia di OS AAAAA è diversa per ogni serie di Windows XP. Ad esempio, è 76487 per SP3.

Le sezioni BBB e CCCCCC codificano essenzialmente la Raw Product Key. Ad esempio, se la prima sezione è uguale a XXX e la seconda sezione è uguale a YYYYYY, la Raw Product Key verrà codificata come XXX-YYYYYY.

La cifra di controllo S viene scelta in modo che la somma di tutte le cifre C con essa aggiunta dia un numero divisibile per 7.

L'indice della chiave pubblica DD ci fa sapere quale chiave pubblica è stata usata per verificare con successo l'autenticità della nostra Product Key. Ad esempio, è 22 per le chiavi Professional e 23 per le chiavi VLK.

Un numero casuale EEE viene usato per generare ogni volta un Installation ID diverso.

Product Key

La Product Key stessa (da non confondere con la RPK) è nella forma FFFFF-GGGGG-HHHHH-JJJJJ-KKKKK, codificata in Base-24 con l'alfabeto BCDFGHJKMPQRTVWXY2346789 per escludere qualsiasi carattere che possa essere facilmente confuso, come I e 1 oppure O e 0.

Secondo la formula della capacità dell'alfabeto, la chiave può contenere al massimo 114 bit di informazioni. $$N = \log_2(24^{25}) \approx 114$$

In base a questo calcolo, decomponiamo la Product Key a 114 bit in 4 segmenti ordinati:

Per semplicità, combineremo i segmenti Upgrade e Seriale in un unico segmento chiamato Data. Con questa logica saremo in grado di estrarre la RPK traslando Data a destra e di ricomporla traslando i bit a sinistra, perché la maggior parte delle Product Key a priori valide che ho controllato aveva il bit di Upgrade impostato a 1.

Microsoft ha rifatto il formato della Product Key con Windows Server 2003 per includere una chiave di autenticazione del server backend, un approccio in realtà sicuro alla validazione delle licenze, poiché nessuno avrebbe mai potuto indovinare quale algoritmo di validazione avessero impiegato sul loro server privato. Oltre ad aggiungere il meccanismo di validazione online, hanno anche aumentato l'aritmetica complessiva da 384 a 512 bit e lo scalare della firma a 62 bit di informazioni.

Tuttavia, se generassimo una chiave senza pensare all'attivazione online, potremmo comunque generare chiavi valide che ci farebbero superare l'installazione del sistema operativo. Ed è esattamente ciò che fa il codice: genera una chiave di autenticazione casuale a 10 bit. Al giorno d'oggi non ha più alcuna importanza, dato che i server di attivazione sono offline e Server 2003 è considerato abandonware, così come questo intero progetto non dovrebbe essere considerato pirateria.

Curve ellittiche

La crittografia a curve ellittiche (ECC) è un tipo di sistema crittografico a chiave pubblica. Questa classe di sistemi si basa su difficili problemi matematici "unidirezionali": facili da calcolare in un senso e intrattabili da risolvere nell'"altro" senso. A volte vengono chiamate funzioni "trabocchetto" (trapdoor): facili in cui cadere, complicate da cui uscire.[5]

ECC si basa sulla risoluzione di equazioni della forma $$y^2 = x^3 + ax + b$$

In generale, ci sono 2 casi speciali per la curva ellittica utilizzata in crittografia: F2m e Fp. Differiscono solo leggermente. Entrambe le curve sono definite sul campo finito; Fp usa un parametro primo maggiore di 3, F2m assume $p = 2m$. Microsoft ha usato quest'ultima nel loro algoritmo.

Una curva ellittica sul campo finito Fp è costituita da:

  • un insieme di coordinate intere ${x, y}$, tali che $0 \le x, y < p$;
  • un insieme di punti $y^2 = x^3 + ax + b \mod p$.

Una curva ellittica su F17 apparirebbe così:

F17 Elliptic Curve

La curva è costituita dai punti blu nell'immagine sopra. In pratica, le "curve ellittiche" usate in crittografia sono "insiemi di punti in una matrice quadrata".

La curva sopra è "didattica". Fornisce una lunghezza della chiave molto piccola (4-5 bit). Nelle situazioni del mondo reale, gli sviluppatori usano in genere curve da 256 bit o più.

Risorsa BINK

Poiché si tratta di un sistema crittografico a chiave pubblica, Microsoft ha dovuto condividere la chiave pubblica con la sua versione di Windows XP per verificare le Product Key inserite. Viene archiviata all'interno di pidgen.dll sotto forma di una risorsa BINK. Il primo set di dati BINK serve a validare le chiavi retail, il secondo rispettivamente per le chiavi OEM.

La struttura della risorsa BINK per Windows 98 e Windows XP è la seguente:

Ogni segmento è contrassegnato con un colore diverso; i valori dell'intestazione BINK sono gli stessi.

BINK

Windows Server 2003 e Windows XP x64 lo implementano in modo diverso:

Ed ecco i miei prototipi di struttura realizzati per il BINK Reader in C:```c typedef struct _EC_BYTE_POINT { CHAR x[256]; // x-coordinate of the point on the elliptic curve. CHAR y[256]; // y-coordinate of the point on the elliptic curve. } EC_BYTE_POINT;

typedef struct _BINKHDR { // BINK version - not stored in the resource. ULONG32 dwVersion;

root@kitploit:~
// Original BINK header.
ULONG32 dwID;
ULONG32 dwSize;
ULONG32 dwHeaderLength;
ULONG32 dwChecksum;
ULONG32 dwDate;
ULONG32 dwKeySizeInDWORDs;
ULONG32 dwHashLength;
ULONG32 dwSignatureLength;

// Extended BINK header. (Windows Server 2003+)
ULONG32 dwAuthCodeLength;
ULONG32 dwProductIDLength;

} BINKHDR;

typedef struct _BINKDATA { CHAR p[256]; // Finite Field order p. CHAR a[256]; // Elliptic Curve parameter a. CHAR b[256]; // Elliptic Curve parameter b.

root@kitploit:~
EC_BYTE_POINT G;    // Base point (Generator) G.
EC_BYTE_POINT K;    // Public key K.

} BINKDATA;

typedef struct _BINKEY { BINKHDR header; BINKDATA data; } BINKEY;

root@kitploit:~
Se desideri esplorare ulteriormente, il codice sorgente di `pidgen.dll` e tutte le sue funzioni sono disponibili in questo repository, nella cartella "pidgen".

### Risalire alla chiave privata

Se vogliamo generare chiavi prodotto valide per Windows XP, dobbiamo calcolare la corrispondente chiave privata usando la chiave pubblica fornita con `pidgen.dll`,
il che significa che dobbiamo risolvere a ritroso il compito ECC a senso unico.

A giudicare dalla chiave situata in BINK, l'ordine della curva è lungo **384 bit** in Windows XP e **512 bit** rispettivamente in Server 2003 / XP x64.
La difficoltà di calcolo usando il più efficiente algoritmo Pollard's Rho con complessità asintotica $O(\sqrt{n})$ sarebbe almeno $O(2^{168})$ per Windows XP, e $O(2^{256})$ per Windows Server 2003, ma per nostra fortuna,
Microsoft ha limitato il valore della firma a 55 bit in Windows XP e a 62 bit in Windows Server 2003 al fine di ridurre il numero di chiavi prodotto corrispondenti, abbassando la difficoltà a un ben più gestibile $O(2^{28})$ / $O(2^{31})$.

Come accennato in precedenza, esiste un solo strumento pubblico che soddisfa le nostre attuali esigenze, ovvero il risolutore ECDLP di Mr. HAANDI.<br>

Per calcolare la chiave privata, dovremo fornire allo strumento i valori pubblici ECC situati nella risorsa BINK, oltre all'ordine `genOrder` del punto base `G(Gx; Gy)`.
L'ordine del punto base può essere calcolato usando SageMath.

**Ecco l'algoritmo di base che ho usato per risalire alla chiave privata di Windows 98:**

1. Calcola l'ordine del punto base usando **SageMath**. In SageMath, esegui i seguenti comandi:
    1) `E = EllipticCurve(GF(p), [0, 0, 0, a, b])`, dove `p`, `a` e `b` sono i parametri della curva ellittica rappresentati in forma decimale dalla risorsa BINK.
    2) `G = E(Gx, Gy)`, dove `Gx` e `Gy` sono le coordinate del punto base rappresentate in forma decimale dalla risorsa BINK.
    3) `K = E(Kx, Ky)`, dove `Kx` e `Ky` sono le coordinate della chiave pubblica rappresentate in forma decimale dalla risorsa BINK.
    4) `n = G.order()`, `n` sarà l'ordine calcolato del punto base. **Potrebbe volerci del tempo per il calcolo, anche sulle build più recenti.**
    5) Fattorizza l'ordine usando `factor(n)`. Microsoft ha usato numeri primi per gli ordini dei punti, quindi se restituisce il numero stesso, è del tutto normale.
    6) Salva da qualche parte i fattori risultanti dell'ordine.
    7) `-K` ti darà l'inverso della chiave pubblica in un piano proiettivo con coordinate `(x : y : z)`. Salva la coordinata `y` da qualche parte; è necessaria per generare una chiave privata corretta.
2. Calcola la chiave privata usando **ECDLP Solver v0.2a**.
    1) Lo strumento include un job modello `job_template.txt` e un file ReadMe. È necessario capire come funziona lo strumento per poterlo usare.
    2) Inserisci tutti i valori pubblici della curva ellittica dalla risorsa BINK, **tranne la coordinata `Ky`**. Per generare una chiave privata corretta, **devi usare la coordinata inversa `-Ky` che hai calcolato in precedenza in SageMath.**
    3) Inserisci i fattori dell'ordine del punto base `n` e specifica il conteggio dei fattori. Molto probabilmente sarà `1`, poiché Microsoft usa principalmente numeri primi per i propri ordini dei generatori.
    4) Esegui lo strumento `<arch> ECDLP Solver.exe <job_name>.txt` e attendi che calcoli la chiave privata `k = %d` per te.

**Ecco un esempio del job di Windows XP `job_xp.txt` che produce la chiave privata corretta per ECDLP Solver.**```pascal
GF := GF(22604814143135632990679956684344311209819952803216271952472204855524756275151440456421260165232069708317717961315241);
E := EllipticCurve([GF|1,0]);
G := E![10910744922206512781156913169071750153028386884676208947062808346072531411270489432930252839559606812441712224597826,19170993669917204517491618000619818679152109690172641868349612889930480365274675096509477191800826190959228181870174];
K := E![14399230353963643339712940015954061581064239835926823517419716769613937039346822269422480779920783799484349086780408,17120082747148185997450361756610881166187863099877353630300913555824935802439591336620545428308962346299700128114607];
/*
FactorCount:=1;
61760995553426173
*/

E l'output dell'ECDLP Solver per questo:

ECDLP Solver Output

Nota importante:

Attenzione: non sono riuscito a generare una chiave Windows XP x64 corretta usando la chiave privata che ho ricavato tramite reverse engineering, nemmeno usando la coordinata Ky invece della solita -Ky. Per qualche motivo, non sono riuscito nemmeno a calcolare l'ordine del punto base di Windows Server 2003 usando SageMath. Gli ho dato 12 ore per il calcolo sul mio i7-12700K, ma era ancora bloccato a calcolare.

Validazione / generazione delle chiavi prodotto

Il resto del lavoro viene svolto all'interno del codice di questo keygen.

Problemi noti

  • Alcune chiavi non sono valide, ma in genere è un evento piuttosto raro. Circa 2 chiavi su 3 dovrebbero funzionare.
    Corretto nella v1.2. Le versioni precedenti generavano una chiave valida con una probabilità esatta di 0x40000/0x62A32, che corrispondeva esattamente a 0.64884, ovvero circa il 65%. La mia stima di "2 su 3" era incredibilmente accurata.
  • Testato su diverse configurazioni di Windows XP. Funziona su Professional x86, con tutti i service pack. Altre edizioni di Windows potrebbero non funzionare. x64 NON FUNZIONA.
  • Generazione delle chiavi per Server 2003 non ancora inclusa.
    Corretta nella v2.2.
  • Alcune chiavi VLK di Windows XP tendono a essere "peggiori" di altre. Alcune di esse potrebbero attivare una WPA danneggiata con un ID di installazione vuoto dopo l'installazione. Hai le migliori probabilità di generare chiavi "migliori" impostando la sezione BBB a 640 e la sezione CCCCCC diversa da zero.
  • La generazione delle chiavi per Windows Server 2003 è rotta. Non so nemmeno da dove iniziare. Le chiavi non sembrano essere valide da nessuna parte, ma l'algoritmo è ben documentato. La mia implementazione genera circa 1 chiave "valida" su 3.
    Corretta nella v2.3*.

Letteratura

Aggiungerò altre letture decenti alla bibliografia nelle versioni future.

Comprendere le basi dell'attivazione di Windows XP:

  • [1] Inside Windows Product Activation - Fully Licensed | archive.org
  • [2] MSKey 4-in-1 ReadMe | archive.org
  • [3] Windows序列号产生原理(椭圆曲线法) | archive.org

Comprendere la crittografia a curva ellittica:

  • [4] Elliptic Curve Cryptography for Beginners - Matt Rickard | archive.org
  • [5] Elliptic Curve Cryptography (ECC) - Practical Cryptography for Developers | archive.org
  • [6] A (Relatively Easy To Understand) Primer on Elliptic Curve Cryptography - Cloudflare | archive.org

Discussioni pubbliche:

  • [7] Windows 98 Equivalent // Server 2003 Algorithm | archive.org
  • [8] Cracking Windows XP | archive.org

Contribuire / Utilizzo

Se hai intenzione di mostrare o fare il fork di questo software, per favore cita Endermanch, z22 e MSKey.
Sentiti libero di modificarlo a tuo piacimento, purché lo mantenga open-source. Concesso in licenza secondo la GNU General Public License v3.0.

Ogni contributo o domanda è benvenuto.

Scarica lo strumento
  • Estrazione della risorsa BINK
  • Forza bruta della soluzione del logaritmo discreto su curve ellittiche (genOrder, privateKey)
  • Meccanismo di elaborazione della Product Key
  • Generazione di chiavi Windows XP
  • Validazione di chiavi Windows XP
  • Generazione di chiavi Windows Server 2003
CifreSignificato
AAAAACostante famiglia di OS
BBBID canale
CCCCCCNumero di sequenza
SCifra di controllo
DDIndice della chiave pubblica
EEENumero casuale di 3 cifre
SegmentoCapacitàDati
Aggiornamento1 bitFlag di versione di aggiornamento
Seriale30 bitRaw Product Key (RPK)
Hash28 bitHash RPK
Firma55 bitFirma su curva ellittica per l'hash RPK
SegmentoCapacitàDati
Aggiornamento1 bitFlag di versione di aggiornamento
ID canale10 bitLa parte BBB della RPK
Hash31 bitHash RPK
Firma62 bitFirma su curva ellittica per l'hash RPK
Chiave di autenticazione10 bitValore di autenticazione backend
OffsetValore
0x0000ID BINK
0x0004Dimensione della struttura BINKEY in byte (sempre 0x16C nella pratica)
0x0008Lunghezza dell'intestazione (sempre 7 nella pratica)
0x000CChecksum
0x0010Data codificata numericamente - versione BINKEY (sempre 19980206 nella pratica)
0x0014Dimensione dell'ordine della curva ECC (sempre 12 nella pratica)
0x0018Lunghezza dell'hash (sempre 28 nella pratica)
0x001CLunghezza della firma (sempre 55 nella pratica)
0x0020Ordine del campo finito p
0x005CParametro della curva a
0x0098Parametro della curva b
0x00D4Coordinata x del punto base Gx
0x0110Coordinata y del punto base Gy
0x014CCoordinata x della chiave pubblica Kx
0x0188Coordinata y della chiave pubblica Ky
OffsetValore
0x0000ID BINK
0x0004Dimensione della struttura BINKEY in byte
0x0008Lunghezza dell'intestazione (sempre 9 nella pratica)
0x000CChecksum
0x0010Data codificata numericamente - versione BINKEY (sempre 20020420 nella pratica)
0x0014Dimensione dell'ordine della curva ECC (sempre 16 nella pratica)
0x0018Lunghezza dell'hash (sempre 31 nella pratica)
0x001CLunghezza della firma (sempre 62 nella pratica)
0x0020Lunghezza del valore di autenticazione backend (sempre 12 nella pratica)
0x0024Lunghezza del Product ID (sempre 20 nella pratica)
0x0028Ordine del campo finito p
0x0068Parametro della curva a
0x00A8Parametro della curva b
0x00E8Coordinata x del punto base Gx
0x0128Coordinata y del punto base Gy
0x0168Coordinata x della chiave pubblica Kx
0x01A8Coordinata y della chiave pubblica Ky