-
Автор темы
- #1
Навеяно этой темой:
Копия моей темы с другого форума.
Часть старой привязки, оставил основные алгоритмы для общей работоспособности, убрав основные методы)))
По сути так себе защита, но для новичков думаю будет над чем поразмыслить.
Предоставлю голый код без "глубокого объяснения" ....
Конечный ключ "генерируется на основе" указаного имени.
Класс сKeyEx
cKeyEx.h
cKeyEx.cpp
Класс cLicense
cLicense.h
cLicense.cpp
Использование:
Структура хранения данных юзера
Структура хранения итоговых данных, для активных юзеров
Проверка:
Опираясь на имя заданное в структуре cInfKey, генерируем ключ и сверяем с внесенным в "базу". Если имеется совпадение Имя-Ключ возвращаем "истину", если совпадений нет - "ложь".
Пожалуйста, авторизуйтесь для просмотра ссылки.
Копия моей темы с другого форума.
Часть старой привязки, оставил основные алгоритмы для общей работоспособности, убрав основные методы)))
По сути так себе защита, но для новичков думаю будет над чем поразмыслить.
Предоставлю голый код без "глубокого объяснения" ....
Конечный ключ "генерируется на основе" указаного имени.
Класс сKeyEx
cKeyEx.h
Код:
#pragma once
#include <windows.h>
#include <string>
class cKeyEx
{
typedef VOID(WINAPI *GSI)(LPSYSTEM_INFO);
public:
cKeyEx();
virtual ~cKeyEx();
protected:
virtual DWORD get();
private:
SYSTEM_INFO sysinfo;
virtual DWORD getInfo();
};
class cSerialEx : public cKeyEx
{
public:
cSerialEx()
{
this->dwKey = get();
};
DWORD dwKey;
};
Код:
#include "cKeyEx.h"
cKeyEx::cKeyEx()
{
ZeroMemory(this, sizeof(cKeyEx));
}
DWORD cKeyEx::get()
{
return getInfo();
}
DWORD cKeyEx::getInfo()
{
memset((void*)&sysinfo, 0, sizeof(sysinfo));
GSI Info = nullptr;
Info = (GSI)GetProcAddress(GetModuleHandle(__TEXT("kernel32.dll")), "GetSystemInfo");
Info(&sysinfo);
DWORD dwNumber = sysinfo.dwNumberOfProcessors;
DWORD dwType = sysinfo.dwProcessorType;
WORD dwRev = sysinfo.wProcessorRevision;
return (dwNumber*dwType * 2 + 1134 + (dwRev));
}
cKeyEx::~cKeyEx()
{
}
cLicense.h
Код:
/*
http://cheaton.ru
*/
#pragma once
#include "cKeyEx.h"
class cLicenseEx
{
public:
cLicenseEx();
virtual ~cLicenseEx();
private:
char * ToHex(const char *);
char * EstablishKey(const char*, DWORD);
public:
virtual void Generate();
virtual void setName(const char* UserName){ this->UserName = UserName; }
virtual const char* getUserKey() { return this->UserKey; }
virtual const char* getUserName(){ return this->UserName; }
private:
cSerialEx Serial;
const char* UserName;
const char* UserKey;
DWORD SystemKey;
};
class cGenerator : public cLicenseEx
{
public:
cGenerator(){}
};
Код:
#include "cLicense.h"
cLicenseEx::cLicenseEx()
{
this->UserKey = NULL;
this->UserName = "default";
this->SystemKey = Serial.dwKey;
}
void cLicenseEx::Generate()
{
this->UserKey = NULL;
char * Key = EstablishKey(this->UserName, this->SystemKey);
this->UserKey = ToHex(Key);
}
cLicenseEx::~cLicenseEx()
{
}
char * cLicenseEx::ToHex(const char * input)
{
int len = strlen(input);
char * strOut = (char *)malloc(sizeof (char)* ((len * 2) + 1));
for (size_t i = 0; i < len; i++)
{
sprintf((strOut + (i * 2)), "%02X", (unsigned char)(*(input + i)));
}
strOut[(len * 2)] = '\0';
return strOut;
}
char * cLicenseEx::EstablishKey(const char*name, DWORD dwId)
{
char * buf = (char *)malloc(200);
ZeroMemory(buf, 200);
int xor_key = dwId ^ 4578;
for (int i = 0; i < strlen(name); i++)
xor_key = xor_key + (100 + (name[i] + 2 * i));
sprintf(buf, "%08d", xor_key);
return buf;
}
Использование:
Код:
#include "cLicense.h"
#define COUNT_LICENSE 3//количество подписок
Код:
class cInfKey
{
public:
const char* name;
const char* key;
};
cInfKey InfKeyEx[COUNT_LICENSE] =
{
"Crysler", "3030303031363035",
"Crysler", "2222122132132131",
"fffff", "B6F8416534234205"
};
Код:
class cOutInfo
{
public:
char name[255];
char key[255];
cOutInfo()
{
ZeroMemory(&name, 255);
ZeroMemory(&key, 255);
}
};
Код:
bool Test(cOutInfo *OutInfo)
{
cGenerator zGenerator;
bool state = false;
for (size_t i = 0; i < COUNT_LICENSE; i++)
{
zGenerator.setName(InfKeyEx[i].name);
zGenerator.Generate();
if (zGenerator.getUserKey() != NULL)
{
if (memcmp(InfKeyEx[i].key, zGenerator.getUserKey(), strlen(InfKeyEx[i].key)) == NULL)
{
state = true;
memcpy((void*)(OutInfo->name), (void*)(InfKeyEx[i].name), strlen(InfKeyEx[i].name));
memcpy((void*)(OutInfo->key), (void*)(InfKeyEx[i].key), strlen(InfKeyEx[i].key));
break;
}
}
}
return state;
}
Код:
int main()
{
cOutInfo pOutInfo;
if (Test(&pOutInfo))
printf_s("Name: %s\nKey: %s\n", pOutInfo.name, pOutInfo.key);
else
{
printf_s("Fuck OFF !!!!\n");
cGenerator Generator;
Generator.setName("Crysler");
Generator.Generate();
printf_s(Generator.getUserKey());
}
while (true)
{
if (GetAsyncKeyState(VK_DELETE))
break;
Sleep(200);
}
return 0;
}