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

📄 tcsylist.cpp

📁 这个是集合几种关于硬盘的序列号的获取方式的DLL
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		PostMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION, lParam);
		break;

	//------------------------------------------------------------//

	default: nSuccess = 0L; break;                   // 其它的不处理

	//------------------------------------------------------------//
	}
	return nSuccess;                                 // 返回系统标识
}

/////////////////////////////////////////////////////////////////////////////

// 将目标区域中的小写字母转换为大写字母
VOID CTcsyRegistList::ByteToUpper(VOID *pSrc, INT nLen)
{
	if(!pSrc || nLen < 1) return;
	BYTE *bySrc = (BYTE *)pSrc;
	for(int i=0; i<nLen; i++)
	{
		if(bySrc[i] >= 'a' && bySrc[i] <= 'z')
			bySrc[i] -= 0x20;
	}
}

// 如果源串中有一个'\0',则其后的全部填充'\0'
VOID CTcsyRegistList::ByteNullSet(VOID *pSrc, INT nLen)
{
	if(!pSrc || nLen < 1) return;
	BOOL bEmpty = FALSE;
	BYTE *bySrc = (BYTE *)pSrc;
	for(int i=0; i<nLen; i++)
	{
		if(!bEmpty && bySrc[i] == '\0') bEmpty = TRUE;
		else if(bEmpty) bySrc[i] = '\0';
	}
}

// 数据拷贝:在源字串中若有'\0', 则其之后全部填充'\0'
VOID CTcsyRegistList::ByteNullCpy(VOID *pDes, const VOID *pSrc, INT nLen)
{
	if(!pSrc || !pDes || nLen < 1) return;
	BOOL bEmpty = FALSE;
	BYTE *byDes = (BYTE *)pDes;
	const BYTE *bySrc = (BYTE *)pSrc;
	for(int i=0; i<nLen; i++)
	{
		if(bEmpty == FALSE)
		{
			byDes[i] = bySrc[i];
			if(bySrc[i] == '\0') bEmpty = TRUE;
		}
		else if(bEmpty) byDes[i] = '\0';
	}
}

// 复制字符串(只复制字母、数字的字符,其它的不要,全大写)
INT CTcsyRegistList::ConvertStringFormat(char chDes[], const char chSrc[]) 
{
	if(chSrc == NULL || chDes == NULL) return 0L;
	int i = -1, j = 0; char chTemp;                  // 遍寻位置指示变量
	while((chTemp = chSrc[++i]) != '\0')
	{
		if(chTemp >= '0' && chTemp <= '9')           // 题:(0-9)数字字符
		{
			if(chTemp < '9') chTemp++;
			chDes[j++] = chTemp;                     // 加1掩盖原有信息
		}
		else if(chTemp >= 'a' && chTemp <= 'z')      // 题:(a-z)小写字母
		{
			if(chTemp > 'a') chTemp--;
			chDes[j++] = chTemp - 0x20;              // 减1大写掩盖信息
		}
		else if(chTemp >= 'A' && chTemp <= 'Z')      // 题:(A-Z)大写字母
		{
			if(chTemp < 'Z') chTemp++;
			chDes[j++] = chTemp;                     // 加1掩盖原有信息
		}
	}
	chDes[j] = '\0'; return j;                       // 结束目标字符串
}

// 由硬盘序列号和给定日期的推导出返回码及其长度,用于软件注册
INT CTcsyRegistList::GenerateReturnCode(
							const CHAR chHdiskSn[],  // 硬盘序列号
							const BYTE byDate[],     // 给定的日期
							CHAR  chReturn[])        // 输出返回码
{
	if(!chHdiskSn || !byDate || !chReturn) return 0L;// 检入口参数
	char chBase[100] = "", chCRC[10] = "";           // 临时和校验
	DWORD dwChk[2] = {GenerateCRC32(byDate, 8), 0};  // 生成校验码
	sprintf(chCRC, "%08X", dwChk[0]);                // 校验字符串
	int nTotLen = ConvertStringFormat(chBase, chHdiskSn);
	if(nTotLen < 4)                                  // 是特殊情况
	{
		sprintf(chReturn, "%s%s", chCRC, chBase);    // 直接返回串
		return (nTotLen + 8);                        // 这是其长度
	}
	char *chInfo = &chBase[nTotLen % 4];             // 有效开始处
	int nPerLen = nTotLen / 4, k = 0, i = 0;         // 分成四等分

	chReturn[k++] = chCRC[0];                        // 第00数据段
	memcpy(&chReturn[k], &chInfo[1 * nPerLen], nPerLen); k += nPerLen;
	chReturn[k++] = chCRC[1];
	chReturn[k++] = chCRC[2];                        // 第01数据段
	memcpy(&chReturn[k], &chInfo[3 * nPerLen], nPerLen); k += nPerLen;
	chReturn[k++] = chCRC[3];
	chReturn[k++] = chCRC[4];                        // 第02数据段
	memcpy(&chReturn[k], &chInfo[0 * nPerLen], nPerLen); k += nPerLen;
	chReturn[k++] = chCRC[5];
	chReturn[k++] = chCRC[6];                        // 第03数据段
	memcpy(&chReturn[k], &chInfo[2 * nPerLen], nPerLen); k += nPerLen;
	chReturn[k++] = chCRC[7];

	dwChk[1] = (dwChk[0] % 10);                      // 数字起始值
	dwChk[0] = (dwChk[0] % 26);                      // 字母起始值
	for(i=0; i<k; i++)                               // 掩盖原字符
	{
		if(chReturn[i] >= 'A' && chReturn[i] <= 'Z') // 字母和数字
		{
			chReturn[i] = 'A' + (CHAR)((dwChk[0] + chReturn[i] - 'A') % 26);
		}
		else if(chReturn[i] >= '0' && chReturn[i] <= '9')
		{
			chReturn[i] = '0' + (CHAR)((dwChk[1] + chReturn[i] - '0') % 10);
		}
		if(chReturn[i] == 'O') chReturn[i] = (CHAR)(dwChk[0] % 10) + 'P';
	}
	chReturn[k] = '\0'; return k;                    // 返回得长度
}

// 由用户名、产品号和返回码,计算出注册码,用于软件注册
INT CTcsyRegistList::GenerateRegistCode(
						const CHAR chName[],         // 指定用户名
						const CHAR chProduct[],      // 产品序列号
						const CHAR chReturn[],       // 输入返回码
						CHAR  chRegist[])            // 返回注册码
{
	if(!chName || !chProduct || !chReturn || !chRegist) return 0L;
	int nLen[4] = {16, 16, lstrlen(chReturn)};       // 预置各长度
	nLen[3] = nLen[2] - nLen[2] / 2; nLen[2] /= 2;   // 分开返回码
	const char *chRetCode[2] = {&chReturn[0], &chReturn[nLen[2]]};

	BYTE byBuff[100], byKeys[sizeof(BETA_KEYS)];     // 临时缓冲区
	CryptXOR(byKeys, BETA_KEYS, sizeof(BETA_KEYS));  // 取原加密钥
	char chTemp[33] = "";                            // 临时注册区
	int k = 0, i = 0, j = 0; DWORD dwChk = 0;        // 当前位标记

	memcpy(byBuff, chName, nLen[0]);                 // 指定用户名
	ZnnDesBin(0, byBuff, nLen[0], byKeys);
	sprintf(&chTemp[k], "%08X", GenerateCRC32(byBuff,
		nLen[0])); k += 8;

	memcpy(byBuff, chProduct, nLen[1]);              // 产品序列号
	ZnnDesBin(0, byBuff, nLen[1], byKeys);
	sprintf(&chTemp[k], "%08X", GenerateCRC32(byBuff,
		nLen[1])); k += 8;

	memcpy(byBuff, chRetCode[0], nLen[2]);           // 返回码上段
	SckDesBin(0, byBuff, nLen[2], byKeys);
	sprintf(&chTemp[k], "%08X", GenerateCRC32(byBuff,
		nLen[2])); k += 8;

	memcpy(byBuff, chRetCode[1], nLen[3]);           // 返回码下段
	SckDesBin(0, byBuff, nLen[3], byKeys);
	sprintf(&chTemp[k], "%08X", GenerateCRC32(byBuff,
		nLen[3])); k += 8;

	for(i=0; i<k; i++)                               // 散列变化值
	{
		chRegist[i] = chTemp[j];
		j += 8; if(j >= k) j -= (k - 1);             // 按特征分发
	}

	for(i=2; i<k; i+=8) dwChk += *((DWORD *)(&chRegist[i]));
	dwChk = (dwChk % 16) + 'A';                      // 求出起始值
	for(i=0; i<k; i++)                               // 掩盖16进制
	{
		if(chRegist[i] < 'A' || chRegist[i] > 'F') continue;
		chRegist[i] = (CHAR)((chRegist[i] - 'A') * 2 + dwChk);
		if(chRegist[i] == 'O') chRegist[i] = (CHAR)(dwChk % 10) + 'P';
	}
	chRegist[k] = '\0'; return k;                    // 返回得长度
}

/////////////////////////////////////////////////////////////////////////////

// 在内存链表中查找指定的产品号(加密的),若找到则返回其扇区记录的指针
BOOL CTcsyRegistList::FindUserRegist(const BYTE byProduct[],
									 STcsyRegistItem **ppItem)
{
	STcsyRegistNode *pNode = PtrStart;               // 从首节点开始
	BOOL bSuccess = FALSE;                           // 是否已查找到
	for(LONG i=0; i<m_nNodeCount; i++)               // 遍历查询单元
	{
		if(!memcmp(pNode->ItemData.RegData.byProductNum, byProduct, sizeof \
			(pNode->ItemData.RegData.byProductNum))) // 搜索同号产品
		{
			if(ppItem) *ppItem = &pNode->ItemData;   // 返回内存单元
			bSuccess = TRUE; break;                  // 返回记录明文
		}
		pNode = pNode->PtrNext;                      // 取下一点指针
	}
	return bSuccess;                                 // 返回查找结果
}

// 注册当前用户的软件产品号(唯一索引):采用已有功能函数完成搜索匹配
BOOL CTcsyRegistList::RegistUserProduct(SckRegistOrder *pOrder,
								BOOL bRegDIY)        // 自否自定注册
{
	STcsyRegistItem tempItem; AddrRegist.Set(0L, 0L);// 复位用户数据
	STcsyRegistData &sData = tempItem.RegData;       // 引用注册记录
	m_bUserRegisted = FALSE;                         // 标记没有登陆
	if(!pOrder || !pOrder->byProductNum ||           // 检测入口参数
		pOrder->dwLimitDays > REG_LIMIT_DAYS) return FALSE;
	pOrder->bRegistResult = FALSE;                   // 清返回标志位
	if(bRegDIY) pOrder->dwLimitDays = 0;             // 自定的无时限
	if(TcsyHead.nItemCount < 0) return FALSE;        // 尚未装载链表

	BYTE byProductNum[sizeof(sData.byProductNum)];   // 处理产品序号
	memcpy(byProductNum, pOrder->byProductNum, sizeof(byProductNum));
	CryptXOR(byProductNum, sizeof(byProductNum));    // 解出原始明文
	ByteNullSet(byProductNum, sizeof(byProductNum)); // 尾部'\0'补齐
	ByteToUpper(byProductNum, sizeof(byProductNum)); // 将小写变大写
	CryptXOR(byProductNum, sizeof(byProductNum));    // 传入产品密文

	LONG nRegistStyle = NONEED_REGIST;               // 修改还是增加
	CHAR chHDiskSN[MAX_PATH] = "";                   // 硬盘序列号码
	if(bRegDIY) lstrcpy(chHDiskSN, pOrder->chHDiskSN); // 自定义序列
	else lstrcpy(chHDiskSN, (CHAR *)GetHDiskSN());   // 取硬盘序列号
	STcsyRegistItem *pItem = NULL;                   // 对应单元指针

	//--- 从记录检查注册的情况 -----------------------------------//

	if(FindUserRegist(byProductNum, &pItem) && pItem)// 产品号是密文
	{
		tempItem = *pItem;                           // 复制相关单元
		CryptXOR((BYTE *)(&sData), sizeof(STcsyRegistData));
		CHAR chReturn[100] = "";                     // 临时的返回码
		CHAR chRegist[sizeof(sData.byRegistCode) + 1];
		GenerateReturnCode(chHDiskSN, sData.byFirstSetup, chReturn);
		GenerateRegistCode((CHAR *)sData.byUserName, (CHAR *)sData.byProductNum,
			chReturn, chRegist);                     // 新生成注册码

		if(memcmp(chRegist, sData.byRegistCode, sizeof(sData.byRegistCode)))
		{
			memset(sData.byRegistCode, 0x00,         // 清除注册信息
				sizeof(sData.byRegistCode));         // 注册后时同步
			nRegistStyle = UPDATE_REGIST;            // 修改已有记录
		}

		if(nRegistStyle == NONEED_REGIST)            // 再看一看时限
		{
			if(bRegDIY) SaveRegistFile(sData);       // 保存注册记录
			LONG nDiff = GetDiffDate(sData.byRecentRun, sData.byFirstSetup);
			if(sData.dwLimitDays > 0 && (nDiff < 0 ||// 是否已经超时
				nDiff > (LONG)sData.dwLimitDays))
			{
				memset(sData.byRegistCode, 0x00,     // 清除注册信息
					sizeof(sData.byRegistCode));     // 注册后时同步
				nRegistStyle = UPDATE_REGIST;        // 修改已有记录
				char chInfo[sizeof(LIMIT_TIME_PROMPT)];
				CryptXOR((BYTE *)chInfo, LIMIT_TIME_PROMPT,
					sizeof(chInfo));                 // 提示已经过期
				MsgBox(GetForegroundWindow(), MB_OK | \
					MB_ICONWARNING, chInfo);         // 显示用户对话
			}
		}

		BOOL bDiffLimit = (BOOL)(sData.dwLimitDays != pOrder->dwLimitDays);
		if(bDiffLimit == TRUE) sData.dwLimitDays = pOrder->dwLimitDays;

		if(nRegistStyle == UPDATE_REGIST || bDiffLimit == TRUE)
		{
			STcsyRegistItem buffItem = tempItem;     // 另存前要加密
			STcsyRegistData &tData = buffItem.RegData;
			GetCurrDate(tData.byRecentRun);          // 获取当前日期
			CryptXOR((BYTE *)(&tData), sizeof(STcsyRegistData));
			if(SaveDiskItem(buffItem) == FALSE) return FALSE;
			if(m_nOperAlow != ALL_ACCESS) SaveZnnFileHead(TRUE);
			if(pItem) *pItem = buffItem;             // 写到内存里面
		}
	}
	else nRegistStyle = ADDNEW_REGIST;               // 须新追加注册

	//--- 由不同的情况或返回或初始变量值 -------------------------//

	if(nRegistStyle == NONEED_REGIST)                // 审查合格通过
	{
		CryptXOR((BYTE *)(&sData), sizeof(STcsyRegistData));
		AddrRegist = tempItem.AddrSelf;              // 记录登陆产品
		m_bUserRegisted = TRUE;                      // 标记已经登陆
		pOrder->bRegistResult = TRUE; return TRUE;   // 标记登陆成功
	}
	else if(nRegistStyle == ADDNEW_REGIST)           // 新加则预填充
	{
		memcpy(sData.byProductNum, byProductNum, sizeof(byProductNum

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -