admin管理员组

文章数量:1566224

💂 个人主页:pp不会算法v
🤟 版权: 本文由【pp不会算法v】原创、在CSDN首发、需要转载请联系博主
💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦

奇思妙想系列文章

一、c\c++ windows自动打开cmd并进入mysql

二、c++\windows实现qq消息连发,群发器

三、c++\windows软件绑定网卡加密,实现一机一码

文章目录

    • 奇思妙想系列文章

最近接了一个小单子做个绑定网卡加密的demo,也是第一次了解吧,还挺有趣分享一下

相信大家都接触过加密软件,提起加密软甲我最先想起的就是数据库可视化工具Navicat了,navicat有一种方式就是给你一串请求码然后要你输入激活码,这个激活码就是根据这个请求吗解密之后得到的,

而且这个激活成功之后换了一台电脑那么就无效了,因为这是一机一码,那么怎么实现一机一码的呢,肯定是和电脑的某些唯一标识绑定关联起来了

对于一台电脑独一无二的信息常见的有两种:
1、网卡信息
2、主机序列号

那么这就好办了,我们只要根据网卡信息和主机序列号生成一个密钥就行了,然后加密一下变为注册码,客户要根据这个注册码解密出密钥然后输入解密之后的密钥就能进入软件主界面、

但是我们只需要输入一次密钥就行了(成功的前提下),那么之后我们怎么进入了,这好办解密成功之后我们只要把这个密钥写进注册表就行,然后每次打开软件先去注册表读取密钥,然后自动解锁

其实很简单,我前面说的有点复杂了,
软件的工作流程大致为:
打开–》读取注册表–》有密码然后加密之后看跟注册码是否一样,如果注册表没有密码或者密码错误那么弹出一个对话框供显示注册码和密钥输入框–》输入密钥正确那么就写进注册表然后进入主界面

既然是在windows下的软件那么就用winapi就行了
这里要用到一个库iphlapi.lib

下面我就简单写个根据网卡信息生成的唯一字符串的接口

CString Cdemo3App::GetPcinfoCode()
{
	std::string macAddress;
	IP_ADAPTER_INFO adapterInfo[16];
	DWORD bufferSize = sizeof(adapterInfo);
	DWORD result = GetAdaptersInfo(adapterInfo, &bufferSize);

	if (result == ERROR_SUCCESS)
	{
		PIP_ADAPTER_INFO pAdapterInfo = adapterInfo;
		std::stringstream ss;
		for (DWORD i = 0; i < pAdapterInfo->AddressLength; i++)
		{
			if (i > 0)
				ss << ":";
			ss << std::hex << (int)pAdapterInfo->Address[i];
		}
		macAddress = ss.str();
	}
	// 将 MAC 地址进行异或操作,得到全数字的结果
	std::string numericMacAddress;
	for (int i = 0; i < macAddress.length(); i++)
	{
		char numericChar = (char)(macAddress[i] ^ '0');
		numericMacAddress += numericChar;
	}
	CString pcInfo;
	pcInfo.Format(_T("%s"), numericMacAddress.c_str());
	CString resultStr, temp;
	for (int i = 0; i < pcInfo.GetLength(); i++)
	{
		temp.Format("%d", (int)pcInfo[i]);
		resultStr +=temp;
	}
	return resultStr;
}

加密解密:
这里我就用最简单的异或操作来加密那么解密就和加密的流程一样了,这应该属于是对称加密

CString Cdemo3App::GetKey(CString pcInfoCode)
{
	CString str = "3214569872021041520024925592652165";

	CString result;
	for (int i = 0; i < pcInfoCode.GetLength() && i < str.GetLength(); i++)
	{
		TCHAR ch = (TCHAR)((pcInfoCode[i] - '0') ^ (str[i] - '0')) + '0';
		result += ch;
	}
	return result;
}

读取注册表

CString keyPath = _T("Software\\YourCompany\\YourApp");

	CString savedKey;

	HKEY hKey;
	if (RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\myApp", 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
	{
		DWORD dataSize = 0;
		if (RegQueryValueEx(hKey, "Key", NULL, NULL, NULL, &dataSize) == ERROR_SUCCESS)
		{
			TCHAR* buffer = new TCHAR[dataSize / sizeof(TCHAR)];
			if (RegQueryValueEx(hKey, "Key", NULL, NULL, (LPBYTE)buffer, &dataSize) == ERROR_SUCCESS)
			{
				savedKey = buffer;
			}
			delete[] buffer;
		}

		RegCloseKey(hKey);
	}

写注册表

	// 写入注册表
	CString key;
			HKEY hKey;
			if (RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\myApp", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, NULL) == ERROR_SUCCESS)
			{
				RegSetValueEx(hKey, "Key", 0, REG_SZ, (LPBYTE)(LPCTSTR)key, (key.GetLength() + 1) * sizeof(TCHAR));
				RegCloseKey(hKey);
			}

demo源码地址:https://github/ppywj/windows-.git
不求fork,但求觉得对你有帮助三连一下,这是我写文章的动力,谢谢 ^ V ^

本文标签: 绑定网卡软件Windows一机一码