I reverse engineered a program protection algorithm and got the result in this source file I wrote, but I would know this type of protection. Please tell me what is the type of this protection ? And is there any ability to create a keygen of this algorithm ?
#include <stdio.h>
#include <string.h>
char* transformStrip = "123456789ABCDEFGHIJKLMNPQRSTUVWXYZ";
char* myusername = "MYUSERNAME";
char* myserial = "MYSERIAL33222222222222222";
//OK
int TransformChar(char c)
{
for(int i=0;i<0x22;i++)
{
if(transformStrip[i] == c)
return i;
}
return 0;
}
//OK
bool MagicCalculator1(char* magicBuffer, int number)
{
int a = 0;
//int rez = 0;
for (int i=0;i<0x20;i++)
{
int rez = (unsigned char)magicBuffer[i];
rez *= number;
rez += a;
magicBuffer[i] = (unsigned char)rez;
if(rez >= 0x100)
{
a = rez;
if(a < 0)
a += 0xFF;
a >>= 8;
}else
a = 0;
}
return (bool)a;
}
bool MagicCalculator2(char* magicBuffer, int position)
{
int a = 0;
for (int i=0;i<0x20;i++)
{
int rez = magicBuffer[i];
a += rez;
rez = position + a;
magicBuffer[i] = (char) rez;
position = 0;
if(rez >= 0x100)
{
a = rez;
}else
a = 0;
}
return (bool)a;
}
// sizeof(magicBuffer) = 0x20
// OK
int SerialMagicGenerator(char* serial, char* magicBuffer, int number)
{
int serialLength = strlen(serial);
if (serialLength <= 0)
return 0;
for(int i=0;i<serialLength;i++)
{
char c = serial[i];
if (c != '\x20' && c != '\x2D')
{
int pos = TransformChar(c);
if (MagicCalculator1(magicBuffer, number))
return -1;
if (MagicCalculator2(magicBuffer, pos))
return -1;
}
}
return 0;
}
unsigned short MagicValidator(char* combinedBuffer, int number)
{
int c = 0;
if(number)
{
for(int i=0;i<number;i++)
{
int rez = ((unsigned char) combinedBuffer[i]) << 8;
c ^= rez;
for(int j=0;j<8;j++)
{
if(c & 0x8000)
{
c += c;
c ^= 0x1021;
}else
c <<= 1;
}
}
}
unsigned short s = (unsigned short) ( ((c & 0xFF) << 8) | ((c & 0xFF00) >> 8) );
return s;
}
bool UsernameMagicVerifier(char* randomizedUsername, char* magicBuffer)
{
char combinedBuffer[0x20];
memset(combinedBuffer, 0, 0x20);
memcpy(combinedBuffer, randomizedUsername, 0x10);
memcpy(combinedBuffer + 0x10, magicBuffer, 0x10);
unsigned short mustHaveValue = (unsigned short) (MagicValidator(combinedBuffer, 0x1E) & 0x7FFF);
unsigned short foundValue = (unsigned short) ((*(unsigned short*) (magicBuffer + 0xE)) & 0x7FFF);
return (mustHaveValue == foundValue);
}
bool FinalizerVerifier(void*a, void*b)
{
//assuming this always returns true
return true;
}
char RandomizedUsernameBuffer[0x10];
char* RandomizeUsername(char* username)
{
memset(RandomizedUsernameBuffer, 0, 0x10);
int usernameLength = strlen(username);
if(usernameLength >= 1)
{
if(usernameLength < 0x10)
{
int size = (usernameLength >> 2) * 4;
memcpy(RandomizedUsernameBuffer, username, size);
memcpy(RandomizedUsernameBuffer + size, username + size, usernameLength & 3);
if( usernameLength + 1 < 0x10 )
{
char* ptr;
ptr = RandomizedUsernameBuffer + size + (usernameLength & 3) + 1;
for(int i=0;ptr<RandomizedUsernameBuffer+0x10;ptr++)
{
if( username[i] != '\0')
{
*ptr = username[i];
i++;
}else
i = 0;
}
}
}
}
return RandomizedUsernameBuffer;
}
bool SerialChecker(char* username, char* serial)
{
char magicBuffer[0x20];
memset(magicBuffer, 0, 0x20);
char* randomizedUsername = RandomizeUsername(username);
SerialMagicGenerator(serial, magicBuffer, 0x22);
if ( UsernameMagicVerifier(randomizedUsername, magicBuffer) )
{
return FinalizerVerifier(/*?*/NULL, /*?*/NULL);
}
return false;
}
int main()
{
SerialChecker(myusername, myserial);
return 0;
}