1、程序演示

image-1658110357980

2、编译环境

本程序使用的编译环境是QT5.12.0和VS2017,如果你安装环境不用,你可以通过阅读里面的程序代码,进行代码有效的提取,然后你再自己创建工程进行编译使用。

3、基本描述

通过获取计算机的硬件信息,然后通过加密组成,生成每个计算机的唯一机器码,类似的方式,按照内部定义的规则,生成相应的组册码。

4、获取计算机硬件信息

通过获取计算机的硬件信息来确定每个计算机的唯一性,包括计算的IP,网卡,CPU,硬盘等相干信息来生成机器码,部分程序内容参考如下:


/
// 获取计算机的CPU的ID
QString HardwareInfo::getCPUId() 
{
	QString strCpuId = "";
	unsigned int dwBuf[4] = { 0 };
	unsigned long long ret = 0;

	__cpuid((int*)(void*)dwBuf, 1);

	ret = dwBuf[3];
	ret = ret << 32;

	QString str0 = QString::number(dwBuf[3], 16).toUpper();
	QString str0_1 = str0.rightJustified(8, '0');
	QString str1 = QString::number(dwBuf[0], 16).toUpper();
	QString str1_1 = str1.rightJustified(8, '0');
	strCpuId = str0_1 + str1_1;

	return strCpuId;
}

// 获取计算机的MAC地址
QString HardwareInfo::getHostMacAddress()
{
	// 获取所有网络接口列表
	QList<QNetworkInterface> nets = QNetworkInterface::allInterfaces();
	int nCnt = nets.count();
	QString strMacAddr = "";
	for (int i = 0; i < nCnt; i++)
	{
		// 如果此网络接口被激活并且正在运行并且不是回环地址,则就是我们需要找的Mac地址
		if (nets[i].flags().testFlag(QNetworkInterface::IsUp) && nets[i].flags().testFlag(QNetworkInterface::IsRunning) && !nets[i].flags().testFlag(QNetworkInterface::IsLoopBack))
		{
			strMacAddr = nets[i].hardwareAddress();
			break;
		}
	}

	return strMacAddr;
}

// 获取计算机的IP地址
QString HardwareInfo::getHostIpAddress()
{
	QString strIpAddress;
	QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses();
	
	// 获取第一个本主机的IPv4地址
	int nListSize = ipAddressesList.size();
	for (int i = 0; i < nListSize; ++i)
	{
		if (ipAddressesList.at(i) != QHostAddress::LocalHost &&
			ipAddressesList.at(i).toIPv4Address()) 
		{
			strIpAddress = ipAddressesList.at(i).toString();
			break;
		}
	}
	
	// 如果没有找到,则以本地IP地址为IP
	if (strIpAddress.isEmpty())
		strIpAddress = QHostAddress(QHostAddress::LocalHost).toString();

	return strIpAddress;
}

// 获取计算机的硬盘ID
QString HardwareInfo::getDiskId()
{
	QProcess p;
	p.start("diskpart");
	p.waitForStarted();
	p.write("select disk 0\n detail disk\n");
	p.closeWriteChannel();
	p.waitForFinished();
	QString info = QString::fromLocal8Bit(p.readAllStandardOutput().data());
	p.kill();

	int nIdx = info.indexOf(QStringLiteral("磁盘 ID"));
	int nIdx2 = info.indexOf("\n", nIdx);

	QString strHDD = info.mid(nIdx + 6, nIdx2 - nIdx - 6);
	strHDD = strHDD.trimmed();

	return strHDD;
}


5、生成机器码和注册码

这里使用的是MD5加密方式,为了防止MD5被解密,我们通常都是通过干扰符和多重加密的方式来进一步加密,这样可以防止被解密。

// 创建当前计算机机器码
QString HardwareInfo::createMachineCode()
{
	QString strCpuId = getCPUId();
	QString strMac = getHostMacAddress();
	QString strIp = getHostIpAddress();
	QString strDiskId = getDiskId();
	QString strOriginal = strCpuId + strMac + strIp + strDiskId + D_INTERFERENCE_CHARACTER;

	// 加密
	Md5Encode md5;
	std::string strTemp = md5.Encode(strOriginal.toStdString());
	for (size_t i = 0; i < 10; i++)
	{
		// 循环加密,进一层保护
		strTemp = md5.Encode(strTemp);
	}

	// 得到最后的机器码
	std::string strMachineCodeString("");
	transform(strTemp.begin(), strTemp.end(), back_inserter(strMachineCodeString), ::toupper);
	QString strMachineCode = QString::fromStdString(strMachineCodeString);

	return strMachineCode;
}

6、全部应用程序下载链接:

https://download.csdn.net/download/u013083044/86108002

打赏
支付宝 微信
上一篇 下一篇