Last active
August 30, 2018 17:41
-
-
Save dilworks/a3aca66d6d613da455466aec4ae75f49 to your computer and use it in GitHub Desktop.
Brute Force RegKey for RichDiamond [modified for GCC/Linux]
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Brute Force RegKey for RichDiamond | |
// change VERSIONKEY to your generated VersionKey | |
// Linux: gcc -std=gnu99 -O3 -fopenmp -march=native -o rdbruteforcekeygen rdbruteforcekeygen.c | |
// Windows: test with VC++2008/2010? | |
#define VERSIONKEY 0xCE9190D8; | |
#include <stdio.h> | |
#ifdef _MSC_VER | |
#include <windows.h> | |
typedef __int16 int16_t; | |
typedef unsigned __int16 uint16_t; | |
typedef __int32 int32_t; | |
typedef unsigned __int32 uint32_t; | |
typedef __int64 int64_t; | |
typedef unsigned __int64 uint64_t; | |
typedef int bool; | |
#define false 0 | |
#define true 1 | |
#else | |
#include <stdint.h> | |
#include <stdbool.h> | |
#include <time.h> | |
#endif | |
#include <omp.h> | |
// ' ' '-' -> block seperators-->ignored | |
// base 24 without vowels | |
static const char Base24Array[24] = { | |
'0', '1', '2', '3', '4', '5', '6', '7', | |
'8', '9', 'B', 'C', 'D', 'F', 'G', 'H', | |
'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R' | |
}; | |
static const uint8_t ConversionTable[5][24] = { | |
{0xFF, 0x0C, 0xFF, 0xFF, 0x02, 0x09, 0x0D, 0xFF, | |
0x01, 0x05, 0x07, 0x04, 0x0B, 0x03, 0x06, 0x0F, | |
0xFF, 0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0x0A, 0x08}, | |
{0x04, 0xFF, 0x03, 0x0A, 0x02, 0x07, 0xFF, 0x00, | |
0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x01, 0x0F, 0x08, | |
0x09, 0x05, 0x0B, 0xFF, 0xFF, 0x06, 0xFF, 0xFF}, | |
{0x01, 0x08, 0xFF, 0x0C, 0x07, 0xFF, 0x02, 0x03, | |
0x0B, 0x06, 0x0F, 0x09, 0x0A, 0x0E, 0xFF, 0xFF, | |
0xFF, 0xFF, 0x04, 0xFF, 0x00, 0x0D, 0x05, 0xFF}, | |
{0xFF, 0x0D, 0x06, 0x09, 0x02, 0xFF, 0x05, 0x0C, | |
0x0A, 0x01, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0x04, | |
0x0F, 0xFF, 0x07, 0x08, 0x0E, 0xFF, 0x03, 0x00}, | |
{0x0C, 0x04, 0xFF, 0x09, 0x07, 0x06, 0xFF, 0xFF, | |
0xFF, 0x0D, 0x0E, 0xFF, 0x02, 0xFF, 0xFF, 0x03, | |
0x05, 0x0A, 0x00, 0x08, 0x0F, 0x0B, 0xFF, 0x01} | |
}; | |
static const uint8_t ArraySelectors[5][24] = { | |
{0xFF, 0x01, 0xFF, 0xFF, 0x02, 0x04, 0x01, 0xFF, | |
0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, | |
0xFF, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0x04, 0x04}, | |
{0x02, 0xFF, 0x00, 0x02, 0x03, 0x02, 0xFF, 0x03, | |
0xFF, 0xFF, 0x03, 0x04, 0x02, 0x02, 0x02, 0x01, | |
0x03, 0x04, 0x04, 0xFF, 0xFF, 0x03, 0xFF, 0xFF}, | |
{0x02, 0x04, 0xFF, 0x03, 0x01, 0xFF, 0x01, 0x00, | |
0x02, 0x03, 0x04, 0x03, 0x01, 0x03, 0xFF, 0xFF, | |
0xFF, 0xFF, 0x01, 0xFF, 0x01, 0x04, 0x01, 0xFF}, | |
{0xFF, 0x01, 0x01, 0x04, 0x00, 0xFF, 0x03, 0x00, | |
0x04, 0x00, 0xFF, 0xFF, 0x02, 0xFF, 0xFF, 0x04, | |
0x00, 0xFF, 0x00, 0x02, 0x03, 0xFF, 0x04, 0x02}, | |
{0x00, 0x02, 0xFF, 0x03, 0x04, 0x03, 0xFF, 0xFF, | |
0xFF, 0x00, 0x00, 0xFF, 0x02, 0xFF, 0xFF, 0x03, | |
0x00, 0x01, 0x04, 0x03, 0x01, 0x04, 0xFF, 0x03} | |
}; | |
static const char * ConvertToAuthCode(uint64_t Value) { | |
static char AuthCode[17]; | |
int i, j; | |
unsigned ArraySelector = 0; | |
while(Value && !(Value>>60) ) { | |
Value<<=4; | |
} | |
for(i=0; Value; i++) { | |
for(j=0; j<24; j++) { | |
if(ConversionTable[ArraySelector][j] == (Value>>60)) { | |
AuthCode[i] = Base24Array[j]; | |
ArraySelector = ArraySelectors[ArraySelector][j]; | |
break; | |
} | |
} | |
Value<<=4; | |
} | |
AuthCode[i] = 0; | |
return AuthCode; | |
} | |
static const uint8_t SomeByteArray1[2][8] = { | |
{0x07, 0x0B, 0x0D, 0x11, 0x16, 0x10, 0x0E, 0x18}, | |
{0x07, 0x0D, 0x14, 0x18, 0x14, 0x10, 0x07, 0x0B} | |
}; | |
static const uint8_t SomeByteArray2[2][8] = { | |
{0x10, 0x0E, 0x16, 0x14, 0x18, 0x07, 0x11, 0x0B}, | |
{0x10, 0x18, 0x07, 0x0D, 0x0B, 0x11, 0x11, 0x0E} | |
}; | |
static const uint8_t SomeByteArray3[2][8] = { | |
{0x11, 0x14, 0x0B, 0x0D, 0x0E, 0x16, 0x18, 0x07}, | |
{0x11, 0x10, 0x0B, 0x11, 0x0D, 0x18, 0x16, 0x07} | |
}; | |
static const uint8_t SomeByteArray4[2][8] = { | |
{0x14, 0x0D, 0x0E, 0x18, 0x07, 0x0B, 0x10, 0x11}, | |
{0x14, 0x16, 0x11, 0x0E, 0x16, 0x0B, 0x10, 0x18} | |
}; | |
static const uint8_t SomeByteArray5[8] = { | |
0x09, 0x17, 0x06, 0x19, 0x15, 0x17, 0x19, 0x09 | |
}; | |
static const uint8_t SomeByteArray6[8] = { | |
0x00, 0x0D, 0x0D, 0x08, 0x01, 0x04, 0x07, 0x07 | |
}; | |
static const uint8_t SomeByteArray7[8] = { | |
0x04, 0x01, 0x00, 0x07, 0x0D, 0x08, 0x00, 0x04 | |
}; | |
static const uint32_t KeyValues[23] = { | |
// key for main program | |
0x436F7265, | |
// keys for single levels | |
0x76951662, //106 | |
0x4721E265, //108 | |
0x579BF236, //109 | |
0x98599C6D, //110 | |
0x6BD8F0B9, //111 | |
0xBF6569E8, //112 | |
0xE1331E2A, //113 | |
0x4D02B694, //114 | |
0xB807175C, //115 | |
0xDC61F92B, //116 | |
0xFB64CC1D, //117 | |
0x5DB192C8, //118 | |
0x484DDFB4, //119 | |
0x455702CA, //121 | |
0x73527E14, //122 | |
0xDDB10EDE, //126 | |
0x64DE7EE8, //124 | |
0x28B93B85, //106 | |
// multi-level keys, missing: 117, 124, 126 | |
0xEBDAD7F1, // (106, 108, 109, 110, 111) | |
0x21033974, // (106, 108, 109, 110, 111) | |
0x5391E536, // (112, 113, 114, 115, 116) | |
0xC7C23136 // (118, 119, 121, 122) | |
//0xFB64CC1D, 0x64DE7EE8, 0xDDB10EDE, 0xEBDAD7F1, 0x5391E536, 0xC7C23136 | |
}; | |
static inline bool HasOddNumberOfBits(uint32_t x) { | |
#if 1 | |
return __builtin_parity(x); | |
#else | |
x = x ^ (x >> 16); | |
x = x ^ (x >> 8); | |
x = x ^ (x >> 4); | |
x = x ^ (x >> 2); | |
return ((x >> 1) & 1) ^ (x & 1); | |
#endif | |
} | |
static inline uint32_t NumberOfBits(uint32_t x) { | |
#if 1 | |
return __builtin_popcount(x); | |
#else | |
x = x - ((x >> 1) & 0x55555555); | |
x = (x & 0x33333333) + ((x >> 2) & 0x33333333); | |
x = (x + (x >> 4)) & 0x0F0F0F0F; | |
x = x + (x >> 8); | |
x = x + (x >> 16); | |
return x & 0x0000003F; | |
#endif | |
} | |
/* | |
isValid: 1, Time: 18323.544884 seconds, iAuthCode: 129646A25C, iAuthCode2: 12964549, Value1: 9646A25C Value2: 12 Progress: 7.260553% | |
isValid: 0, Time: 44753.829474 seconds, iAuthCode: 2AFFFDFBCF, iAuthCode2: 2AFFFFFF, Value1: FFFDFBCF Value2: 2A Progress: 16.796863% | |
0x52 | |
*/ | |
int main() { | |
uint64_t iValue2, secondsTotal; | |
uint32_t VersionKey; | |
uint32_t hours, minutes, seconds; | |
uint64_t start, end; | |
#ifdef _MSC_VER | |
LARGE_INTEGER li1, li2; | |
double PCFreq = 0.0; | |
__int64 CounterStart; | |
QueryPerformanceFrequency(&li1); | |
PCFreq = (double)li1.QuadPart/1000.0; | |
QueryPerformanceCounter(&li1); | |
CounterStart = li1.QuadPart; | |
#else | |
struct timespec li1, li2; | |
int64_t CounterStart; | |
clock_gettime(CLOCK_MONOTONIC, &li1); | |
CounterStart = li1.tv_sec + (li1.tv_nsec / 1E9); | |
#endif | |
VersionKey = VERSIONKEY; | |
iValue2=0; | |
start = 0; | |
end = 0x8000000000; | |
//start = 0; | |
//end = 281474976710656ULL; // 48-bit | |
#pragma omp parallel for private(li2, iValue2) | |
for(uint64_t iValue=start; iValue<end; iValue++) { | |
bool isValid; | |
uint8_t array3[16]; | |
uint32_t dArray[29]; | |
uint32_t ValueVersionKey, bv1, bv2; | |
uint32_t dv1, dv2, dv3, dv4, dv5; | |
uint64_t Value = iValue; | |
//i == 0x3F && HasOddNumberOfBits(Value1 & 0xFFFF0000) | |
if ( | |
!!(Value&0x8)^ | |
!!(Value&0x400)^!!(Value&0x800)^ | |
!!(Value&0x200000000)^!!(Value&0x400000000)^!!(Value&0x800000000)^ | |
!!(Value&0x8000000000)^ | |
!!(Value&0x20000000000)^!!(Value&0x80000000000)^ | |
!!(Value&0x200000000000)^!!(Value&0x800000000000) | |
) | |
continue; | |
//i == 0x3F && (HasOddNumberOfBits(Value1) ^ HasOddNumberOfBits(Value2)) | |
if( | |
/* | |
!!(Value&0x4)^!!(Value&0x8)^ | |
!!(Value&0x10)^!!(Value&0x20)^!!(Value&0x40)^!!(Value&0x80)^ | |
!!(Value&0x4000)^!!(Value&0x8000)^ | |
!!(Value&0x100000)^!!(Value&0x200000)^ | |
!!(Value&0x4000000)^!!(Value&0x8000000)^ | |
*/ | |
/* | |
!!(Value&0x8)^ | |
!!(Value&0x400)^!!(Value&0x800)^ | |
!!(Value&0x200000000)^!!(Value&0x400000000)^!!(Value&0x800000000)^ | |
!!(Value&0x8000000000)^ | |
!!(Value&0x20000000000)^!!(Value&0x80000000000)^ | |
!!(Value&0x200000000000)^!!(Value&0x800000000000)^ | |
*/ | |
!!(Value&0x20000)^!!(Value&0x40000)^!!(Value&0x80000)^ | |
!!(Value&0x800000)^ | |
!!(Value&0x2000000)^!!(Value&0x8000000)^ | |
!!(Value&0x20000000)^!!(Value&0x80000000)^ | |
!!(Value&0x400000000)^ | |
!!(Value&0x2000000000) | |
) | |
continue; | |
//i == 0x3F && HasOddNumberOfBits(Value2) | |
if( | |
!!(Value&0x4)^!!(Value&0x8)^ | |
!!(Value&0x10)^!!(Value&0x20)^!!(Value&0x40)^!!(Value&0x80)^ | |
!!(Value&0x4000)^!!(Value&0x8000)^ | |
!!(Value&0x100000)^!!(Value&0x200000)^ | |
!!(Value&0x4000000)^!!(Value&0x8000000) | |
) | |
continue; | |
//i == 0x3F && (Value1 & 0x2000) | |
if( | |
!!(Value&0x1)^!!(Value&0x8)^ | |
!!(Value&0x40)^!!(Value&0x80)^ | |
!!(Value&0x100)^!!(Value&0x200)^!!(Value&0x400)^!!(Value&0x800)^ | |
!!(Value&0x1000)^!!(Value&0x2000)^!!(Value&0x4000)^!!(Value&0x8000)^ | |
!!(Value&0x10000)^!!(Value&0x20000)^!!(Value&0x40000)^!!(Value&0x80000)^ | |
!!(Value&0x100000)^!!(Value&0x200000)^!!(Value&0x400000)^!!(Value&0x800000)^ | |
!!(Value&0x1000000)^!!(Value&0x2000000)^!!(Value&0x4000000)^!!(Value&0x8000000)^ | |
!!(Value&0x10000000)^!!(Value&0x20000000)^!!(Value&0x80000000)^ | |
!!(Value&0x100000000)^!!(Value&0x400000000)^!!(Value&0x800000000)^ | |
!!(Value&0x800000000000) | |
) | |
continue; | |
//i == 0x3F && (HasOddNumberOfBits(Value1 & 0xAAAAAAAA) ^ HasOddNumberOfBits(Value2 & 0xAAAA)) | |
if( | |
!!(Value&0x1)^ | |
!!(Value&0x10)^!!(Value&0x80)^ | |
!!(Value&0x800)^ | |
!!(Value&0x8000)^ | |
!!(Value&0x40000)^ | |
!!(Value&0x100000)^!!(Value&0x400000)^!!(Value&0x800000)^ | |
!!(Value&0x4000000)^ | |
!!(Value&0x40000000)^!!(Value&0x80000000)^ | |
!!(Value&0x400000000)^!!(Value&0x800000000)^ | |
!!(Value&0x4000000000)^!!(Value&0x8000000000)^ | |
!!(Value&0x40000000000)^!!(Value&0x80000000000)^ | |
!!(Value&0x400000000000) | |
) | |
continue; | |
//i == 0x3F && (HasOddNumberOfBits(Value1 & 0xCCCCCCCC) ^ HasOddNumberOfBits(Value2 & 0xCCCC)) | |
if( | |
!!(Value&0x1)^!!(Value&0x2)^!!(Value&0x4)^ | |
!!(Value&0x10)^!!(Value&0x40)^!!(Value&0x80)^ | |
!!(Value&0x1000)^!!(Value&0x2000)^!!(Value&0x4000)^!!(Value&0x8000)^ | |
!!(Value&0x80000)^ | |
!!(Value&0x100000)^!!(Value&0x800000)^ | |
!!(Value&0x8000000)^ | |
!!(Value&0x10000000)^!!(Value&0x20000000)^!!(Value&0x40000000)^ | |
!!(Value&0x100000000)^!!(Value&0x200000000)^!!(Value&0x400000000)^ | |
!!(Value&0x1000000000)^!!(Value&0x2000000000)^!!(Value&0x4000000000)^ | |
!!(Value&0x10000000000)^!!(Value&0x20000000000)^!!(Value&0x40000000000)^ | |
!!(Value&0x100000000000)^!!(Value&0x200000000000)^!!(Value&0x400000000000)^!!(Value&0x800000000000) | |
) | |
continue; | |
//i == 0x3F && (HasOddNumberOfBits(Value1 & 0xF0F0F0F0) ^ HasOddNumberOfBits(Value2 & 0xF0F0)) | |
if( | |
!!(Value&0x1)^!!(Value&0x4)^ | |
!!(Value&0x20)^ | |
!!(Value&0x100)^!!(Value&0x200)^!!(Value&0x400)^!!(Value&0x800)^ | |
!!(Value&0x1000)^!!(Value&0x2000)^ | |
!!(Value&0x10000)^!!(Value&0x20000)^!!(Value&0x40000)^!!(Value&0x80000)^ | |
!!(Value&0x100000)^ | |
!!(Value&0x2000000)^!!(Value&0x8000000)^ | |
!!(Value&0x40000000)^!!(Value&0x80000000)^ | |
!!(Value&0x200000000)^!!(Value&0x400000000)^ | |
!!(Value&0x4000000000)^!!(Value&0x8000000000)^ | |
!!(Value&0x20000000000)^!!(Value&0x40000000000)^ | |
!!(Value&0x400000000000) | |
) | |
continue; | |
//i == 0x3F && HasOddNumberOfBits(Value1 & 0xFF00FF00) == HasOddNumberOfBits(Value2 & 0xFF00) | |
if( | |
!!(Value&0x8)^ | |
!!(Value&0x1000)^!!(Value&0x2000)^!!(Value&0x4000)^!!(Value&0x8000)^ | |
!!(Value&0x40000)^!!(Value&0x80000)^ | |
!!(Value&0x100000)^!!(Value&0x200000)^ | |
!!(Value&0x2000000)^ | |
!!(Value&0x80000000)^ | |
!!(Value&0x400000000)^ | |
!!(Value&0x2000000000)^ | |
!!(Value&0x20000000000)^!!(Value&0x40000000000)^!!(Value&0x80000000000)^ | |
!!(Value&0x800000000000) | |
) | |
continue; | |
for(int i=0; i<0x60; i++) { | |
uint64_t tmp = !!(Value&0x01)^!!(Value&0x02)^!!(Value&0x08)^!!(Value&0x10)^!!(Value&0x40)^!!(Value&0x800000000000); | |
Value = (Value >> 1) | (tmp << 47); | |
uint32_t Value1 = Value & 0xFFFFFFFF; | |
uint32_t Value2 = (Value >> 32) & 0xFFFF; | |
switch(i) { | |
case 0x0F: | |
array3[0x06] = (Value1 >> 12) & 3; | |
array3[0x07] = ((Value1 >> 19) & 1) | ((Value1 >> 2) & 2); | |
array3[0x09] = (Value1 >> 7) & 3; | |
array3[0x0C] = (Value1 >> 15) & 3; | |
dArray[0x05] = ((Value2 & ~1) << 16) | (((Value1 & 0xC000) | ((Value1 >> 1) & 0x7FFF0000)) >> 14); | |
break; | |
case 0x1F: | |
array3[0x05] = Value1 & 3; | |
array3[0x08] = ((Value1 >> 17) & 1) | ((Value1 >> 15) & 2); | |
array3[0x02] = (Value1 >> 10) & 3; | |
array3[0x01] = (Value1 >> 21) & 3; | |
dArray[0x1B] = ((Value2 & ~1) << 16) | (((Value1 & 0xC000) | ((Value1 >> 1) & 0x7FFF0000)) >> 14); | |
break; | |
case 0x2F: | |
array3[0x0A] = (Value1 >> 12) & 3; | |
array3[0x0D] = ((Value1 >> 1) & 1) | ((Value1 >> 9) & 2); | |
array3[0x04] = Value1 & 3; | |
array3[0x00] = (Value1 >> 17) & 3; | |
dArray[0x1C] = ((Value2 & ~1) << 16) | (((Value1 & 0xC000) | ((Value1 >> 1) & 0x7FFF0000)) >> 14); | |
break; | |
case 0x3F: | |
array3[0x08] = (Value1 >> 6) & 3; | |
array3[0x07] = ((Value1 >> 4) & 2) | ((Value1 >> 3) & 1); | |
array3[0x09] = (Value1 >> 11) & 3; | |
array3[0x0A] = (Value1 >> 9) & 3; | |
dArray[0x1B] = ((Value2 & ~1) << 16) | (((Value1 & 0xC000) | ((Value1 >> 1) & 0x7FFF0000)) >> 14); | |
break; | |
case 0x4F: | |
array3[0x00] = (Value1 >> 5) & 3; | |
array3[0x04] = ((Value1 >> 19) & 2) | ((Value1 >> 11) & 1); | |
array3[0x02] = (Value1 >> 2) & 3; | |
array3[0x06] = (Value1 >> 12) & 3; | |
dArray[0x05] = ((Value2 & ~1) << 16) | (((Value1 & 0xC000) | ((Value1 >> 1) & 0x7FFF0000)) >> 14); | |
break; | |
case 0x5F: | |
array3[0x05] = (Value1 >> 18) & 3; | |
array3[0x01] = ((Value1 >> 8) & 2) | ((Value1 >> 6) & 1); | |
array3[0x0D] = (Value1 >> 22) & 3; | |
array3[0x0C] = (Value1 >> 3) & 3; | |
dArray[0x13] = ((Value2 & ~1) << 16) | (((Value1 & 0xC000) | ((Value1 >> 1) & 0x7FFF0000)) >> 14); | |
break; | |
} | |
} | |
bv1 = isValid = 0; | |
dv1 = dv2 = dv3 = dv4 = 0; | |
iValue2++; | |
dArray[0x06] = 0x80200401; | |
dArray[0x17] = 0x84010011; | |
dArray[0x19] = 0x81000802; | |
dArray[0x15] = 0x90001004; | |
dArray[0x09] = 0x80080202; | |
for(int i=0, ArraySelector=0; i<13; i++, ArraySelector = !!(bv2&0x08) != !!(bv2&0x10)) { | |
if(i<8) { | |
ValueVersionKey = VersionKey; | |
dv1 = dArray[SomeByteArray1[ArraySelector][i]]; | |
dv2 = dArray[SomeByteArray2[ArraySelector][i]]; | |
dv3 = dArray[SomeByteArray3[ArraySelector][i]]; | |
dv4 = dArray[SomeByteArray4[ArraySelector][i]]; | |
dv5 = dArray[SomeByteArray5[i]]; | |
bv1 = array3[SomeByteArray6[i]]; | |
bv2 = array3[SomeByteArray7[i]]; | |
} else { | |
switch(i) { | |
case 8: | |
ValueVersionKey = dArray[0x1C] ^ dArray[0x07]; | |
dv5 = 0x80200401; | |
bv1 = array3[0x0C]; | |
bv2 = array3[0x02]; | |
break; | |
case 9: | |
ValueVersionKey = dArray[0x1B] ^ dArray[0x14]; | |
dv5 = 0x80040003; | |
bv1 = array3[0x09]; | |
bv2 = array3[0x0A]; | |
break; | |
case 10: | |
ValueVersionKey = dArray[0x05] ^ dArray[0x18]; | |
dv5 = 0x80040003; | |
bv1 = array3[0x06]; | |
bv2 = array3[0x05]; | |
break; | |
case 11: | |
ValueVersionKey = dArray[0x13] ^ dArray[0x16]; | |
dv5 = 0x80200401; | |
bv1 = array3[0x0C]; | |
bv2 = array3[0x02]; | |
break; | |
case 12: | |
ValueVersionKey = dArray[0x1B] ^ dArray[0x0D]; | |
dv5 = 0x80040003; | |
bv1 = array3[0x09]; | |
bv2 = array3[0x0A]; | |
break; | |
default: break; | |
} | |
} | |
bv2 &= 3; | |
for(int j=0; j<0x40; j++) { | |
if(j==0x20) { | |
if(bv1!=(bv2&7)) { | |
bv2^=0x18; | |
} | |
} | |
else if(j==0x30) { | |
if(bv1<(bv2&3)) { | |
bv2 ^= 0x08; | |
} else if (bv1>(bv2&7)) { | |
bv2 ^= 0x10; | |
} | |
} | |
uint8_t cl = bv1 + NumberOfBits(dv5&ValueVersionKey); | |
ValueVersionKey = (ValueVersionKey >> 1) | (cl << 31); | |
bv1 = (cl >> 1); | |
if(j==0x07||j==0x1f||j==0x3a) { | |
dv1 = ValueVersionKey; | |
} | |
if(j==0x17||j==0x23||j==0x2f) { | |
dv2 = ValueVersionKey; | |
} | |
if(j==0x10||j==0x35||j==0x1A) { | |
dv3 = ValueVersionKey; | |
} | |
if(j==0x29||j==0x16||j==0x2d) { | |
dv4 = ValueVersionKey; | |
} | |
if(j==0x33||j==0x3e) { | |
dv5 = ValueVersionKey; | |
} | |
if(j==0x37||j==0x38) { | |
if(bv1==(bv2&3)) { | |
bv2^=0x58; | |
} | |
} | |
} | |
if(i<8) { | |
dArray[SomeByteArray1[ArraySelector][i]] = dv1; | |
dArray[SomeByteArray2[ArraySelector][i]] = dv2; | |
dArray[SomeByteArray3[ArraySelector][i]] = dv3; | |
dArray[SomeByteArray4[ArraySelector][i]] = dv4; | |
dArray[SomeByteArray5[i]] = dv5; | |
array3[SomeByteArray7[i]] = bv2; | |
} else { | |
switch(i) { | |
case 8: | |
//printf("%X\n", dv3); | |
for(int l=0; l<1/*23*/; l++) { | |
if(dv3 == KeyValues[l]) { | |
printf("Found Key @0: %u %X\n", l, KeyValues[l]); | |
//isValid = 1; // TODO: only works in RDLevSet.exe | |
} | |
} | |
break; | |
case 10: | |
//printf("%X\n", dv4); | |
for(int l=0; l<1/*23*/; l++) { | |
if(dv4 == KeyValues[l]) { | |
printf("Found Key @2: %u %X\n", l, KeyValues[l]); | |
//isValid = 1; // TODO: only works in RDLevSet.exe | |
} | |
} | |
break; | |
case 11: | |
//printf("%X\n", dv1); | |
for(int l=0; l<1/*23*/; l++) { | |
if(dv1 == KeyValues[l]) { | |
printf("Found Key @3: %u %X\n", l, KeyValues[l]); | |
isValid = 1; | |
} | |
} | |
break; | |
case 9: | |
case 12: | |
//printf("%X\n", dv2); | |
for(int l=0; l<1/*23*/; l++) { | |
if(dv2 == KeyValues[l]) { | |
printf("Found Key @1/4: %u %X\n", l, KeyValues[l]); | |
isValid = 1; | |
} | |
} | |
break; | |
} | |
} | |
} | |
if(isValid || ((iValue2&0xFFFFFF) == 0xFFFFFF)) { | |
/*for(int k=0; k<29; k++) { | |
if(dArray[k]) printf("%02X: %08X\n", k, dArray[k]); | |
}*/ | |
#ifdef _MSC_VER | |
QueryPerformanceCounter(&li2); | |
secondsTotal = (li2.QuadPart-CounterStart)/PCFreq/1000; | |
#else | |
clock_gettime(CLOCK_MONOTONIC, &li2); | |
secondsTotal = (li2.tv_sec + li2.tv_nsec / 1E9) - CounterStart; | |
#endif | |
hours = (secondsTotal/60)/60; | |
minutes = (secondsTotal/60)%60; | |
seconds = secondsTotal%60; | |
printf("isValid: %u, AuthCode: %s, iValue2: %I64X, Value1: %I64X, Value2: %I64X, %u:%02u:%02u hours, Progress: %lf\n", isValid, ConvertToAuthCode(iValue), iValue2, iValue&0xFFFFFFFF, iValue>>32, hours, minutes, seconds, 100*(double)(iValue - start)/(end - start)); | |
//printf("0: %X %X %X %X %X\n", dv3, dv2, dv4, dv1, dv2); | |
} | |
} | |
#ifdef _MSC_VER | |
QueryPerformanceCounter(&li2); | |
secondsTotal = (li2.QuadPart-CounterStart)/PCFreq/1000; | |
#else | |
clock_gettime(CLOCK_MONOTONIC, &li2); | |
secondsTotal = (li2.tv_sec + li2.tv_nsec / 1E9) - CounterStart; | |
#endif | |
hours = (secondsTotal/60)/60; | |
minutes = (secondsTotal/60)%60; | |
seconds = secondsTotal%60; | |
printf("Finished in %u:%02u:%02u hours\n", hours, minutes, seconds); | |
return 0; | |
} | |
'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R' | |
}; | |
static const uint8_t ConversionTable[5][24] = { | |
{0xFF, 0x0C, 0xFF, 0xFF, 0x02, 0x09, 0x0D, 0xFF, | |
0x01, 0x05, 0x07, 0x04, 0x0B, 0x03, 0x06, 0x0F, | |
0xFF, 0x00, 0x0E, 0xFF, 0xFF, 0xFF, 0x0A, 0x08}, | |
{0x04, 0xFF, 0x03, 0x0A, 0x02, 0x07, 0xFF, 0x00, | |
0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x01, 0x0F, 0x08, | |
0x09, 0x05, 0x0B, 0xFF, 0xFF, 0x06, 0xFF, 0xFF}, | |
{0x01, 0x08, 0xFF, 0x0C, 0x07, 0xFF, 0x02, 0x03, | |
0x0B, 0x06, 0x0F, 0x09, 0x0A, 0x0E, 0xFF, 0xFF, | |
0xFF, 0xFF, 0x04, 0xFF, 0x00, 0x0D, 0x05, 0xFF}, | |
{0xFF, 0x0D, 0x06, 0x09, 0x02, 0xFF, 0x05, 0x0C, | |
0x0A, 0x01, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0x04, | |
0x0F, 0xFF, 0x07, 0x08, 0x0E, 0xFF, 0x03, 0x00}, | |
{0x0C, 0x04, 0xFF, 0x09, 0x07, 0x06, 0xFF, 0xFF, | |
0xFF, 0x0D, 0x0E, 0xFF, 0x02, 0xFF, 0xFF, 0x03, | |
0x05, 0x0A, 0x00, 0x08, 0x0F, 0x0B, 0xFF, 0x01} | |
}; | |
static const uint8_t ArraySelectors[5][24] = { | |
{0xFF, 0x01, 0xFF, 0xFF, 0x02, 0x04, 0x01, 0xFF, | |
0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, | |
0xFF, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0x04, 0x04}, | |
{0x02, 0xFF, 0x00, 0x02, 0x03, 0x02, 0xFF, 0x03, | |
0xFF, 0xFF, 0x03, 0x04, 0x02, 0x02, 0x02, 0x01, | |
0x03, 0x04, 0x04, 0xFF, 0xFF, 0x03, 0xFF, 0xFF}, | |
{0x02, 0x04, 0xFF, 0x03, 0x01, 0xFF, 0x01, 0x00, | |
0x02, 0x03, 0x04, 0x03, 0x01, 0x03, 0xFF, 0xFF, | |
0xFF, 0xFF, 0x01, 0xFF, 0x01, 0x04, 0x01, 0xFF}, | |
{0xFF, 0x01, 0x01, 0x04, 0x00, 0xFF, 0x03, 0x00, | |
0x04, 0x00, 0xFF, 0xFF, 0x02, 0xFF, 0xFF, 0x04, | |
0x00, 0xFF, 0x00, 0x02, 0x03, 0xFF, 0x04, 0x02}, | |
{0x00, 0x02, 0xFF, 0x03, 0x04, 0x03, 0xFF, 0xFF, | |
0xFF, 0x00, 0x00, 0xFF, 0x02, 0xFF, 0xFF, 0x03, | |
0x00, 0x01, 0x04, 0x03, 0x01, 0x04, 0xFF, 0x03} | |
}; | |
static const char * ConvertToAuthCode(uint64_t Value) { | |
static char AuthCode[17]; | |
int i, j; | |
unsigned ArraySelector = 0; | |
while(Value && !(Value>>60) ) { | |
Value<<=4; | |
} | |
for(i=0; Value; i++) { | |
for(j=0; j<24; j++) { | |
if(ConversionTable[ArraySelector][j] == (Value>>60)) { | |
AuthCode[i] = Base24Array[j]; | |
ArraySelector = ArraySelectors[ArraySelector][j]; | |
break; | |
} | |
} | |
Value<<=4; | |
} | |
AuthCode[i] = 0; | |
return AuthCode; | |
} | |
static const uint8_t SomeByteArray1[2][8] = { | |
{0x07, 0x0B, 0x0D, 0x11, 0x16, 0x10, 0x0E, 0x18}, | |
{0x07, 0x0D, 0x14, 0x18, 0x14, 0x10, 0x07, 0x0B} | |
}; | |
static const uint8_t SomeByteArray2[2][8] = { | |
{0x10, 0x0E, 0x16, 0x14, 0x18, 0x07, 0x11, 0x0B}, | |
{0x10, 0x18, 0x07, 0x0D, 0x0B, 0x11, 0x11, 0x0E} | |
}; | |
static const uint8_t SomeByteArray3[2][8] = { | |
{0x11, 0x14, 0x0B, 0x0D, 0x0E, 0x16, 0x18, 0x07}, | |
{0x11, 0x10, 0x0B, 0x11, 0x0D, 0x18, 0x16, 0x07} | |
}; | |
static const uint8_t SomeByteArray4[2][8] = { | |
{0x14, 0x0D, 0x0E, 0x18, 0x07, 0x0B, 0x10, 0x11}, | |
{0x14, 0x16, 0x11, 0x0E, 0x16, 0x0B, 0x10, 0x18} | |
}; | |
static const uint8_t SomeByteArray5[8] = { | |
0x09, 0x17, 0x06, 0x19, 0x15, 0x17, 0x19, 0x09 | |
}; | |
static const uint8_t SomeByteArray6[8] = { | |
0x00, 0x0D, 0x0D, 0x08, 0x01, 0x04, 0x07, 0x07 | |
}; | |
static const uint8_t SomeByteArray7[8] = { | |
0x04, 0x01, 0x00, 0x07, 0x0D, 0x08, 0x00, 0x04 | |
}; | |
static const uint32_t KeyValues[23] = { | |
// key for main program | |
0x436F7265, | |
// keys for single levels | |
0x76951662, //106 | |
0x4721E265, //108 | |
0x579BF236, //109 | |
0x98599C6D, //110 | |
0x6BD8F0B9, //111 | |
0xBF6569E8, //112 | |
0xE1331E2A, //113 | |
0x4D02B694, //114 | |
0xB807175C, //115 | |
0xDC61F92B, //116 | |
0xFB64CC1D, //117 | |
0x5DB192C8, //118 | |
0x484DDFB4, //119 | |
0x455702CA, //121 | |
0x73527E14, //122 | |
0xDDB10EDE, //126 | |
0x64DE7EE8, //124 | |
0x28B93B85, //106 | |
// multi-level keys, missing: 117, 124, 126 | |
0xEBDAD7F1, // (106, 108, 109, 110, 111) | |
0x21033974, // (106, 108, 109, 110, 111) | |
0x5391E536, // (112, 113, 114, 115, 116) | |
0xC7C23136 // (118, 119, 121, 122) | |
//0xFB64CC1D, 0x64DE7EE8, 0xDDB10EDE, 0xEBDAD7F1, 0x5391E536, 0xC7C23136 | |
}; | |
static inline bool HasOddNumberOfBits(uint32_t x) { | |
#if 1 | |
return __builtin_parity(x); | |
#else | |
x = x ^ (x >> 16); | |
x = x ^ (x >> 8); | |
x = x ^ (x >> 4); | |
x = x ^ (x >> 2); | |
return ((x >> 1) & 1) ^ (x & 1); | |
#endif | |
} | |
static inline uint32_t NumberOfBits(uint32_t x) { | |
#if 1 | |
return __builtin_popcount(x); | |
#else | |
x = x - ((x >> 1) & 0x55555555); | |
x = (x & 0x33333333) + ((x >> 2) & 0x33333333); | |
x = (x + (x >> 4)) & 0x0F0F0F0F; | |
x = x + (x >> 8); | |
x = x + (x >> 16); | |
return x & 0x0000003F; | |
#endif | |
} | |
/* | |
isValid: 1, Time: 18323.544884 seconds, iAuthCode: 129646A25C, iAuthCode2: 12964549, Value1: 9646A25C Value2: 12 Progress: 7.260553% | |
isValid: 0, Time: 44753.829474 seconds, iAuthCode: 2AFFFDFBCF, iAuthCode2: 2AFFFFFF, Value1: FFFDFBCF Value2: 2A Progress: 16.796863% | |
0x52 | |
*/ | |
int main() { | |
uint64_t iValue2, secondsTotal; | |
uint32_t VersionKey; | |
uint32_t hours, minutes, seconds; | |
uint64_t start, end; | |
#ifdef _MSC_VER | |
LARGE_INTEGER li1, li2; | |
double PCFreq = 0.0; | |
__int64 CounterStart; | |
QueryPerformanceFrequency(&li1); | |
PCFreq = (double)li1.QuadPart/1000.0; | |
QueryPerformanceCounter(&li1); | |
CounterStart = li1.QuadPart; | |
#else | |
struct timespec li1, li2; | |
int64_t CounterStart; | |
clock_gettime(CLOCK_MONOTONIC, &li1); | |
CounterStart = li1.tv_sec + (li1.tv_nsec / 1E9); | |
#endif | |
VersionKey = 0xCE9190D8; //0x72C53A70; // Is sometimes changed if debugged | |
iValue2=0; | |
start = 0; | |
end = 0x8000000000; | |
//start = 0; | |
//end = 281474976710656ULL; // 48-bit | |
#pragma omp parallel for private(li2, iValue2) | |
for(uint64_t iValue=start; iValue<end; iValue++) { | |
bool isValid; | |
uint8_t array3[16]; | |
uint32_t dArray[29]; | |
uint32_t ValueVersionKey, bv1, bv2; | |
uint32_t dv1, dv2, dv3, dv4, dv5; | |
uint64_t Value = iValue; | |
//i == 0x3F && HasOddNumberOfBits(Value1 & 0xFFFF0000) | |
if ( | |
!!(Value&0x8)^ | |
!!(Value&0x400)^!!(Value&0x800)^ | |
!!(Value&0x200000000)^!!(Value&0x400000000)^!!(Value&0x800000000)^ | |
!!(Value&0x8000000000)^ | |
!!(Value&0x20000000000)^!!(Value&0x80000000000)^ | |
!!(Value&0x200000000000)^!!(Value&0x800000000000) | |
) | |
continue; | |
//i == 0x3F && (HasOddNumberOfBits(Value1) ^ HasOddNumberOfBits(Value2)) | |
if( | |
/* | |
!!(Value&0x4)^!!(Value&0x8)^ | |
!!(Value&0x10)^!!(Value&0x20)^!!(Value&0x40)^!!(Value&0x80)^ | |
!!(Value&0x4000)^!!(Value&0x8000)^ | |
!!(Value&0x100000)^!!(Value&0x200000)^ | |
!!(Value&0x4000000)^!!(Value&0x8000000)^ | |
*/ | |
/* | |
!!(Value&0x8)^ | |
!!(Value&0x400)^!!(Value&0x800)^ | |
!!(Value&0x200000000)^!!(Value&0x400000000)^!!(Value&0x800000000)^ | |
!!(Value&0x8000000000)^ | |
!!(Value&0x20000000000)^!!(Value&0x80000000000)^ | |
!!(Value&0x200000000000)^!!(Value&0x800000000000)^ | |
*/ | |
!!(Value&0x20000)^!!(Value&0x40000)^!!(Value&0x80000)^ | |
!!(Value&0x800000)^ | |
!!(Value&0x2000000)^!!(Value&0x8000000)^ | |
!!(Value&0x20000000)^!!(Value&0x80000000)^ | |
!!(Value&0x400000000)^ | |
!!(Value&0x2000000000) | |
) | |
continue; | |
//i == 0x3F && HasOddNumberOfBits(Value2) | |
if( | |
!!(Value&0x4)^!!(Value&0x8)^ | |
!!(Value&0x10)^!!(Value&0x20)^!!(Value&0x40)^!!(Value&0x80)^ | |
!!(Value&0x4000)^!!(Value&0x8000)^ | |
!!(Value&0x100000)^!!(Value&0x200000)^ | |
!!(Value&0x4000000)^!!(Value&0x8000000) | |
) | |
continue; | |
//i == 0x3F && (Value1 & 0x2000) | |
if( | |
!!(Value&0x1)^!!(Value&0x8)^ | |
!!(Value&0x40)^!!(Value&0x80)^ | |
!!(Value&0x100)^!!(Value&0x200)^!!(Value&0x400)^!!(Value&0x800)^ | |
!!(Value&0x1000)^!!(Value&0x2000)^!!(Value&0x4000)^!!(Value&0x8000)^ | |
!!(Value&0x10000)^!!(Value&0x20000)^!!(Value&0x40000)^!!(Value&0x80000)^ | |
!!(Value&0x100000)^!!(Value&0x200000)^!!(Value&0x400000)^!!(Value&0x800000)^ | |
!!(Value&0x1000000)^!!(Value&0x2000000)^!!(Value&0x4000000)^!!(Value&0x8000000)^ | |
!!(Value&0x10000000)^!!(Value&0x20000000)^!!(Value&0x80000000)^ | |
!!(Value&0x100000000)^!!(Value&0x400000000)^!!(Value&0x800000000)^ | |
!!(Value&0x800000000000) | |
) | |
continue; | |
//i == 0x3F && (HasOddNumberOfBits(Value1 & 0xAAAAAAAA) ^ HasOddNumberOfBits(Value2 & 0xAAAA)) | |
if( | |
!!(Value&0x1)^ | |
!!(Value&0x10)^!!(Value&0x80)^ | |
!!(Value&0x800)^ | |
!!(Value&0x8000)^ | |
!!(Value&0x40000)^ | |
!!(Value&0x100000)^!!(Value&0x400000)^!!(Value&0x800000)^ | |
!!(Value&0x4000000)^ | |
!!(Value&0x40000000)^!!(Value&0x80000000)^ | |
!!(Value&0x400000000)^!!(Value&0x800000000)^ | |
!!(Value&0x4000000000)^!!(Value&0x8000000000)^ | |
!!(Value&0x40000000000)^!!(Value&0x80000000000)^ | |
!!(Value&0x400000000000) | |
) | |
continue; | |
//i == 0x3F && (HasOddNumberOfBits(Value1 & 0xCCCCCCCC) ^ HasOddNumberOfBits(Value2 & 0xCCCC)) | |
if( | |
!!(Value&0x1)^!!(Value&0x2)^!!(Value&0x4)^ | |
!!(Value&0x10)^!!(Value&0x40)^!!(Value&0x80)^ | |
!!(Value&0x1000)^!!(Value&0x2000)^!!(Value&0x4000)^!!(Value&0x8000)^ | |
!!(Value&0x80000)^ | |
!!(Value&0x100000)^!!(Value&0x800000)^ | |
!!(Value&0x8000000)^ | |
!!(Value&0x10000000)^!!(Value&0x20000000)^!!(Value&0x40000000)^ | |
!!(Value&0x100000000)^!!(Value&0x200000000)^!!(Value&0x400000000)^ | |
!!(Value&0x1000000000)^!!(Value&0x2000000000)^!!(Value&0x4000000000)^ | |
!!(Value&0x10000000000)^!!(Value&0x20000000000)^!!(Value&0x40000000000)^ | |
!!(Value&0x100000000000)^!!(Value&0x200000000000)^!!(Value&0x400000000000)^!!(Value&0x800000000000) | |
) | |
continue; | |
//i == 0x3F && (HasOddNumberOfBits(Value1 & 0xF0F0F0F0) ^ HasOddNumberOfBits(Value2 & 0xF0F0)) | |
if( | |
!!(Value&0x1)^!!(Value&0x4)^ | |
!!(Value&0x20)^ | |
!!(Value&0x100)^!!(Value&0x200)^!!(Value&0x400)^!!(Value&0x800)^ | |
!!(Value&0x1000)^!!(Value&0x2000)^ | |
!!(Value&0x10000)^!!(Value&0x20000)^!!(Value&0x40000)^!!(Value&0x80000)^ | |
!!(Value&0x100000)^ | |
!!(Value&0x2000000)^!!(Value&0x8000000)^ | |
!!(Value&0x40000000)^!!(Value&0x80000000)^ | |
!!(Value&0x200000000)^!!(Value&0x400000000)^ | |
!!(Value&0x4000000000)^!!(Value&0x8000000000)^ | |
!!(Value&0x20000000000)^!!(Value&0x40000000000)^ | |
!!(Value&0x400000000000) | |
) | |
continue; | |
//i == 0x3F && HasOddNumberOfBits(Value1 & 0xFF00FF00) == HasOddNumberOfBits(Value2 & 0xFF00) | |
if( | |
!!(Value&0x8)^ | |
!!(Value&0x1000)^!!(Value&0x2000)^!!(Value&0x4000)^!!(Value&0x8000)^ | |
!!(Value&0x40000)^!!(Value&0x80000)^ | |
!!(Value&0x100000)^!!(Value&0x200000)^ | |
!!(Value&0x2000000)^ | |
!!(Value&0x80000000)^ | |
!!(Value&0x400000000)^ | |
!!(Value&0x2000000000)^ | |
!!(Value&0x20000000000)^!!(Value&0x40000000000)^!!(Value&0x80000000000)^ | |
!!(Value&0x800000000000) | |
) | |
continue; | |
for(int i=0; i<0x60; i++) { | |
uint64_t tmp = !!(Value&0x01)^!!(Value&0x02)^!!(Value&0x08)^!!(Value&0x10)^!!(Value&0x40)^!!(Value&0x800000000000); | |
Value = (Value >> 1) | (tmp << 47); | |
uint32_t Value1 = Value & 0xFFFFFFFF; | |
uint32_t Value2 = (Value >> 32) & 0xFFFF; | |
switch(i) { | |
case 0x0F: | |
array3[0x06] = (Value1 >> 12) & 3; | |
array3[0x07] = ((Value1 >> 19) & 1) | ((Value1 >> 2) & 2); | |
array3[0x09] = (Value1 >> 7) & 3; | |
array3[0x0C] = (Value1 >> 15) & 3; | |
dArray[0x05] = ((Value2 & ~1) << 16) | (((Value1 & 0xC000) | ((Value1 >> 1) & 0x7FFF0000)) >> 14); | |
break; | |
case 0x1F: | |
array3[0x05] = Value1 & 3; | |
array3[0x08] = ((Value1 >> 17) & 1) | ((Value1 >> 15) & 2); | |
array3[0x02] = (Value1 >> 10) & 3; | |
array3[0x01] = (Value1 >> 21) & 3; | |
dArray[0x1B] = ((Value2 & ~1) << 16) | (((Value1 & 0xC000) | ((Value1 >> 1) & 0x7FFF0000)) >> 14); | |
break; | |
case 0x2F: | |
array3[0x0A] = (Value1 >> 12) & 3; | |
array3[0x0D] = ((Value1 >> 1) & 1) | ((Value1 >> 9) & 2); | |
array3[0x04] = Value1 & 3; | |
array3[0x00] = (Value1 >> 17) & 3; | |
dArray[0x1C] = ((Value2 & ~1) << 16) | (((Value1 & 0xC000) | ((Value1 >> 1) & 0x7FFF0000)) >> 14); | |
break; | |
case 0x3F: | |
array3[0x08] = (Value1 >> 6) & 3; | |
array3[0x07] = ((Value1 >> 4) & 2) | ((Value1 >> 3) & 1); | |
array3[0x09] = (Value1 >> 11) & 3; | |
array3[0x0A] = (Value1 >> 9) & 3; | |
dArray[0x1B] = ((Value2 & ~1) << 16) | (((Value1 & 0xC000) | ((Value1 >> 1) & 0x7FFF0000)) >> 14); | |
break; | |
case 0x4F: | |
array3[0x00] = (Value1 >> 5) & 3; | |
array3[0x04] = ((Value1 >> 19) & 2) | ((Value1 >> 11) & 1); | |
array3[0x02] = (Value1 >> 2) & 3; | |
array3[0x06] = (Value1 >> 12) & 3; | |
dArray[0x05] = ((Value2 & ~1) << 16) | (((Value1 & 0xC000) | ((Value1 >> 1) & 0x7FFF0000)) >> 14); | |
break; | |
case 0x5F: | |
array3[0x05] = (Value1 >> 18) & 3; | |
array3[0x01] = ((Value1 >> 8) & 2) | ((Value1 >> 6) & 1); | |
array3[0x0D] = (Value1 >> 22) & 3; | |
array3[0x0C] = (Value1 >> 3) & 3; | |
dArray[0x13] = ((Value2 & ~1) << 16) | (((Value1 & 0xC000) | ((Value1 >> 1) & 0x7FFF0000)) >> 14); | |
break; | |
} | |
} | |
bv1 = isValid = 0; | |
dv1 = dv2 = dv3 = dv4 = 0; | |
iValue2++; | |
dArray[0x06] = 0x80200401; | |
dArray[0x17] = 0x84010011; | |
dArray[0x19] = 0x81000802; | |
dArray[0x15] = 0x90001004; | |
dArray[0x09] = 0x80080202; | |
for(int i=0, ArraySelector=0; i<13; i++, ArraySelector = !!(bv2&0x08) != !!(bv2&0x10)) { | |
if(i<8) { | |
ValueVersionKey = VersionKey; | |
dv1 = dArray[SomeByteArray1[ArraySelector][i]]; | |
dv2 = dArray[SomeByteArray2[ArraySelector][i]]; | |
dv3 = dArray[SomeByteArray3[ArraySelector][i]]; | |
dv4 = dArray[SomeByteArray4[ArraySelector][i]]; | |
dv5 = dArray[SomeByteArray5[i]]; | |
bv1 = array3[SomeByteArray6[i]]; | |
bv2 = array3[SomeByteArray7[i]]; | |
} else { | |
switch(i) { | |
case 8: | |
ValueVersionKey = dArray[0x1C] ^ dArray[0x07]; | |
dv5 = 0x80200401; | |
bv1 = array3[0x0C]; | |
bv2 = array3[0x02]; | |
break; | |
case 9: | |
ValueVersionKey = dArray[0x1B] ^ dArray[0x14]; | |
dv5 = 0x80040003; | |
bv1 = array3[0x09]; | |
bv2 = array3[0x0A]; | |
break; | |
case 10: | |
ValueVersionKey = dArray[0x05] ^ dArray[0x18]; | |
dv5 = 0x80040003; | |
bv1 = array3[0x06]; | |
bv2 = array3[0x05]; | |
break; | |
case 11: | |
ValueVersionKey = dArray[0x13] ^ dArray[0x16]; | |
dv5 = 0x80200401; | |
bv1 = array3[0x0C]; | |
bv2 = array3[0x02]; | |
break; | |
case 12: | |
ValueVersionKey = dArray[0x1B] ^ dArray[0x0D]; | |
dv5 = 0x80040003; | |
bv1 = array3[0x09]; | |
bv2 = array3[0x0A]; | |
break; | |
default: break; | |
} | |
} | |
bv2 &= 3; | |
for(int j=0; j<0x40; j++) { | |
if(j==0x20) { | |
if(bv1!=(bv2&7)) { | |
bv2^=0x18; | |
} | |
} | |
else if(j==0x30) { | |
if(bv1<(bv2&3)) { | |
bv2 ^= 0x08; | |
} else if (bv1>(bv2&7)) { | |
bv2 ^= 0x10; | |
} | |
} | |
uint8_t cl = bv1 + NumberOfBits(dv5&ValueVersionKey); | |
ValueVersionKey = (ValueVersionKey >> 1) | (cl << 31); | |
bv1 = (cl >> 1); | |
if(j==0x07||j==0x1f||j==0x3a) { | |
dv1 = ValueVersionKey; | |
} | |
if(j==0x17||j==0x23||j==0x2f) { | |
dv2 = ValueVersionKey; | |
} | |
if(j==0x10||j==0x35||j==0x1A) { | |
dv3 = ValueVersionKey; | |
} | |
if(j==0x29||j==0x16||j==0x2d) { | |
dv4 = ValueVersionKey; | |
} | |
if(j==0x33||j==0x3e) { | |
dv5 = ValueVersionKey; | |
} | |
if(j==0x37||j==0x38) { | |
if(bv1==(bv2&3)) { | |
bv2^=0x58; | |
} | |
} | |
} | |
if(i<8) { | |
dArray[SomeByteArray1[ArraySelector][i]] = dv1; | |
dArray[SomeByteArray2[ArraySelector][i]] = dv2; | |
dArray[SomeByteArray3[ArraySelector][i]] = dv3; | |
dArray[SomeByteArray4[ArraySelector][i]] = dv4; | |
dArray[SomeByteArray5[i]] = dv5; | |
array3[SomeByteArray7[i]] = bv2; | |
} else { | |
switch(i) { | |
case 8: | |
//printf("%X\n", dv3); | |
for(int l=0; l<1/*23*/; l++) { | |
if(dv3 == KeyValues[l]) { | |
printf("Found Key @0: %u %X\n", l, KeyValues[l]); | |
//isValid = 1; // TODO: only works in RDLevSet.exe | |
} | |
} | |
break; | |
case 10: | |
//printf("%X\n", dv4); | |
for(int l=0; l<1/*23*/; l++) { | |
if(dv4 == KeyValues[l]) { | |
printf("Found Key @2: %u %X\n", l, KeyValues[l]); | |
//isValid = 1; // TODO: only works in RDLevSet.exe | |
} | |
} | |
break; | |
case 11: | |
//printf("%X\n", dv1); | |
for(int l=0; l<1/*23*/; l++) { | |
if(dv1 == KeyValues[l]) { | |
printf("Found Key @3: %u %X\n", l, KeyValues[l]); | |
isValid = 1; | |
} | |
} | |
break; | |
case 9: | |
case 12: | |
//printf("%X\n", dv2); | |
for(int l=0; l<1/*23*/; l++) { | |
if(dv2 == KeyValues[l]) { | |
printf("Found Key @1/4: %u %X\n", l, KeyValues[l]); | |
isValid = 1; | |
} | |
} | |
break; | |
} | |
} | |
} | |
if(isValid || ((iValue2&0xFFFFFF) == 0xFFFFFF)) { | |
/*for(int k=0; k<29; k++) { | |
if(dArray[k]) printf("%02X: %08X\n", k, dArray[k]); | |
}*/ | |
#ifdef _MSC_VER | |
QueryPerformanceCounter(&li2); | |
secondsTotal = (li2.QuadPart-CounterStart)/PCFreq/1000; | |
#else | |
clock_gettime(CLOCK_MONOTONIC, &li2); | |
secondsTotal = (li2.tv_sec + li2.tv_nsec / 1E9) - CounterStart; | |
#endif | |
hours = (secondsTotal/60)/60; | |
minutes = (secondsTotal/60)%60; | |
seconds = secondsTotal%60; | |
printf("isValid: %u, AuthCode: %s, iValue2: %I64X, Value1: %I64X, Value2: %I64X, %u:%02u:%02u hours, Progress: %lf\n", isValid, ConvertToAuthCode(iValue), iValue2, iValue&0xFFFFFFFF, iValue>>32, hours, minutes, seconds, 100*(double)(iValue - start)/(end - start)); | |
//printf("0: %X %X %X %X %X\n", dv3, dv2, dv4, dv1, dv2); | |
} | |
} | |
#ifdef _MSC_VER | |
QueryPerformanceCounter(&li2); | |
secondsTotal = (li2.QuadPart-CounterStart)/PCFreq/1000; | |
#else | |
clock_gettime(CLOCK_MONOTONIC, &li2); | |
secondsTotal = (li2.tv_sec + li2.tv_nsec / 1E9) - CounterStart; | |
#endif | |
hours = (secondsTotal/60)/60; | |
minutes = (secondsTotal/60)%60; | |
seconds = secondsTotal%60; | |
printf("Finished in %u:%02u:%02u hours\n", hours, minutes, seconds); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment