为保护自己辛苦写出的程序,规避白嫖。通常需要对可执行程序进行加密授权。网上主流的方法是给主程序套壳,但是破解软件网站都快要翻烂了,还是没有找到满足自己需求的套壳软件。索性还是自己写这个加密授权软件。本文的主要内容就是实现QT软件的一机一码的加密与授权
目录
0、中心思想
1、项目文件和头文件
2、生成机器码
3、加入公钥
4、用md5加密添加了公钥的组合明文
5、判断是否授权
6、授权成功写入注册表
0、中心思想
- 让软件获取此电脑的CPU和MAC地址等信息,然后组合成机器码,每个机器都是独一无二的
- 添加只有自己才知道的公钥到机器码,与之组合成密码明文
- 将密码明文用md5或者其他方式加密得到每个机器独一无二的密码
- 读取注册表中代表本软件密码的参数,如果不匹配则进入授权界面,如下图所示
- 授权成功后,将密码写入注册表,下一次使用将不再受到约束
- 根据基于机器码的加密过程(添加只有自己知道的公钥),自己单独写一个机器码→授权码的授权软件,如下图所示,需要授权的电脑发送机器码给你,你生成授权码后发送给他。
本文的内容所实现功能是类似于QT-C++ 注册机软件,生成机器码和注册码,支持授权时间_qt制作注册机-CSDN博客
这篇博客的功能,这篇博客的第一张动态图非常的贴切。
请一定先理解中心思想,再往下看!
1、项目文件和头文件
.pro & .h
-
// .pro
-
QT += network
-
// .h
-
#include <QtNetwork>
-
#include <QSettings>
2、生成机器码
-
// 获取MAC地址信息
-
QString mainwindow::get_mac_id()
-
{
-
QList<QNetworkInterface> nets = QNetworkInterface::allInterfaces();
-
int nCnt = nets.count();
-
QString strMacAddr = "";
-
for(int i = 0; i < nCnt; i++)
-
{
-
if(nets[i].flags().testFlag(QNetworkInterface::IsUp) &&
-
nets[i].flags().testFlag(QNetworkInterface::IsRunning) &&
-
!nets[i].flags().testFlag(QNetworkInterface::IsLoopBack))
-
{
-
for(int j = 0; j < nets[i].addressEntries().size(); j++)
-
{
-
if(nets[i].addressEntries().at(j).ip() != QHostAddress::LocalHost &&
-
nets[i].addressEntries().at(j).ip().protocol() == QAbstractSocket::IPv4Protocol)
-
{
-
strMacAddr = nets[i].hardwareAddress();
-
}
-
}
-
}
-
}
-
strMacAddr.remove(':');
-
return strMacAddr;
-
}
-
// 获取CPU信息
-
QString mainwindow::get_cpu_id()
-
{
-
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;
-
}
-
// 获得独一无二的机器码
-
QString mainwindow::get_machine_code()
-
{
-
QString cpuid = get_cpu_id();
-
QString macid = get_mac_id();
-
QString UniqueCode = cpuid + macid;
-
QString MachineCode = "";
-
for(int i = 0; i < UniqueCode.size(); i++)
-
{
-
MachineCode = MachineCode + UniqueCode[i];
-
if((i+1)%4==0 && i+1!=UniqueCode.size()){
-
MachineCode = MachineCode + "-";
-
}
-
}
-
return MachineCode;
-
}
3、加入公钥
-
// 加入公钥
-
QString mainwindow::get_visible_key(){
-
QString machinecode = get_machine_code();
-
m_str_machine_code = machinecode;
-
QString Authorkey1 = "公钥1-自定义";
-
QString Authorkey2 = "公钥2-自定义";
-
QString ciphertext = Authorkey1+ "-" + machinecode + "-" + Authorkey2;
-
return ciphertext;
-
}
4、用md5加密添加了公钥的组合明文
-
// 获得加密后的密码
-
QString mainwindow::get_md5_key(){
-
QString ciphertext = get_visible_key();
-
QString md5Str = QCryptographicHash::hash(ciphertext.toLatin1(),QCryptographicHash::Md5).toHex();
-
return md5Str;
-
}
5、判断是否授权
-
// 初始化判断是否已授权,只调用一次
-
bool mainwindow::is_authorized(){
-
QString md5pwd = get_md5_key();
-
m_str_md5_key = md5pwd;
-
qDebug() << m_str_md5_key;
-
QSettings setting("HKEY_CURRENT_USER\\Software\\自定义注册表的名字", QSettings::NativeFormat);
-
QString mypwd = setting.value("自定义参数的名字", "").toString();
-
if(mypwd == md5pwd){
-
return true;
-
}else{
-
return false;
-
}
-
}
6、授权成功写入注册表
-
// 授权成功将信息保存进入注册表
-
void authorize::save_authorization_info(QString md5_key)
-
{
-
QSettings setting("HKEY_CURRENT_USER\\Software\\自定义注册表的名字", QSettings::NativeFormat);
-
setting.setValue("自定义参数的名字", md5_key);
-
}
保存之后的注册表如下图所示
软件的授权界面、按钮操作、弹出授权界面和关闭授权界面的逻辑等内容,这些我就不分享了,上面已经提供了最核心的思想和最核心的功能,拿着这些东西就能够实现一机一码加密功能了。 授权软件要单独写一个,可以说是非常简单,就不赘述了。
最后愿我们共同进步! 感谢您的阅读,欢迎留言讨论、收藏、点赞、分享。