📄 tcsylist.cpp
字号:
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 + -