📄 encryptsoftware.cpp
字号:
#include "stdafx.h"
#include <afxwin.h>
#include "Nb30.h"
#include "EncryptSoftware.h"
#include "GetKeyFileinfo.h"
#include "BigInt.h"
#include "AntiTrack.h"
#include "cpuid.h"
static DWORD g_codebuf1[13];//由机器码计算出来的中间注册码
static DWORD g_codebuf2[13];//由用户输入的注册码计算出来的中间注册码
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff [30];
}
ASTAT, * PASTAT;
//extern ASTAT g_Adapter;
ASTAT g_Adapter;
BOOL IsWinNT()
{
OSVERSIONINFO OSVersionInfo;
OSVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&OSVersionInfo);
return OSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT;
}
///////////////////////////////////////////////
//获取本地机器特征码
//KeyNO由以下信息生成:
// 得到网卡编号(MAC地址)
// 获取硬盘的出厂信息
// CPU序列号
// 主板序列号
//应用程序ID号
//wincpuid
CString GetMACAddresswithIPhelp(BOOL bUse);
CString DoConvertKey(CString szKey)
{
CString szNewKey;
szNewKey = szKey;
szNewKey.MakeUpper();
int nLength = szNewKey.GetLength();
for(int i=0;i<nLength;i++)
{
char ch = szNewKey.GetAt(i);
if(ch == '0' || ch == 'o' || ch == 'O')//数字、字母、字母
{
szNewKey.SetAt(i,'A');
}
else if(ch == '1' || ch == 'i' || ch == 'I')//数字、字母、字母
{
szNewKey.SetAt(i,'L');
}
}
return szNewKey;
}
CString DoConvertRegCode(CString szKey)
{
CString szNewKey;
szKey.MakeUpper();
int nLength = szKey.GetLength();
for(int i=0;i<nLength;i++)
{
CString szCh;
char ch = szKey.GetAt(i);
if(ch < '0' || ch > '9')
{
int nCh = ch;
szCh.Format("%02d",nCh);
}
else
{
szCh = ch;
}
szNewKey += szCh;
}
return szNewKey;
}
CString GetKey()
{
CString szKey="";
char szKeyCPU[8+1];
char szKeyHD[8+1];
char Author[] = { "k1yt8d" };
char *pAuthor = Author;
// BYTE keyValue[6];
////////////////////////////////////////////
//should get CPU Mainboard infos ..
BOOL bUseCpuId = FALSE;
BOOL bUseCpuFeature = FALSE;
BOOL bUseCpuVender = FALSE;
bUseCpuId = TRUE;
bUseCpuFeature = TRUE;
bUseCpuVender = TRUE;
WORD cpuidext=wincpuidext(bUseCpuId);
DWORD cpufeatures=wincpufeatures(bUseCpuFeature);
char* pVendorID=wincpuVendorID(bUseCpuVender);//12 BYTEs
#ifdef LOG_ERR
char buf[256];
sprintf(buf,"cpuidext=%.4x,cpufeatures=%.8x,wincpuVendorID=%s",cpuidext,cpufeatures,pVendorID);
LogFile("getkey.txt",buf);
#endif
WORD wVendorKey=0;
for(int ii=0;ii<12;ii++){
wVendorKey+=pVendorID[ii]*(ii+7);
}
wVendorKey^=cpuidext;
cpufeatures+=wVendorKey;
ZeroMemory(szKeyCPU, sizeof(szKeyCPU));
sprintf(szKeyCPU,"%.8x", cpufeatures);
/////////////////////////////////////////////
//get Hard Disk ID
BOOL bUseHard = FALSE;
bUseHard = TRUE;
DWORD dwKeyHD=GetHardDiskKey(bUseHard);
sprintf(szKeyHD,"%.8x", dwKeyHD);
AntiStaticAnalyse_1();
///* with IPHELP
BOOL bUseMac = FALSE;
bUseMac = TRUE;
//mac
if(bUseMac)
{
szKey = GetMACAddresswithIPhelp(bUseMac);
if (szKey.IsEmpty())//12 bytes
return szKey;
}
else
{
szKey.Empty();
}
PuzzleCode2();
if(bUseCpuId || bUseCpuFeature || bUseCpuVender)
{
szKey+=szKeyCPU; //8 bytes
}
PuzzleCode1();
if(bUseHard)
{
szKey+=szKeyHD; //8 bytes
}
AntiStaticAnalyse_2();
//APPLOCATION ID //2 bytes
CString strAPPLICATIONID = APPLICATION_ID;
BYTE nVal = 0;
int nAPPLICATIONIDLen = strAPPLICATIONID.GetLength();
for (int i=0 ; i<nAPPLICATIONIDLen ; i++)
{
nVal ^= strAPPLICATIONID.GetAt(i) + 27;
}
strAPPLICATIONID.Format("%02x",nVal);
szKey+=strAPPLICATIONID;
szKey.MakeUpper();
return szKey;
}
#pragma comment(lib,"netapi32.lib")
//just for link the API Netbios()
BOOL getmac_one()
{
NCB Ncb;
UCHAR uRetCode;
LANA_ENUM lenum;
int i;
#ifdef LOG_ERR
char chMacAddr[100];
#endif
i=sizeof(Ncb);
memset( &Ncb, 0, sizeof(Ncb) );
Ncb.ncb_command = NCBENUM;
Ncb.ncb_buffer = (UCHAR *)&lenum;
Ncb.ncb_length = sizeof(lenum);
uRetCode = Netbios( &Ncb );
//printf( "The NCBENUM return code is: 0x%x \n", uRetCode );
//NRC_BADNCB
if(lenum.length == 0)
{
//strcpy(chMacAddr,"没有安装网卡,或者没有上网");
return false;
}
for(i=0; i < lenum.length ;i++)
{
memset( &Ncb, 0, sizeof(Ncb) );
Ncb.ncb_command = NCBRESET;
Ncb.ncb_lana_num = lenum.lana[i];
//Ncb.ncb_lana_num=0;
uRetCode = Netbios( &Ncb );
//printf( "The NCBRESET on LANA %d return code is: 0x%x \n",lenum.lana[i], uRetCode );
memset( &Ncb, 0, sizeof (Ncb) );
Ncb.ncb_command = NCBASTAT;
Ncb.ncb_lana_num = lenum.lana[i];
//Ncb.ncb_lana_num = 0;
strcpy( (char*)Ncb.ncb_callname, "* " );
Ncb.ncb_buffer = (unsigned char *) &g_Adapter;
Ncb.ncb_length = sizeof(g_Adapter);
uRetCode = Netbios( &Ncb );
#ifdef LOG_ERR
printf( "The NCBASTAT on LANA %d return code is: 0x%x \n",lenum.lana[i], uRetCode );
#endif
if( uRetCode == 0 )
{
#ifdef LOG_ERR
sprintf(chMacAddr,
"在LANA号为%d的网卡MAC地址是:%02X-%02X-%02X-%02X-%02X-%02X",
lenum.lana[i],
g_Adapter.adapt.adapter_address[0],
g_Adapter.adapt.adapter_address[1],
g_Adapter.adapt.adapter_address[2],
g_Adapter.adapt.adapter_address[3],
g_Adapter.adapt.adapter_address[4],
g_Adapter.adapt.adapter_address[5]
);
#endif
#ifdef _DEBUG
CString szMac;
szMac.Format("The Ethernet Number on LANA %d is: %02x%02x%02x%02x%02x%02x\n",
lenum.lana[i],
g_Adapter.adapt.adapter_address[0],
g_Adapter.adapt.adapter_address[1],
g_Adapter.adapt.adapter_address[2],
g_Adapter.adapt.adapter_address[3],
g_Adapter.adapt.adapter_address[4],
g_Adapter.adapt.adapter_address[5] );
TRACE( szMac );
#endif
return true;
}
}
return false;
}
BOOL GetMacAddress(char *szMac)
{
NCB ncb;
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff [30];
} ASTAT, * PASTAT;
ASTAT Adapter;
// ADAPTER_STATUS Adapter;
LANA_ENUM lana_enum;
UCHAR uRetCode;
memset( &ncb, 0, sizeof(ncb) );
memset( &lana_enum, 0, sizeof(lana_enum));
ncb.ncb_command = NCBENUM;
ncb.ncb_buffer = (unsigned char *) &lana_enum;
ncb.ncb_length = sizeof(LANA_ENUM);
uRetCode = Netbios( &ncb );
if( uRetCode != NRC_GOODRET )
return FALSE;//uRetCode ;
for( int lana=0; lana<lana_enum.length; lana++ )
{
ncb.ncb_command = NCBRESET;
ncb.ncb_lana_num = lana_enum.lana[lana];
uRetCode = Netbios( &ncb );
if( uRetCode == NRC_GOODRET )
break ;
}
if( uRetCode != NRC_GOODRET )
return FALSE;//uRetCode;
memset( &ncb, 0, sizeof(ncb) );
ncb.ncb_command = NCBASTAT;
ncb.ncb_lana_num = lana_enum.lana[0];
strcpy( (char* )ncb.ncb_callname, "*" );
ncb.ncb_buffer = (unsigned char *) &Adapter;
ncb.ncb_length = sizeof(Adapter);
uRetCode = Netbios( &ncb );
if( uRetCode != NRC_GOODRET )
return FALSE;//uRetCode ;
#ifdef LOG_ERR
sprintf(szMac,"%02X-%02X-%02X-%02X-%02X-%02X",
Adapter.adapt.adapter_address[0],
Adapter.adapt.adapter_address[1],
Adapter.adapt.adapter_address[2],
Adapter.adapt.adapter_address[3],
Adapter.adapt.adapter_address[4],
Adapter.adapt.adapter_address[5] );
#endif
return TRUE;//0;
}
CString EncodeString(CString str)
{
int iLength = str.GetLength();
PuzzleCode2();
for(int i=0;i<iLength;i++)
{
if(str[i]=='z')
str.SetAt(i,'b');
else if (str[i]=='Z')
str.SetAt(i,'B');
else if (str[i]=='Y')
str.SetAt(i,'A');
else if (str[i]=='y')
str.SetAt(i,'a');
else if (str[i]=='8')
str.SetAt(i,'0');
else if (str[i]=='9')
str.SetAt(i,'1');
else
str.SetAt(i,str[i]+2);
}
PuzzleCode1();
return str;
}
CString DecodeString(CString str)
{
int iLength = str.GetLength();
PuzzleCode1();
for(int i=0;i<iLength;i++)
{
if(str[i]=='b')
str.SetAt(i,'z');
else if (str[i]=='B')
str.SetAt(i,'Z');
else if (str[i]=='A')
str.SetAt(i,'Y');
else if (str[i]=='a')
str.SetAt(i,'y');
else if (str[i]=='0')
str.SetAt(i,'8');
else if (str[i]=='1')
str.SetAt(i,'9');
else
str.SetAt(i,str[i]-2);
}
PuzzleCode1();
return str;
}
#define EncodeUserInfoIntoComputerCode UserInfoInput
CString UserInfoInput(CString strUser, CString strOrganization, CString strKeyNo)
{
CString szSerialNo;
strUser.MakeUpper();
strOrganization.MakeUpper();
//strKeyNo=GetKey();
ASSERT(strKeyNo.GetLength()==30);
BYTE nVal1 = 0;
BYTE nVal2 = 0;
int i;
for (i=0 ; i<strUser.GetLength() ; i++)
{
if (i%4==0)
{
nVal1 ^= strUser.GetAt(i) +i *10000- 26;
}
if (i%5==0)
{
nVal1 ^= strUser.GetAt(i) +i *15000- 25;
}
nVal1 ^= strUser.GetAt(i) +i *20000- 27;
}
for (i=0 ; i<strOrganization.GetLength() ; i++)
{
if (i%4==0)
{
nVal2 ^= strOrganization.GetAt(i) * 7+i*10000+1;
}
if (i%5==0)
{
nVal2 ^= strOrganization.GetAt(i) * 7+i*15000+2;
}
nVal2 ^= strOrganization.GetAt(i) * 7+i*20000;
}
AntiStaticAnalyse_1();
BYTE DataValue[15];
ZeroMemory(&DataValue, sizeof(DataValue));
for (i=0 ; i<6 ; i++)
{
DataValue[i] = (strKeyNo.GetAt(i*2) - nVal1) * 37 + strKeyNo.GetAt(i*2+1) - nVal2;
DataValue[6] ^= DataValue[i];
}
for (i=7;i<13;i++)
{
DataValue[i] = (strKeyNo.GetAt(i*2-1) - nVal1) * 37 + strKeyNo.GetAt(i*2) - nVal2;
DataValue[14] ^= DataValue[i];
}
DataValue[7] = ~DataValue[3];
DataValue[3] = ~nVal1;
DataValue[8] = ~nVal2+strKeyNo[29];
DataValue[13] = ~nVal1+strKeyNo[25]^+strKeyNo[27];
DataValue[15] = ~nVal2+strKeyNo[26]^+strKeyNo[28];
AntiStaticAnalyse_2();
szSerialNo.Format("%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
DataValue[0],
DataValue[1],
DataValue[2],
DataValue[3],
DataValue[4],
DataValue[5],
DataValue[6],
DataValue[7],
DataValue[8],
DataValue[9],
DataValue[10],
DataValue[11],
DataValue[12],
DataValue[13],
DataValue[14],
DataValue[15]);
szSerialNo.MakeUpper(); //机器码、用户信息、组织信息生成的Message
//
return szSerialNo;
}
long StringtoLong(CString str)
{
//------------------把要加密的szSerialNo转换成10进制(没有进行标准的转换),然后写成大数进行RSA加密-----------//
long ll=0;
for(int index=0;index<str.GetLength();index++)
{
ll=ll*10;
if((str[index]<='9') && (str[index]>='0')) ll+=str[index]-'0';
else if((str[index]<='F') && (str[index]>='A')) ll+=str[index]-'A'+10;
}
return ll;
}
#ifdef REG_MECHANISM
CString MakeUserRegCode(CString strUser, CString strOrganization, CString strKeyNo)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -