自学内容网 自学内容网

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");

    }

}


原文地址:https://blog.csdn.net/foxgod/article/details/142523135

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!