日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

Qt/C++程序防拷贝及限制多次安装的一个简单案例

發(fā)布時間:2024/3/24 c/c++ 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt/C++程序防拷贝及限制多次安装的一个简单案例 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

最近因項目需求:安裝后的程序即使拷貝其他電腦也不使用,安裝包只能在一臺電腦安裝,在此電腦安裝后不能在其他電腦安裝即使單獨拷貝安裝包也不能安裝。另外就是不使用加密狗或者license key等,而且也沒有服務器不聯(lián)網(wǎng)。最后就是發(fā)布的安裝包隨U盤交付給客戶。

這里記錄分享下自己的實現(xiàn)過程及方法

解決方案

只有一天不到的開發(fā)時間(臨時發(fā)客戶)還有需求限制(也包括自己的水平)的情景下首先想到的最簡單最快的辦法就是利用識別文件來當做軟件運行和安裝的條件。根據(jù)需求功能分了3部分:1.安裝后的程序防拷貝:安裝程序時在用戶電腦生成一個文件,當然這個文件只有你知道在哪,程序啟動時判斷文件是否存在,如果程序被拷貝至其他電腦那肯定沒有你生成的文件,就不執(zhí)行或者給個提示未授權。這樣就很簡單完成了第一個需求功能。2.U盤里的安裝包防多臺電腦安裝:一開對U盤做手腳折騰了一陣子,還是覺得利用文件作為條件判斷最簡單有效。安裝包執(zhí)行后要在U盤里面生成文件,里面還需要保存電腦的一些硬件配置信息比如MAC地址、CPU型號,這樣用U盤在其他電腦安裝時通過安裝程序判斷文件里面的電腦硬件信息就可知道是不是原始安裝電腦,如果不是直接退出程序安裝。貌似是解決了多臺電腦安裝的問題。3.U盤安裝包防拷貝安裝:這個就是用戶將安裝exe從U盤拷貝走安裝防護,這個思路和第一部分一樣,在U盤生成一個文件,安裝時檢測文件是否存在,不存在就退出安裝,這樣拷貝走也不能安裝。這一部分屬于出場設置一樣,提前在U盤生成一個文件。
重點哈:標識文件赤裸裸的在U盤里面客戶全部拷貝不一樣使用,所以需要對這些文件做些保護,至少不能直接被客戶看到,首先想到的就是設置隱藏,不過這未免也太low了,簡單的文件隱藏屬性一般人都能察覺(至少交付給測試同事的時候他還有意識的點開了查看隱藏文件,不過他失望了啥也沒看到0_0)。因為這里追加了一個屬性就是將文件屬性設置成系統(tǒng)+隱藏屬性。即使點擊文件查看隱藏文件也不會顯示出來。而且即使你發(fā)現(xiàn)了你也改不了,有很多惡意病毒也利用過這點。當然對程序員來說就很簡單了,cmd敲一行命令即可去掉系統(tǒng)隱藏屬性。我也直接給大家貼出來了:

attrib G:\ProgramFiles +s +h 這個是對ProgramFiles文件夾設置系統(tǒng)隱藏屬性,去除就是-s -h,文章后面我也增加了C++設置文件系統(tǒng)隱藏屬性的代碼。

方法雖然簡單,可落地也經(jīng)歷了不少麻煩事。其實是對Inno setup打包工具編碼不是很熟悉。畢竟在安裝時需要運行exe檢查文件以及獲取安裝電腦硬件信息并寫入文件。這些操作都離不開inno setup打包程序。

BB了那么多下面寫下實現(xiàn)過程

使用Inno Setup打包Qt exe程序

需要發(fā)布的程序是基于Qt平臺的,因此在使用Inno setup打包前需要先打包Qt運行環(huán)境,Qt程序運行環(huán)境打包操作方法我也簡單說明下,
1.新建一個文件夾將你工程release下的exe文件拷貝進去。比如:
2.根據(jù)你exe的編譯器版本選擇啟動

在cmd中將目錄切換至剛才新建的文件夾中。
然后輸入指令:windeployqt RunbeforInstall.exe,這里你寫自己的exe.運行完成后文件夾里面就會有exe運行需要的Qt文件

如果你的exe還依賴其他dll,也要拷貝到此目錄,這時候雙擊exe是可以直接運行的。

運行環(huán)境打包完畢,后面就是要使用Inno Setup打包成安裝包exe,這個需要下載一個Inno setup工具,網(wǎng)上有。我就介紹下怎么使用:
1.打開Inno Setup

選擇 File->New,彈出窗口后點Next
App Name就是你應用程序的名字就像,其他看著填。下一步即可

這里指定安裝包在安裝時生成的目錄名稱用程序名即可。下一步

這里就需要點擊“Browse”選擇我們剛才打包好的Qt運行環(huán)境里面的exe,其他依賴文件點擊Add folder,文件點擊Add file,

添加完成后點擊下一步:

這里沒啥說的,,直接下一步:

不需要的話可以直接下一步,我這里不需要。。。

沒中文,,,只能英文,下一步:

這里是指定你打包的安裝包輸出路徑以及安裝包的名稱。不填寫默認在你打包的exe同級目錄下Output文件夾里面生成。直接下一步,點完Finsh:

這個文件可以理解成生成安裝包的源代碼文件,還需要編譯后才能生成安裝包exe,其實前面的引導界面也就是生成了這里面的代碼,一般熟悉inno的都是直接使用源文件的,當然有界面會方便一點。這個彈窗可以選擇否,因為還有點地方需要修改,剛才我們添加了文件夾,需要在[Files]字段的DestDir:{app}后面加上文件夾名,如下圖:
{app}可以理解成exe打包安裝目錄,如果不加你會發(fā)現(xiàn)安裝包運行后那些文件夾里的文件全部和exe釋放一起了,運行時文件路徑不正確。這也是我踩的第一個坑,畢竟邊學邊用。
然后點擊保存,然后點擊編譯按鈕,那個綠色圈圈的,在保存按鈕右側(cè):

編譯后會在生成一個stup.exe,直接運行就可以安裝了。

到這里普通的安裝就算成功了,不過我這里還有許多工作要做,就是安裝時檢測電腦硬件信息以及生成系統(tǒng)隱藏屬性文件。由于沒時間去研究inno setup的編碼功能,就寫一個exe專門做檢測和生成文件,在安裝包運行的時候調(diào)用這個exe進行檢測。
這就需要修改iss文件(剛才打包編譯的inno setup源代碼文件),增加功能代碼安裝前運行檢測exe,(CSDN的博客編輯在這里有點坑爹,我粘貼Inno 代碼會導致文檔為空。。。。還好提前保存了)我只能截圖了。。。

代碼意思對程序員不難理解,[Code]字段是函數(shù)代碼段,procedure Fun();這是定義一個函數(shù)。緊跟其后是函數(shù)內(nèi)容。Exec(ExpandConstant(’{app}\RunbeforInstall_boxed.exe’), ExpandConstant(’{src}’),’’, SW_SHOWNORMAL,
ewWaitUntilTerminated, ResultCode)這是調(diào)用其他exe的執(zhí)行函數(shù),第一個參數(shù)是你要調(diào)用的exe,第二個參數(shù)是調(diào)用exe的輸入?yún)?shù)(main函數(shù)的參數(shù)),后面的默認,最后一個ResultCode是你exe Main函數(shù)返回值。我這里因為需要在安裝包路徑下生成系統(tǒng)隱藏文件并寫入MAC地址信息,所以需要傳入安裝包執(zhí)行路徑’{src}‘,也就是我U盤的路徑。如果檢測失敗可以返回1,安裝程序根據(jù)返回值判斷要不要結束安裝。
函數(shù)調(diào)用是在[Files]字段中添加,Flags:deleteafterinstall BeforeInstall: RunOtherInstaller。

Source: "E:\Ligs2.0\RunbeforInstall_boxed.exe"; DestDir: "{app}"; Flags: ignoreversion deleteafterinstall Source: "E:\Ligs2.0\主程序.exe"; DestDir: "{app}"; Flags: ignoreversion; BeforeInstall: RunOtherInstaller

RunbeforInstall_boxed.exe是我需要在安裝包運行時調(diào)用的程序,用來檢測是否可安裝,BeforeInstall: RunOtherInstaller這個屬性要加在exe下一條指令上,至于原因是exe是在安裝包釋放到app目錄執(zhí)行的,如果你加在第一條指令上會提示找不到exe,因為它還沒拷貝過來。可能還有別的辦法不過我也沒時間追究了。有興趣的可以研究研究。
本想把Qt生成系統(tǒng)隱藏屬性的代碼分享下,由于時間問題就不整理了,而且代碼也很簡單,就是生成文件設置下屬性,屬性設置代碼我給大家貼出來:

#include <windows.h> SetFileAttributes((LPCWSTR)tempHideDir.unicode(),FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN);//tempHideDir可以是文件夾也可以是文件名。

還有很多細節(jié)沒時間寫了。至于inno setup的編碼可以網(wǎng)上查下資料,也可以查看自帶的幫助手冊,也很全有demo。

整理下流程

寫了2個exe(不算發(fā)布主程序)封裝于setup安裝包中,一個是在安裝包install完成后調(diào)用,運行時在C盤下某個路徑生成一個啟動辨識文件(系統(tǒng)隱藏屬性)為了防止程序拷貝使用。另外一個是在setup安裝包運行前調(diào)用檢測U盤中是否有出場設置生成的標識文件有的話就保存電腦硬件信息(系統(tǒng)隱藏屬性),防止安裝包多臺電腦安裝以及拷貝安裝。

想記錄的東西太多又想分享的細節(jié)一點奈何有心無力。挺扯蛋的一個解決辦法。勿噴,,,,交流學習可以~~

總結

以上是生活随笔為你收集整理的Qt/C++程序防拷贝及限制多次安装的一个简单案例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。