用加密狗控制軟體的授權 C

2021-08-25 00:17:37 字數 4381 閱讀 6398

每只加密狗都有乙個固定的序列號,並且一般是無法修改的。軟體執行時讀取加密狗的序列號進行判斷,序列號通過驗證後才能正常使用軟體。

需要用到以下方法:

(1)獲取狗驅動程式安裝資訊介面函式getdogdriverinfo,定義如下:

int pascal getdogdriverinfo();

引數:無

返回值:

0 沒有安裝驅動程式

1 驅動版本相同(並口和usb)

2 usb驅動版本相同

3 並口驅動版本相同

4 已安裝舊版本驅動 (並口和usb)

5 已安裝舊版本usb驅動

6 已安裝舊版本並口驅動

7 已安裝新版本驅動 (並口和usb)

8 已安裝新版本usb驅動

9 已安裝新版本並口驅動

3008 沒有管理員許可權

(2)驅動安裝的函式介面instdriver,定義如下:

int pascal instdriver(int iflag);

引數:

iflag = 1 只安裝usb狗驅動

iflag = 2 只安裝並口狗驅動

iflag = 3 安裝並口狗驅動和usb狗驅動

返回值:

如果執行成功則返回0,否則返回錯誤值。

(3)驅動解除安裝的函式介面uninstalldriver,定義如下:

int pascal uninstalldriver(int iflag);

引數:

iflag = 1 只解除安裝usb狗驅動

iflag = 2 只解除安裝並口狗驅動

iflag = 3 解除安裝並口狗驅動和usb狗驅動

返回值:

如果執行成功則返回0,否則返回錯誤值。

需要用到以下方法:

(1)dword winapi dogread (dword dwbytes,dword dwaddr,char *pdata);

函式返回0表示讀寫成功,其它返回值為錯誤**。

變數說明:

dword dwbytes:每次變換或讀寫操作的位元組數

char * pdata :指向變換操作緩衝區的資料指標

定義softdog類

首先定義乙個softdog的靜態類,靜態類的主要特點如下:

using system;

using system.runtime.interopservices;

namespace hcommon.license

[structlayout(layoutkind.sequential)]

public

static

class

softdog

然後,使用dllimport引入使用到的dll方法,因為引數和返回值都很不友好,所以定義為private,不直接向外部公開。

///

///獲取狗驅動程式安裝資訊介面函式getdogdriverinfo

///[dllimport("softdogsetup.dll", charset = charset.ansi)]

private

static

extern

ushort getdogdriverinfo();

///

///驅動安裝的函式介面instdriver

///[dllimport("softdogsetup.dll", charset = charset.ansi)]

private

static

extern

ushort instdriver(ushort flag);

///

///驅動解除安裝的函式介面uninstalldriver

///[dllimport("softdogsetup.dll", charset = charset.ansi)]

private

static

extern

ushort uninstalldriver(ushort flag);

///

///讀取加密狗單函式介面dogread

///[dllimport("win32dll.dll", charset = charset.ansi)]

private

static

extern

uint dogread(uint length, uint startindex, byte data);

然後,定義加密狗驅動相關的public方法

public

static

bool driverinstalled

get

ushort code = getdogdriverinfo();

if (code == 3008) throw

new hcommon.hexception(":沒有管理員許可權!", 3008);

if (code == 1 || code == 2 || code == 7 || code == 8) return

true;

return

false;

public

static

void installdriver()

ushort code = getdogdriverinfo();

if (code == 3008) throw

new hcommon.hexception(":沒有管理員許可權!", 3008);

if (code == 1 || code == 2 || code == 7 || code == 8) return;

if (code == 4 || code == 5)

uninstalldriver();

code = instdriver(1);

if (code != 0) throw

new hcommon.hexception(":安裝驅動失敗!", code);

public

static

void uninstalldriver()

ushort code = uninstalldriver(1);

if (code != 0) throw

new hcommon.hexception(":解除安裝驅動失敗!", code);

最後,定義讀取加密狗序列號的public方法

public

static

string serialnumber

get

uint code = 0;

byte data = new

byte[100];

code = dogread(0, 0, data);

if (code != 0)

throw

new hcommon.hexception(":讀取序列號失敗!", code);

uint sn = bitconverter.touint32(data, 0);

return sn.tostring();

使用softdog類

使用softdog的客戶程式**片段:

//軟體啟動時先判斷是否安裝加密狗驅動

if (!softdog.driverinstalled)

softdog.installdriver();

messagebox.show("已安裝加密狗驅動,請插入加密狗。");

//定義序列號屬性

private static

readonly

string g_key = "12345678";

private

string serialnumber

get

try

string sn = softdog.serialnumber;

if (string.isnullorempty(sn)) return

string.empty;

return sn;

catch (exception ex)

return

string.empty;

//序列號判斷的方法

private

void checklicense()

if (serialnumber != g_key)

messagebox.show("對不起,計算機必須插入正確的加密狗,軟體才能授權使用,請按確定退出系統。");

另外,軟體執行時也應該定期地檢查序列號,當發現加密狗已被拔出時終止軟體的使用。需要定義乙個timer,每隔2分鐘呼叫一次checklicense方法即可。

用C 開發加密狗程式

一些商務管理軟體,為了防止盜版,經常使用加密狗將軟體加密。下面的兩個例項將介紹如何將密碼寫入加密狗及利用加密狗來設計加密程式。在使用加密狗時,需要向加密狗中寫入或讀取資料。例如,將密碼寫入或讀取加密狗,如何實現呢?執行本例,在文字框中設定密碼後,單擊 寫入 按鈕,即可將設定的密碼寫入加密狗,成功寫入...

用C 開發加密狗程式

一些商務管理軟體,為了防止盜版,經常使用加密狗將軟體加密。下面的兩個例項將介紹如何將密碼寫入加密狗及利用加密狗來設計加密程式。在使用加密狗時,需要向加密狗中寫入或讀取資料。例如,將密碼寫入或讀取加密狗,如何實現呢?執行本例,在文字框中設定密碼後,單擊 寫入 按鈕,即可將設定的密碼寫入加密狗,成功寫入...

用C 開發加密狗程式

一些商務管理軟體,為了防止盜版,經常使用加密狗將軟體加密。下面的兩個例項將介紹如何將密碼寫入加密狗及利用加密狗來設計加密程式。在使用加密狗時,需要向加密狗中寫入或讀取資料。例如,將密碼寫入或讀取加密狗,如何實現呢?執行本例,在文字框中設定密碼後,單擊 寫入 按鈕,即可將設定的密碼寫入加密狗,成功寫入...