[C++] Вариация проверки лицензии

Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
991
Реакции[?]
1,209
Поинты[?]
3K
Навеяно этой темой:
Пожалуйста, авторизуйтесь для просмотра ссылки.

Копия моей темы с другого форума.




Часть старой привязки, оставил основные алгоритмы для общей работоспособности, убрав основные методы)))
По сути так себе защита, но для новичков думаю будет над чем поразмыслить.
Предоставлю голый код без "глубокого объяснения" ....
Конечный ключ "генерируется на основе" указаного имени.
Класс с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;
};
cKeyEx.cpp
Код:
#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
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(){}
};
cLicense.cpp
Код:
#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;
}
Опираясь на имя заданное в структуре cInfKey, генерируем ключ и сверяем с внесенным в "базу". Если имеется совпадение Имя-Ключ возвращаем "истину", если совпадений нет - "ложь".






Код:
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;
}
 
Забаненный
Статус
Оффлайн
Регистрация
26 Авг 2017
Сообщения
66
Реакции[?]
35
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Навеяно этой темой:
Пожалуйста, авторизуйтесь для просмотра ссылки.

Копия моей темы с другого форума.




Часть старой привязки, оставил основные алгоритмы для общей работоспособности, убрав основные методы)))
По сути так себе защита, но для новичков думаю будет над чем поразмыслить.
Предоставлю голый код без "глубокого объяснения" ....
Конечный ключ "генерируется на основе" указаного имени.
Класс с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;
};
cKeyEx.cpp
Код:
#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
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(){}
};
cLicense.cpp
Код:
#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;
}
Опираясь на имя заданное в структуре cInfKey, генерируем ключ и сверяем с внесенным в "базу". Если имеется совпадение Имя-Ключ возвращаем "истину", если совпадений нет - "ложь".






Код:
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;
}
типо для лоадера как я понял , а так лайк
 
В игре Source SDK
Забаненный
Статус
Оффлайн
Регистрация
10 Янв 2017
Сообщения
2,148
Реакции[?]
806
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Допили WinInet сюда ещё
 
Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
991
Реакции[?]
1,209
Поинты[?]
3K
Допили WinInet сюда ещё
зачем? тогда совсем просто будет))) нужно же заставлять людей хоть немного думать...

Да и WinINet не совсем удачное решение для софта с лицензией. нужны сокеты с обвязкой около OpennSSL
 
В игре Source SDK
Забаненный
Статус
Оффлайн
Регистрация
10 Янв 2017
Сообщения
2,148
Реакции[?]
806
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
зачем? тогда совсем просто будет))) нужно же заставлять людей хоть немного думать...

Да и WinINet не совсем удачное решение для софта с лицензией. нужны сокеты с обвязкой около OpennSSL
Я помню делал на сокетах и сервер на нодеджыс
 
Сверху Снизу