最近公司做了一个电子元器件计数器,主要为了小批量的卖一些设备,为防止算法软件在其他设备上运行,需要将软件加密,起初打算用加密狗,后来想了一下由于软件和硬件都是自己设计的,所以可以把硬件CPU或者网卡,主板等硬件信息写进程序,来实现对软件简单的加密。
下面记录一下绑定CPU序列号方法:主要参考:https://blog.csdn.net/zkz10086/article/details/81505254
后面如果有需要,还可以绑定网卡,主板,硬盘,内存等。
因为项目是用Qt编写的,代码也是Qt main.cpp代码:
在搜索框内输入cmd,然后输入命令 wmic cpu get ProcessorID 可以查看主机CPU序列号
#include "mainwindow.h"
#include
#include
#include
#include
#if _MSC_VER >= 1600 //判断编译器版本(MSVC)
#pragma execution_character_set("utf-8") //强制转换为UTF-8
#endif
//授权的主机CPU的ID表
QStringList _CPU_ID_LIST
{
"BFEBFBFF000306D4" //我本机CPU的ID
};
//获取当前主机CPU的ID
QString GetCurrentCpuId()
{
QString _currrent_cpu_id;
unsigned long s1, s2;
char buf[32] = { 0 };
__asm{
mov eax, 01h //eax=1:取CPU序列号
xor edx, edx
cpuid
mov s1, edx
mov s2, eax
}
if (s1) {
memset(buf, 0, 32);
sprintf_s(buf, 32, "%08X", s1);
_currrent_cpu_id += buf;
}
if (s2) {
memset(buf, 0, 32);
sprintf_s(buf, 32, "%08X", s2);
_currrent_cpu_id += buf;
}
__asm{
mov eax, 03h
xor ecx, ecx
xor edx, edx
cpuid
mov s1, edx
mov s2, ecx
}
if (s1) {
memset(buf, 0, 32);
sprintf_s(buf, 32, "%08X", s1);
_currrent_cpu_id += buf;
}
if (s2) {
memset(buf, 0, 32);
sprintf_s(buf, 32, "%08X", s2);
_currrent_cpu_id += buf;
}
return _currrent_cpu_id;
}
bool JudgeCpuIdLegal(QString cpuId)
{
for(QString id : _CPU_ID_LIST)
{
if(id == cpuId)//CPU序列号是否被授权
return true;
}
return false;
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QString _currrent_cpu_id = GetCurrentCpuId();
if(!JudgeCpuIdLegal(_currrent_cpu_id))//当前主机CPU序列号未授权则程序退出
{
QMessageBox::warning(nullptr,"程序错误","非法硬件!");
return -1;
}
MainWindow w;
w.show();
return a.exec();
}