Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
XPKeygen — Windows XP Keygen | Kitploit
도구/GitHubGitHub/endermanch/xpkeygen
Reverse EngineeringCryptographyBinary Analysis
GitHubendermanch/xpkeygen

XPKeygen

Windows XP Keygen

저장소 보기
1.1k681개월 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

XPKeygen

Windows XP / Windows Server 2003 VLK 키 생성기입니다. 이 도구는 무작위일 수 있는 _Raw Product Key(원시 제품 키)_를 기반으로 _유효한 Windows XP 키_를 생성할 수 있게 해 줍니다. RPK(Raw Product Key) 는 9자리 숫자 XXX-YYYYYY 형태로 제공되며 Windows XP 키를 생성하는 데에만 필요합니다.

XP Keygen

Download

Releases 탭으로 이동하여 최신 버전을 다운로드하세요.

Plans

이 프로젝트는 죽지 않았습니다. 반드시 완성시키기 위해 최선을 다하겠습니다.

문제

일반적으로 모든 에디션과 모든 빌드에 대해 유효한 Windows XP 키를 생성하는 것을 막는 유일한 장애물은 pidgen.dll 안에 있는 공개 키로부터 생성된 해당 개인 키가 없다는 것입니다. 타원 곡선 이산 로그 함수에 대한 코드는 온라인에 널리 공개된 것이 없고, 이를 수행하는 방법에 대한 모호한 정보만 존재합니다.

시간이 지나면서 이 문제는 부분적으로 해결되었습니다.

BINK 리소스는 어떤 식으로도 인코딩되지 않았으며 데이터는 리소스에 순차적으로 기록되어 있을 뿐입니다. sk00ter는 MDL 포럼에서 BINK 형식에 대해서도 완전히 설명했습니다. 이 주제에 대한 기존 커뮤니티 지식을 활용하여 Python 3로 BINK Reader를 작성했습니다. 이 파일은 이 저장소에 공개되어 있으며, 소스 코드를 보려면 여기를 클릭하세요.

이산 로그 해법은 2023년 5월 28일 현재 가장 연구가 덜 된 분야입니다. 하지만 제 친구 nephacks는 인터넷의 가장 깊은 구석에서 그 어려운 문제를 해결할 그 희귀한 도구를 찾아냈습니다. 그 도구는 Mr. HAANDI가 만든 ECDLP(타원 곡선 이산 로그 문제) Solver라고 합니다. 온라인에서 찾기가 매우 어려웠기 때문에 제 웹사이트에 다시 업로드했습니다. 도구는 여기에서 다운로드할 수 있습니다.

솔버 버전 0.2a에 포함된 ReadMe 파일만으로도 충분히 설명이 되어 있어서, 머리만 있다면 누구나 그 도구를 설정할 수 있습니다. 하지만 오픈소스가 아니기 때문에 제 키젠에 통합하는 것은 불가능한 것으로 판명되었습니다.

이상적인 시나리오에서 키젠은 pidgen.dll에서 추출한 BINK 리소스를 요청하고, 이를 다음 세그먼트로 분해할 것입니다:

  • 공개 키 (pubX; pubY)
  • 생성기 (genX; genY)
  • 기준점 (a; b)
  • 점 개수 p

이 세그먼트들을 알면 키젠은 Schoof 알고리즘을 사용하여 생성기 순서 genOrder를 브루트포스한 다음, 계산된 genOrder를 활용하여 가장 최적의 Pollard's Rho 알고리즘을 사용해 개인 키 privateKey를 브루트포스할 것입니다. 작동하는 알고리즘만 있다면 현대의 계산 성능으로 20분 안에 어떤 개인 키든 크랙할 수 있다는 것은 의심의 여지가 없습니다.

키젠이 올바른 개인 키를 브루트포스하는 작업을 마치면, 남은 작업은 실제로 키를 생성하는 일로 귀결됩니다. 바로 이 키젠이 수행하는 작업입니다. 더 나은 이해를 위해 이상적인 키젠의 흐름을 보여드리겠습니다. 취소선이 그어진 항목은 제 키젠이 구현하는 부분입니다:

  • BINK 리소스 추출
  • 타원 곡선 이산 로그 해법 브루트포스 (genOrder, privateKey)

작동 원리

AAAAA-BBB-CCCCCCS-DDEEE 형식의 제품 ID를 생성하려면 무작위 Raw Product Key를 기준으로 사용해야 합니다.

제품 ID

OS 제품군 상수 AAAAA는 Windows XP 시리즈마다 다릅니다. 예를 들어 SP3의 경우 76487입니다.

BBB 및 CCCCCC 섹션은 본질적으로 Raw Product Key를 인코딩합니다. 예를 들어 첫 번째 섹션이 XXX이고 두 번째 섹션이 YYYYYY이면 Raw Product Key는 XXX-YYYYYY로 인코딩됩니다.

검증 숫자 S는 모든 C 숫자의 합에 이 값을 더했을 때 7로 나누어떨어지도록 선택됩니다.

공개 키 인덱스 DD는 제품 키의 진위를 성공적으로 검증하는 데 사용된 공개 키가 무엇인지 알려줍니다. 예를 들어 Professional 키는 22, VLK 키는 23입니다.

무작위 숫자 EEE는 매번 다른 설치 ID를 생성하는 데 사용됩니다.

제품 키

제품 키 자체(RPK와 혼동하지 마세요)는 FFFFF-GGGGG-HHHHH-JJJJJ-KKKKK 형식이며, I와 1, O와 0처럼 혼동하기 쉬운 문자를 제외하기 위해 알파벳 BCDFGHJKMPQRTVWXY2346789를 사용하는 Base-24로 인코딩됩니다.

알파벳 용량 공식에 따르면 키는 최대 114비트의 정보를 담을 수 있습니다. $$N = \log_2(24^{25}) \approx 114$$

이 계산을 바탕으로 114비트 제품 키를 4개의 순서 있는 세그먼트로 분해합니다:

Segment

단순화를 위해 Upgrade와 Serial 세그먼트를 Data라는 단일 세그먼트로 결합합니다. 이 논리에 따라 Data를 오른쪽으로 시프트하여 RPK를 추출하고, 비트를 왼쪽으로 시프트하여 다시 패킹할 수 있습니다. 제가 확인한 대부분의 유효한 제품 키는 Upgrade 비트가 1로 설정되어 있기 때문입니다.

Microsoft는 Windows Server 2003부터 백엔드 서버 인증 키를 포함하도록 제품 키 형식을 다시 설계했습니다. 이는 실제로 안전한 라이선스 검증 방식이었습니다. 사설 서버에서 어떤 검증 알고리즘을 사용했는지 누구도 추측할 수 없었기 때문입니다. 온라인 검증 메커니즘을 추가하는 것 외에도 전체 연산을 384비트에서 512비트로 높이고 서명 스칼라를 62비트 정보로 확장했습니다.

하지만 온라인 정품 인증을 고려하지 않고 키를 생성하더라도 운영 체제 설치 과정을 통과할 수 있는 유효한 키를 생성할 수 있습니다. 그리고 코드가 정확히 그렇게 합니다. 무작위 10비트 인증 키를 생성하는 것입니다. 오늘날에는 활성화 서버가 내려갔고 Server 2003이 애브던웨어(abandonware)로 간주되므로 전혀 문제가 되지 않습니다. 이 프로젝트 전체가 불법 복제로 간주되어서도 안 되는 것과 같은 이유입니다.

타원 곡선

타원 곡선 암호(ECC, Elliptic Curve Cryptography)는 공개 키 암호 시스템의 한 유형입니다. 이 계열의 시스템은 풀기 어려운 '단방향' 수학 문제에 의존합니다. 한 방향으로는 계산하기 쉽지만 '반대' 방향으로는 풀기 어렵습니다. 이를 '트랩도어' 함수라고도 합니다. 빠지기는 쉽지만 빠져나오기는 어렵습니다.[5]

ECC는 다음 형태의 방정식을 푸는 데 의존합니다. $$y^2 = x^3 + ax + b$$

일반적으로 암호화에 사용되는 타원 곡선에는 F2m 및 Fp 의 두 가지 특수한 경우가 있습니다. 둘은 약간만 다릅니다. 두 곡선 모두 유한체 위에서 정의되며, Fp는 3보다 큰 소수 매개변수를 사용하고, F2m은 $p = 2m$을 가정합니다. Microsoft는 알고리즘에서 후자를 사용했습니다.

유한체 Fp 위의 타원 곡선은 다음으로 구성됩니다:

  • $0 \le x, y < p$를 만족하는 정수 좌표 ${x, y}$의 집합;
  • $y^2 = x^3 + ax + b \mod p$ 점들의 집합.

F17 위의 타원 곡선은 다음과 같습니다:

F17 Elliptic Curve

곡선은 위 이미지의 파란색 점들로 구성됩니다. 실제로 암호화에 사용되는 '타원 곡선'은 '정사각 행렬의 점 집합'입니다.

위 곡선은 '교육용'입니다. 키 길이가 매우 짧습니다(4-5비트). 실제 상황에서 개발자들은 일반적으로 256비트 이상의 곡선을 사용합니다.

BINK 리소스

공개 키 암호 시스템이기 때문에 Microsoft는 입력된 제품 키를 검증하기 위해 Windows XP 릴리스와 함께 공개 키를 공유해야 했습니다. 공개 키는 BINK 리소스 형태로 pidgen.dll 안에 저장되어 있습니다. 첫 번째 BINK 데이터 세트는 리테일 키를 검증하기 위한 것이고, 두 번째는 각각 OEM 키용입니다.

Windows 98 및 Windows XP용 BINK 리소스의 구조는 다음과 같습니다:

각 세그먼트는 서로 다른 색상으로 표시되며, BINK 헤더 값은 동일합니다.

BINK

Windows Server 2003 및 Windows XP x64는 이를 다르게 구현합니다:

그리고 다음은 C로 작성한 BINK Reader용 구조체 프로토타입입니다:```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:~
In case you want to explore further, the source code of `pidgen.dll` and all its functions is available within this repository, in the "pidgen" folder.

### 개인 키 역산하기

Windows XP용 유효한 제품 키를 생성하려면 `pidgen.dll`에 포함된 공개 키를 사용하여 해당 개인 키를 계산해야 합니다.
즉, 일방향(one-way) ECC 작업을 역으로 풀어야 합니다.

BINK에 있는 키로 판단하면, 곡선 차수는 Windows XP에서 **384비트**, Server 2003 / XP x64에서는 각각 **512비트**입니다.
점근적 복잡도 $O(\sqrt{n})$를 갖는 가장 효율적인 Pollard's Rho 알고리즘을 사용한 계산 난이도는 Windows XP의 경우 최소 $O(2^{168})$, Windows Server 2003의 경우 $O(2^{256})$이지만, 운 좋게도 Microsoft는 일치하는 제품 키의 수를 줄이기 위해 Windows XP의 서명 값을 55비트, Windows Server 2003의 서명 값을 62비트로 제한했기 때문에 난이도는 훨씬 더 관리하기 쉬운 $O(2^{28})$ / $O(2^{31})$로 낮아졌습니다.

앞서 언급했듯이 현재 요구 사항을 충족하는 공개 도구는 Mr. HAANDI의 ECDLP solver 하나뿐입니다.<br>

개인 키를 계산하려면 BINK 리소스에 있는 공개 ECC 값과 기본점 `G(Gx; Gy)`의 차수 `genOrder`를 도구에 제공해야 합니다. 기본점의 차수는 SageMath를 사용하여 계산할 수 있습니다.

**다음은 Windows 98 개인 키를 역산하는 데 사용한 기본 알고리즘입니다:**

1. **SageMath**를 사용하여 기본점의 차수를 계산합니다. SageMath에서 다음 명령을 실행합니다:
    1) `E = EllipticCurve(GF(p), [0, 0, 0, a, b])`, 여기서 `p`, `a`, `b`는 BINK 리소스의 십진수로 표현된 타원 곡선 매개변수입니다.
    2) `G = E(Gx, Gy)`, 여기서 `Gx`, `Gy`는 BINK 리소스의 십진수로 표현된 기본점 좌표입니다.
    3) `K = E(Kx, Ky)`, 여기서 `Kx`, `Ky`는 BINK 리소스의 십진수로 표현된 공개 키 좌표입니다.
    4) `n = G.order()`, `n`은 계산된 기본점의 차수가 됩니다. **최신 빌드에서도 계산하는 데 시간이 걸릴 수 있습니다.**
    5) `factor(n)`을 사용하여 차수를 인수분해합니다. Microsoft는 포인트 차수에 소수를 사용했으므로, 숫자 자체가 반환되면 완전히 정상입니다.
    6) 결과로 나온 차수의 인수들을 어딘가에 저장합니다.
    7) `-K`는 좌표 `(x : y : z)`를 갖는 사영 평면에서 공개 키의 역원을 제공합니다. `y` 좌표를 어딘가에 저장합니다. 올바른 개인 키를 생성하는 데 필요합니다.
2. **ECDLP Solver v0.2a**를 사용하여 개인 키를 계산합니다.
    1) 도구에는 템플릿 작업 `job_template.txt`와 ReadMe 파일이 함께 제공됩니다. 도구를 사용하려면 작동 방식을 이해해야 합니다.
    2) BINK 리소스의 모든 공개 타원 곡선 값을 삽입합니다. **`Ky` 좌표는 제외합니다.** 올바른 개인 키를 생성하려면 **앞서 SageMath에서 계산한 역 좌표 `-Ky`를 사용해야 합니다.**
    3) 기본점 차수 `n`의 인수들을 삽입하고 인수 개수를 지정합니다. Microsoft는 생성기 차수에 주로 소수를 사용하므로 매우 높은 확률로 `1`입니다.
    4) `<arch> ECDLP Solver.exe <job_name>.txt` 명령으로 도구를 실행하고 개인 키 `k = %d`를 계산할 때까지 기다립니다.

**다음은 ECDLP Solver를 위한 올바른 개인 키를 산출하는 Windows XP 작업 `job_xp.txt`의 예입니다.**```pascal
GF := GF(22604814143135632990679956684344311209819952803216271952472204855524756275151440456421260165232069708317717961315241);
E := EllipticCurve([GF|1,0]);
G := E![10910744922206512781156913169071750153028386884676208947062808346072531411270489432930252839559606812441712224597826,19170993669917204517491618000619818679152109690172641868349612889930480365274675096509477191800826190959228181870174];
K := E![14399230353963643339712940015954061581064239835926823517419716769613937039346822269422480779920783799484349086780408,17120082747148185997450361756610881166187863099877353630300913555824935802439591336620545428308962346299700128114607];
/*
FactorCount:=1;
61760995553426173
*/

그리고 이에 대한 ECDLP Solver 출력:

ECDLP Solver Output

중요 참고 사항:

제가 역산한 개인 키로는 올바른 Windows XP x64 키를 생성할 수 없었다는 점에 유의하세요. 일반적인 -Ky 대신 Ky 좌표를 사용해도 마찬가지였습니다. 어떤 이유에서인지 SageMath로 Windows Server 2003 기저점 차수를 계산하는 것도 실패했습니다. i7-12700K에서 12시간 동안 계산을 돌렸지만 여전히 계산 중에 멈춰 있었습니다.

제품 키 검증 / 생성

나머지 작업은 이 키젠의 코드 내에서 수행됩니다.

알려진 문제

  • 일부 키는 유효하지 않지만 일반적으로 그리 흔한 경우는 아닙니다. 키 3개 중 약 2개는 작동해야 합니다.
    v1.2에서 수정됨. 이전 버전은 정확히 0x40000/0x62A32의 확률로 유효한 키를 생성했으며, 이는 정확히 0.64884, 즉 약 65%였습니다. 제 "2/3" 추정치는 믿기 어려울 정도로 정확했습니다.
  • 여러 Windows XP 환경에서 테스트했습니다. Professional x86, 모든 서비스 팩에서 작동합니다. 다른 Windows 에디션은 작동하지 않을 수 있습니다. x64는 작동하지 않습니다.
  • Server 2003 키 생성은 아직 포함되지 않았습니다.
    v2.2에서 수정됨.
  • 일부 Windows XP VLK 키는 다른 키보다 "품질이 낮은" 경향이 있습니다. 일부 키는 설치 후 빈 Installation ID로 손상된 WPA를 유발할 수 있습니다. BBB 섹션을 640으로 설정하고 CCCCCC 섹션을 0이 아닌 값으로 설정하면 "더 나은" 키를 생성할 가능성이 가장 높습니다.
  • Windows Server 2003 키 생성이 고장 났습니다. 어디서부터 시작해야 할지조차 모르겠습니다. 키가 어디에서도 유효하지 않은 것 같지만, 알고리즘은 잘 문서화되어 있습니다. 제 구현의 경우 약 3개 중 1개의 "유효한" 키를 생성합니다.
    v2.3에서 수정됨*.

참고 자료

이후 릴리스에서 참고 문헌에 더 유용한 자료를 추가하겠습니다.

Windows XP 정품 인증의 기본 이해:

  • [1] Windows 제품 정품 인증 내부 - 완전 라이선스 | archive.org
  • [2] MSKey 4-in-1 ReadMe | archive.org
  • [3] Windows 시리얼 번호 생성 원리(타원 곡선법) | archive.org

타원 곡선 암호(ECC) 이해:

  • [4] 초보자를 위한 타원 곡선 암호 - Matt Rickard | archive.org
  • [5] 타원 곡선 암호(ECC) - 개발자를 위한 실용 암호학 | archive.org
  • [6] 타원 곡선 암호에 대한 (비교적 이해하기 쉬운) 입문서 - Cloudflare | archive.org

공개 토론:

  • [7] Windows 98 대응 // Server 2003 알고리즘 | archive.org
  • [8] Windows XP 크래킹 | archive.org

기여 / 사용

이 소프트웨어를 소개하거나 포크할 경우 Endermanch, z22 및 MSKey를 크레딧으로 표기해 주세요.
오픈소스로 유지하는 한 원하는 대로 수정해도 됩니다. GNU General Public License v3.0에 따라 라이선스가 부여됩니다.

기여나 질문은 언제든 환영합니다.

도구 다운로드
  • 제품 키 처리 메커니즘
  • Windows XP 키 생성
  • Windows XP 키 검증
  • Windows Server 2003 키 생성
  • DigitsMeaning
    AAAAAOS 제품군 상수
    BBB채널 ID
    CCCCCC시퀀스 번호
    S검증 숫자
    DD공개 키 인덱스
    EEE무작위 3자리 숫자
    Capacity
    Data
    Upgrade1비트업그레이드 버전 플래그
    Serial30비트Raw Product Key (RPK)
    Hash28비트RPK 해시
    Signature55비트RPK 해시에 대한 타원 곡선 서명
    SegmentCapacityData
    Upgrade1비트업그레이드 버전 플래그
    Channel ID10비트RPK의 BBB 부분
    Hash31비트RPK 해시
    Signature62비트RPK 해시에 대한 타원 곡선 서명
    Auth Key10비트백엔드 인증 값
    OffsetValue
    0x0000BINK ID
    0x0004BINKEY 구조체의 크기(바이트) (실제로는 항상 0x16C)
    0x0008헤더 길이 (실제로는 항상 7)
    0x000C체크섬
    0x0010숫자 인코딩 날짜 - BINKEY 버전 (실제로는 항상 19980206)
    0x0014ECC 곡선 차수 크기 (실제로는 항상 12)
    0x0018해시 길이 (실제로는 항상 28)
    0x001C서명 길이 (실제로는 항상 55)
    0x0020유한체 차수 p
    0x005C곡선 매개변수 a
    0x0098곡선 매개변수 b
    0x00D4기준점 x좌표 Gx
    0x0110기준점 y좌표 Gy
    0x014C공개 키 x좌표 Kx
    0x0188공개 키 y좌표 Ky
    OffsetValue
    0x0000BINK ID
    0x0004BINKEY 구조체의 크기(바이트)
    0x0008헤더 길이 (실제로는 항상 9)
    0x000C체크섬
    0x0010숫자 인코딩 날짜 - BINKEY 버전 (실제로는 항상 20020420)
    0x0014ECC 곡선 차수 크기 (실제로는 항상 16)
    0x0018해시 길이 (실제로는 항상 31)
    0x001C서명 길이 (실제로는 항상 62)
    0x0020백엔드 인증 값 길이 (실제로는 항상 12)
    0x0024제품 ID 길이 (실제로는 항상 20)
    0x0028유한체 차수 p
    0x0068곡선 매개변수 a
    0x00A8곡선 매개변수 b
    0x00E8기준점 x좌표 Gx
    0x0128기준점 y좌표 Gy
    0x0168공개 키 x좌표 Kx
    0x01A8공개 키 y좌표 Ky