当前位置: 首页 > article >正文

qt 模仿简易的软狗实现

我们在写软件的时候,希望我们的软件只在固定的机器上运行,其他机器上运行不了,那我们应该如何做呢?

1 首先我们需要得到运行机器的mac地址,这样可以简易的判断是否是我们授权的机器。

那我们首先定义一个授权mac机器列表

QStringList listMac;
listMac<<"8C:EC:4B:C9:CE:AC"<<"9C:EC:4B:C9:CE:AC"<<"7C:EC:4B:C9:CE:AC";这部也可以修改为读取远端数据库,其他方法可以自己按照自己情况考虑。

2 读取本机的mac信息,判断本机的mac是否在授权范围内。

3 读取注册表里面软件使用信息,我们可以用时间来判断是否过了有效期,加入第一次使用,注册表里面写入注册时间,下次进来对比当前时间和注册时间之间的差值,是否过了有效期。

4 对注册表的注册信息进行base64编码。

下面上代码:

#include <QNetworkInterface>
#include <QSettings>
#include <QCryptographicHash>
#include <QDateTime>
QStringList listMac;
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    listMac<<"8C:EC:4B:C9:CE:AC";
    ReadLocalInfo();
}

Widget::~Widget()
{
    delete ui;
}

QString Widget::ReadSystemTable()
{
    QString info;
    //通过写入注册表来判断
    QSettings settings("HKEY_CURRENT_USER\\Software\\Code_Encryption\\Settings",QSettings::NativeFormat);
    info = settings.value("remain_times").toString();
    return info;

}
void Widget::WriteSystemTable()
{

}
void Widget::ReadLocalInfo()
{
    QString macAddress;
    QList<QNetworkInterface> allInterfaces = QNetworkInterface::allInterfaces();
    for (auto &interface : allInterfaces) {
        // 通常, 我们选择第一个非虚拟和非回环接口
        if (interface.flags().testFlag(QNetworkInterface::IsUp) &&
                !interface.flags().testFlag(QNetworkInterface::IsLoopBack)) {
            macAddress = interface.hardwareAddress();
            m_MacAddress = macAddress;
            break;
        }
    }
    if(!listMac.contains(macAddress))
    {
        qApp->exit();
    }
    m_nCount = ReadSystemTable();
    AnalysisLocalInfo();
}
void Widget::AnalysisLocalInfo()
{
    if(m_nCount.isEmpty())
    {
         QByteArray strInfo;
         QDateTime currentData = QDateTime::currentDateTime();
         QString strTemp = m_MacAddress+"|"+currentData.toString("yyyy-MM-dd hh:mm:ss");
         strInfo = strTemp.toLocal8Bit();
         strInfo = strInfo.toBase64();
         QSettings settings("HKEY_CURRENT_USER\\Software\\Code_Encryption\\Settings",QSettings::NativeFormat);
         settings.setValue("remain_times",strInfo);
    }
    else
    {
        QByteArray strInfo = QByteArray::fromBase64(m_nCount.toLocal8Bit());
        QList<QByteArray> listInfo = strInfo.split('|');
        QDateTime lastData = QDateTime::fromString((QString)listInfo.at(1),"yyyy-MM-dd hh:mm:ss");
        QDateTime currentData = QDateTime::currentDateTime();
        if(currentData.secsTo(lastData)>=86400)
        {
           qApp->exit();
        }
       qDebug()<<"lastData"<<lastData.toString("yyyy-MM-dd hh:mm:ss")<<"currentData"<<currentData.toString("yyyy-MM-dd hh:mm:ss");

    }

}


http://www.kler.cn/news/323545.html

相关文章:

  • Java NIO 全面详解:掌握 `Path` 和 `Files` 的一切
  • Keysight 下载信源 Visa 指令
  • 蓝桥杯模块二:数码管的静态、动态实现
  • 电脑录屏怎么录视频和声音?苹果macOS、windows10都可以用的原神录屏工具来啦
  • 【JAVA】算法笔记
  • Linux用户管理
  • 面试遇到的质量体系10个问题(深度思考)
  • 论文阅读 | 可证安全隐写(网络空间安全科学学报 2023)
  • 神经网络(二):卷积神经网络
  • Vscode 远程切换Python虚拟环境
  • 解决Android中使用jdk 9以上中的某个类(AbstractProcessor)但是无法导入的问题
  • Java中通过方法上注解实现入参校验
  • 计算机毕业设计 在线问诊系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • C++那些你不得不知道的(2)
  • .NET 控制台应用程序连接 MySQL 数据库实现增删改查
  • mysql数据库设置主从同步
  • 自动驾驶电车难题的康德式道德决策
  • 黑马头条day6-kafka及异步通知文章上下架
  • Spring 全家桶使用教程 —— 后端开发从入门到精通
  • C#——switch案例讲解
  • 计算机毕业设计 校园失物招领网站的设计与实现 Java实战项目 附源码+文档+视频讲解
  • 58 深层循环神经网络_by《李沐:动手学深度学习v2》pytorch版
  • 【论文写作】描述一个模型比另一个模型效果好时
  • sentinel原理源码分析系列(二)-动态规则和transport
  • 如何在openEuler上安装和配置openGauss数据库
  • linux编辑文件保存退出的实操讲解
  • JVM基本了解
  • 神经网络激活函数
  • RabbitMQ 高级特性——重试机制
  • 【前端面试题】Vue 3 生命周期钩子的执行顺序详解