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

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

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




Часть старой привязки, оставил основные алгоритмы для общей работоспособности, убрав основные методы)))
По сути так себе защита, но для новичков думаю будет над чем поразмыслить.
Предоставлю голый код без "глубокого объяснения" ....
Конечный ключ "генерируется на основе" указаного имени.
Класс сKeyEx
cKeyEx.h

Код:
Expand Collapse Copy
#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
Код:
Expand Collapse Copy
#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
Код:
Expand Collapse Copy
/*
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
Код:
Expand Collapse Copy
#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;
}


Использование:

Код:
Expand Collapse Copy
#include "cLicense.h"
#define COUNT_LICENSE 3//количество подписок

Структура хранения данных юзера
Код:
Expand Collapse Copy
class cInfKey
{
public:
   const char* name;
   const char* key;
};
cInfKey InfKeyEx[COUNT_LICENSE] =
{
   "Crysler", "3030303031363035",
   "Crysler", "2222122132132131",
   "fffff", "B6F8416534234205"
};

Структура хранения итоговых данных, для активных юзеров
Код:
Expand Collapse Copy
class cOutInfo
{
public:
   char name[255];
   char key[255];
   cOutInfo()
   {
     ZeroMemory(&name, 255);
     ZeroMemory(&key, 255);
   }
};

Проверка:
Код:
Expand Collapse Copy
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, генерируем ключ и сверяем с внесенным в "базу". Если имеется совпадение Имя-Ключ возвращаем "истину", если совпадений нет - "ложь".






Код:
Expand Collapse Copy
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;
}
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Навеяно этой темой:
Пожалуйста, авторизуйтесь для просмотра ссылки.

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




Часть старой привязки, оставил основные алгоритмы для общей работоспособности, убрав основные методы)))
По сути так себе защита, но для новичков думаю будет над чем поразмыслить.
Предоставлю голый код без "глубокого объяснения" ....
Конечный ключ "генерируется на основе" указаного имени.
Класс сKeyEx
cKeyEx.h

Код:
Expand Collapse Copy
#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
Код:
Expand Collapse Copy
#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
Код:
Expand Collapse Copy
/*
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
Код:
Expand Collapse Copy
#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;
}


Использование:

Код:
Expand Collapse Copy
#include "cLicense.h"
#define COUNT_LICENSE 3//количество подписок

Структура хранения данных юзера
Код:
Expand Collapse Copy
class cInfKey
{
public:
   const char* name;
   const char* key;
};
cInfKey InfKeyEx[COUNT_LICENSE] =
{
   "Crysler", "3030303031363035",
   "Crysler", "2222122132132131",
   "fffff", "B6F8416534234205"
};

Структура хранения итоговых данных, для активных юзеров
Код:
Expand Collapse Copy
class cOutInfo
{
public:
   char name[255];
   char key[255];
   cOutInfo()
   {
     ZeroMemory(&name, 255);
     ZeroMemory(&key, 255);
   }
};

Проверка:
Код:
Expand Collapse Copy
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, генерируем ключ и сверяем с внесенным в "базу". Если имеется совпадение Имя-Ключ возвращаем "истину", если совпадений нет - "ложь".






Код:
Expand Collapse Copy
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;
}
типо для лоадера как я понял , а так лайк
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Допили WinInet сюда ещё
 
Допили WinInet сюда ещё
зачем? тогда совсем просто будет))) нужно же заставлять людей хоть немного думать...

Да и WinINet не совсем удачное решение для софта с лицензией. нужны сокеты с обвязкой около OpennSSL
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
зачем? тогда совсем просто будет))) нужно же заставлять людей хоть немного думать...

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