⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 encryptsoftware.cpp

📁 通过机器硬件设备加密软件的算法,支持反败为胜跟踪等.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -