在工作中,為了方便項目調試,一般情況下我們都會選擇開發一個上位機來實現簡單的控制和數據讀取的功能;但是,這個工具僅限于研發人員使用。為了防止別有用心的測試或者其它人員將這個APP通過U盤的形式拷貝走然后到另外一臺電腦上運行,我們可以有以下兩種簡單的設計方案(以下內容默認用戶已了解QT上位機開發,故屏蔽許多細節):
(1)設計一個簡單的輸入密碼邏輯,當輸入密碼與自己設定的密碼匹配時,即進入軟件界面。這種方法比較簡單,也很容易被破解。
(2)提前通過另外一個軟件讀取本機的硬件信息(我們稱之為注冊機),然后通過某種編碼格式將該信息編碼為其它的格式并生成一個文件(將該文件放到系統較為隱蔽的目錄下)。當我們使用的APP打開時,按照約定格式打開并將該文件里的數據轉換為硬件信息,然后進行匹配,如果發現沒有該文件或者硬件信息不匹配,則提示軟件未注冊,否則,正常打開該軟件。
第一種方法比較簡單,初學QT應用編程的小白都可以很容易將它實現,我們就不多說了。我們重點來講解一下第二種方法的實現。
以下幾個命令可以在Window cmd上運行即可以看到對應的信息:
獲取cpu名稱 wmiccpugetName 獲取cpu核心數 wmiccpugetNumberOfCores 獲取cpu線程數 wmiccpugetNumberOfLogicalProcessors 查詢cpu序列號 wmiccpugetprocessorid 查詢主板序列號 wmicbaseboardgetserialnumber 查詢BIOS序列號 wmicbiosgetserialnumber 查看硬盤 wmicdiskdrivegetserialnumber
這是我的電腦硬件信息:
其中,CPU序列號是一個唯一的ID號,它是廠家在制造CPU的時候燒入到內部的。我在工作中主要使用這個來進行加密,當然你也可以使用其它的內容。接下來我們可以實現一個簡單的注冊機邏輯:
實現獲取硬件信息接口
將硬件信息經過Base64格式轉換
顯示Base64格式轉換為的結果
#include"mainwindow.h" #include"ui_mainwindow.h" #include//獲取cpu名稱:wmic cpu get Name //獲取cpu核心數:wmic cpu get NumberOfCores //獲取cpu線程數:wmic cpu get NumberOfLogicalProcessors //查詢cpu序列號:wmic cpu get processorid //查詢主板序列號:wmic baseboard get serialnumber //查詢BIOS序列號:wmic bios get serialnumber //查看硬盤:wmic diskdrive get serialnumber QStringMainWindow::getMachineInfo(constQString&cmd) { QProcessp; p.start(cmd); p.waitForFinished(); QStringresult=QString::fromLocal8Bit(p.readAllStandardOutput()); QStringListlist=cmd.split(""); result=result.remove(list.last(),Qt::CaseInsensitive); result=result.replace(" ",""); result=result.replace(" ",""); result=result.simplified(); returnresult; } QByteArrayMainWindow::Encode(QByteArraydata) { returndata.toBase64(); } MainWindow::MainWindow(QWidget*parent) :QMainWindow(parent) ,ui(newUi::MainWindow) { ui->setupUi(this); this->setWindowTitle("注冊機"); } MainWindow::~MainWindow() { deleteui; } voidMainWindow::on_GenerateCode_clicked() { QStringCode=getMachineInfo("wmiccpugetprocessorid"); QFilefile("D:/Register.txt"); //打開文件,不存在則創建 file.open(QIODevice::ReadWrite|QIODevice::Text); //寫入文件需要字符串為QByteArray格式 if(file.write(Encode(Code.toLatin1()))>0) { ui->CodeDisplay->setText(Encode(Code.toLatin1())); QMessageBox::information(NULL,"提示","注冊成功",QMessageBox::Ok); } else QMessageBox::information(NULL,"提示","注冊失敗",QMessageBox::Ok); file.close(); }
編譯運行后,當我們點擊生成注冊碼時,則會顯示硬件信息通過Base64編碼的結果,如下所示:
一個簡單的注冊機寫完以后,APP在加載運行的時候需要加上以下邏輯:
#include"mainwindow.h" #include#defineARRAY_SIZE(x)(sizeof(x)/sizeof(x[0])) QStringgetMachineInfo(constQString&cmd) { QProcessp; p.start(cmd); p.waitForFinished(); QStringresult=QString::fromLocal8Bit(p.readAllStandardOutput()); QStringListlist=cmd.split(""); result=result.remove(list.last(),Qt::CaseInsensitive); result=result.replace(" ",""); result=result.replace(" ",""); result=result.simplified(); returnresult; } intmain(intargc,char*argv[]) { uint8_tRunFlag=0; QByteArrayDecodeStr; QStringCpuSerialNumber; QApplicationa(argc,argv); //1.獲取CPU序列號 CpuSerialNumber=getMachineInfo("wmiccpugetprocessorid"); //2.打開注冊碼文件,讀取加密字符串并進行匹配加密字符串 QFilefile("D:/Register.txt"); if(!file.open(QIODevice::ReadOnly)) { QMessageBox::warning(NULL,"Error","注冊碼不存在,請導入注冊碼!",QMessageBox::Yes); return-1; } else { //讀取文件所有的內存 QByteArrayEncodeStr=file.readAll(); //將讀取的內容進行解碼 DecodeStr=fromBase64(EncodeStr); //將解碼的結果與當前PC的CPU序列號進行比較 QStringStr(DecodeStr); if(0==Str.compare(CpuSerialNumber)) RunFlag=1; } //3.如果匹配成功,運行軟件 if(RunFlag) { MainWindoww; w.show(); returna.exec(); } else { QMessageBox::warning(NULL,"Error","注冊碼無效,請聯系廠商獲取注冊碼!",QMessageBox::Yes); return-1; } return0; }
實現注冊機更好的方案則可以直接將信息寫入注冊表,然后APP去注冊表中讀取相應的內容。關于硬件信息的加密和解密方式,用戶可以有其它的實現方法。
這里留一個問題,如何將APP啟動信息與其它平臺進行關聯呢?例如Qt ARM端、Mac端、Android端?
審核編輯:湯梓紅
-
Window
+關注
關注
0文章
82瀏覽量
37305 -
上位機
+關注
關注
27文章
945瀏覽量
55006 -
Qt
+關注
關注
1文章
308瀏覽量
38066 -
注冊機
+關注
關注
9文章
55瀏覽量
23711
原文標題:Qt上位機開發之如何讓自己的APP啟動與硬件信息綁定(Win端)
文章出處:【微信號:嵌入式應用研究院,微信公眾號:嵌入式應用研究院】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論