QT防止自研软件被复制的基本操作(二)

server/2024/12/23 6:03:32/

参考一

自研软件为了防止被人任意复制传播,需要设置注册使用模式。基本原理:通过计算机的特异性编号,加上自己的编码,使用加密算法算出一个生成码。

一、计算机的特异性编号

硬盘的编号:最后一块硬盘的编号就行(有些计算机可能有多块硬盘);

CPU的编号;

网卡的编号;最后一块网卡的MAC地址就行;

BIOS的编号;

获取系统的安装日期;

1.1 函数示例

#include <QProcess>QString getWMIC(const QString &cmd)
{//获取硬盘的序列号:wmic diskdrive get serialnumber//获取cpu的序列号:wmic cpu get processorid//获取网卡的MAC地址:wmic nicconfig get macaddress//查询BIOS序列号:wmic bios get serialnumber//查询操作系统安装时间:wmic os get installdate//QString cmd="wmic cpu get processorid";QProcess p;p.start(cmd);p.waitForFinished();QString result = QString::fromLocal8Bit(p.readAllStandardOutput());QStringList list = cmd.split(" ");result = result.remove(list.last(), Qt::CaseInsensitive);result = result.replace("\r", "");result = result.replace("\n", "");result = result.simplified();return result;
}

1.2 工程化处理

获取的这些序列号都很长,而且不同windows版本的电脑,wmic命令可能不同,所以需要进行工程化处理。

(1)各类序列号只取最后一块的;

(2)各类序列号只取后4位,但是:MAC地址取后2位,系统安装时间取前8位;

(3)对于无效查询,将其跳过,但是:如果所有的查询都无效,直接禁止使用软件。

1.3 示例代码

//函数:读取计算机硬件信息
QString KeyGen::GetPCMsg(void)
{//获取硬盘的序列号:wmic diskdrive get serialnumberQString tempStr=getWMIC("wmic diskdrive get serialnumber");QString pwd1 = tempStr.right(4); // 截取字符串的右边字符//获取cpu的序列号:wmic cpu get processoridtempStr=getWMIC("wmic cpu get processorid");QString pwd2 = tempStr.right(4); // 截取字符串的右边字符//获取网卡的MAC地址:wmic nicconfig get macaddresstempStr=getWMIC("wmic nicconfig get macaddress");QString pwd3 = tempStr.right(2); // 截取字符串的右边字符//查询BIOS序列号:wmic bios get serialnumbertempStr=getWMIC("wmic bios get serialnumber");QString pwd4 = tempStr.right(4); // 截取字符串的右边字符//查询操作系统安装时间:wmic os get installdatetempStr=getWMIC("wmic os get installdate");QString pwd5 = tempStr.left(8); // 截取字符串的右边字符return pwd1+pwd2+pwd3+pwd4+pwd5;
}

二、加密算法

使用Qt自带的MD5算法。

#include <QCryptographicHash>//加密所需// MD5 加密
QString MD5_encryption(const QString &data)
{QCryptographicHash md5(QCryptographicHash::Md5);    //使用MD5加密md5.addData(data.toUtf8(),data.size());   // 添加数据QByteArray bArry = md5.result();    //获取MD5加密后的密码QString md5_data;md5_data.append(bArry.toHex());return md5_data;
}

三、验证是否注册

验证注册号:读取ini文件,和程序计算的结果进行对比。

3.1 main.cpp文件

#pragma execution_character_set("utf-8")#include "mainwindow.h"
#include <QApplication>
#include "keygen.h"
#include <QMessageBox>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;if(KeyGen::verifyKey()){//验证成功w.show();return a.exec();}else{//验证不成功QMessageBox::warning(NULL, "警告","该软件还未注册,请联系软件开发师注册使用!");return 0;}
}

3.2 keygen.h文件

#ifndef KEYGEN_H
#define KEYGEN_H#include <QProcess>//获取计算机信息所需
#include <QCryptographicHash>//加密所需
#include <QDebug>//打印日志所需
#include <QSettings>//读取配置文件所需
#include <QDir>//读取配置文件所需QString getWMIC(const QString &cmd);
// MD5 加密
QString MD5_encryption(const QString &data);class KeyGen
{public:KeyGen();~KeyGen();//函数:读取计算机硬件信息static QString GetPCMsg(void);//函数:生成注册码static QString generateKey(QString);//函数:验证注册码static bool verifyKey();
};//构建函数
KeyGen::KeyGen()
{
}//析构函数
KeyGen::~KeyGen()
{
}//函数:读取计算机硬件信息
QString KeyGen::GetPCMsg(void)
{//获取硬盘的序列号:wmic diskdrive get serialnumberQString tempStr=getWMIC("wmic diskdrive get serialnumber");QString pwd1 = tempStr.right(4); // 截取字符串的右边字符//获取cpu的序列号:wmic cpu get processoridtempStr=getWMIC("wmic cpu get processorid");QString pwd2 = tempStr.right(4); // 截取字符串的右边字符//获取网卡的MAC地址:wmic nicconfig get macaddresstempStr=getWMIC("wmic nicconfig get macaddress");QString pwd3 = tempStr.right(2); // 截取字符串的右边字符//查询BIOS序列号:wmic bios get serialnumbertempStr=getWMIC("wmic bios get serialnumber");QString pwd4 = tempStr.right(4); // 截取字符串的右边字符//查询操作系统安装时间:wmic os get installdatetempStr=getWMIC("wmic os get installdate");QString pwd5 = tempStr.left(8); // 截取字符串的右边字符return pwd1+pwd2+pwd3+pwd4+pwd5;
}//函数:生成注册码
QString KeyGen::generateKey(QString data)
{data="XXXX"+data+"XXXX";return MD5_encryption(data);
}//函数:验证注册码
bool KeyGen::verifyKey()
{//读取注册表文件License.iniQString importfilepath=QDir::currentPath()+"/License.ini";QSettings *mConfigIni = new QSettings(importfilepath, QSettings::IniFormat);QString mKey_Local=mConfigIni->value("Key").toString();qDebug()<<mKey_Local;//读取系统配置并生成注册码QString tempStr=GetPCMsg();QString mKey_Now=generateKey(tempStr).left(8);qDebug()<<mKey_Now;//判断if(mKey_Local==mKey_Now){return true;}else{return false;}
}QString getWMIC(const QString &cmd)
{//获取硬盘的序列号:wmic diskdrive get serialnumber//获取cpu的序列号:wmic cpu get processorid//获取网卡的MAC地址:wmic nicconfig get macaddress//获取主板的序列号:wmic baseboard get serialnumber//查询BIOS序列号:wmic bios get serialnumber//查询操作系统安装时间:wmic os get installdate//QString cmd="wmic cpu get processorid";QProcess p;p.start(cmd);p.waitForFinished();QString result = QString::fromLocal8Bit(p.readAllStandardOutput());QStringList list = cmd.split(" ");result = result.remove(list.last(), Qt::CaseInsensitive);result = result.replace("\r", "");result = result.replace("\n", "");result = result.simplified();return result;
}// MD5 加密
QString MD5_encryption(const QString &data)
{QCryptographicHash md5(QCryptographicHash::Md5);    //使用MD5加密md5.addData(data.toUtf8(),data.size());   // 添加数据QByteArray bArry = md5.result();    //获取MD5加密后的密码QString md5_data;md5_data.append(bArry.toHex());return md5_data;
}#endif // KEYGEN_H

四、注册机

void MainWindow::on_pushButton_clicked()
{QString tempStr=ui->lineEdit->text();if(tempStr!=NULL){ui->lineEdit_2->setText(KeyGen::generateKey(tempStr).left(11));}
}


http://www.ppmy.cn/server/33319.html

相关文章

Redis 实战之压缩列表

Redis 实战 - 压缩列表 压缩列表的构成压缩列表节点的构成previous_entry_lengthencodingcontent 连锁更新总结 压缩列表的构成 压缩列表是 Redis 为了节约内存而开发的&#xff0c; 由一系列特殊编码的连续内存块组成的顺序型&#xff08;sequential&#xff09;数据结构。 …

Ubuntu下中文输入法安装

在Ubuntu 22.04系统中安装中文输入法&#xff0c;通常推荐使用Fcitx 5&#xff0c;这是一个功能强大的输入法平台。以下是安装和配置中文输入法的步骤&#xff1a; 1. 安装Fcitx 5&#xff1a; 打开终端&#xff0c;输入以下命令来安装Fcitx 5及其中文输入插件和前端界面&…

教程推荐:手机应用自动化

手机应用程序的自动化通常涉及使用专门设计的自动化框架和工具。对于Android和iOS平台&#xff0c;以下是一些常用的自动化工具&#xff1a; Android: Espresso: Espresso是谷歌官方支持的自动化测试框架。它适用于写UI测试来模拟用户对Android应用的交云。Espresso工作在应用…

无人机+交通执法:城市交管系统技术详解

无人机在交通执法中的应用为城市交通系统带来了许多创新和改变。以下是对这一技术应用的详细解析&#xff1a; 1. 违章取证&#xff1a;无人机可以挂载高分辨率和高倍数变焦相机&#xff0c;对城市交通进行空中巡查。尤其在常规监控无法覆盖的盲区&#xff0c;无人机能够实时监…

Github 2024-05-01 开源项目日报Top10

根据Github Trendings的统计,今日(2024-05-01统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4TypeScript项目2JavaScript项目2Vue项目1非开发语言项目1Rust项目1MyShell: 即时语音克隆和开发者社区 创建周期:39 天开发语言:P…

【华为OD机试C卷D卷】找数字(C++/Java/Python)

【华为OD机试】-(A卷+B卷+C卷+D卷)-2024真题合集目录 【华为OD机试】-(C卷+D卷)-2024最新真题目录 题目描述 小扇和小船今天又玩起来了数字游戏, 小船给小扇一个正整数 n(1 ≤ n ≤ 1e9),小扇需要找到一个比 n 大的数字 m,使得 m 和 n 对应的二进制中 1 的个数要相同,如…

JVM笔记1--Java内存区域

1、运行时数据区域 从上图可以看出来&#xff0c;Java虚拟机运行时数据区域整体上可以分成5大块&#xff1a; 1.1、程序计数器 程序计数器是一块较小的内存空间。它可以看做当前线程所执行的字节码的行号指示器。在Java虚拟机的概念模型里&#xff0c;字节码解释器工作时就是…

【每日力扣】141. 环形链表与142. 环形链表 II

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害 141. 环形链表 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟…