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