史萊姆論壇

返回   史萊姆論壇 > 教學文件資料庫 > 系統 & 硬體安裝及故障判斷技術文件
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


 
 
主題工具 顯示模式
舊 2006-05-25, 03:56 PM   #1
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 軟體 - WIN下動態註冊碼實現方法

WIN下動態註冊碼實現方法 加文章作者:病毒

WIN下動態註冊碼實現方法:

作者:病毒

  所謂的動態註冊碼就是軟體在不同的機器執行時註冊碼將不同。此做法的好處在於不可能以同一註冊碼註冊不同電腦上的軟體。這樣就提高了軟體的安全保密性。這種方法已被普遍運用,下面就以我用C++ Builder寫的一個程序為列,介紹一下實現原理。

   獲取CPU訊息用於註冊,不同廠商的CPU其訊息也將不同,下面只用了一個修訂本ID,可以考慮將結構中所有訊息做運算。

   獲取CPU訊息用WINAPI的GetSystemInfo函數。 該函數執行後將填充SYSTEM_INFO結構。其結構如下:

VOID GetSystemInfo(

LPSYSTEM_INFO lpSystemInfo // address of system information structure

);

Parameters

lpSystemInfo

Points to a SYSTEM_INFO structure to be filled in by this function.

typedef struct _SYSTEM_INFO { // sinf

union {

DWORD dwOemId;

struct {

WORD wProcessorArchitecture;

WORD wReserved;

};

};

DWORD dwPageSize;

LPVOID lpMinimumApplicationAddress;

LPVOID lpMaximumApplicationAddress;

DWORD dwActiveProcessorMask;

DWORD dwNumberOfProcessors;

DWORD dwProcessorType;

DWORD dwAllocationGranularity;

WORD wProcessorLevel;

WORD wProcessorRevision; //我們所用到的

} SYSTEM_INFO;

   當硬碟格式化時會隨機填寫邏輯硬碟的序列號,因是隨機填寫相同的序列號的可能性微乎其微。再加上CPU訊息 和最後對兩個值做的運算,這樣就可以實現在不同機上得到不同的註冊號。用WINAPI的GetVolumeInformation函數得到邏輯序列號,其原形如下:

   BOOL GetVolumeInformation(

LPCTSTR lpRootPathName, // address of root directory of the file system LPTSTR lpVolumeNameBuffer, // address of name of the volume

DWORD nVolumeNameSize, // length of lpVolumeNameBuffer

LPDWORD lpVolumeSerialNumber, // address of volume serial number

LPDWORD lpMaximumComponentLength, // address of system's maximum

filename length

LPDWORD lpFileSystemFlags, // address of file system flags

LPTSTR lpFileSystemNameBuffer, // address of name of file system

DWORD nFileSystemNameSize // length of lpFileSystemNameBuffer

);

   從上看我們只關心第四個參數返回邏輯硬碟序列號。我們將主功能做成DLL形式在應用程式中使用 這樣使用起來即方便,又提高了安全性。具體程序如下:

.H文件

private: // User declarations

DWORD (WINAPI *GetCurrentHostSeriaNumber)(void); //宣告函數游標

.CPP文件

HINSTANCE DLLinst=LoadLibrary("GetSeria"); //動態使用DLL文件

if(DLLinst) { GetCurrentHostSeriaNumber=(DWORD(WINAPI *)(void)) GetProcAddress(DLLinst,"GetCurrentHostSeriaNumber"); //獲取DLL中的函數 if(GetCurrentHostSeriaNumber)

{

DWORD RegNumber=GetCurrentHostSeriaNumber(); //執行並返回註冊碼 if(String(RegNumber)==Edit1->Text) //與輸入進行比較

ShowMessage("註冊碼正確");

else ShowMessage("註冊碼錯誤");

}

else ShowMessage("DLL中函數錯誤");

} else ShowMessage("GetSeria.dll不在當前目錄下");

.DLL文件

extern "C" __declspec(dllexport) DWORD WINAPI GetCurrentHostSeriaNumber(void); 以標準C方式宣告函數使用方法

int WINAPI DllEntryPoint(HINSTANCE, unsigned long , void*)

{

return 1;

}

DWORD WINAPI GetCurrentHostSeriaNumber(void)

{

SYSTEM_INFO info;

DWORD SeriaNumber=NULL;

DWORD Register=NULL;

GetSystemInfo(&info); //使用函數填SYSTEM_INFO結構 GetVolumeInformation("C:\\",NULL,NULL,&SeriaNumber,NULL,NULL,NULL,NULL)

; //獲取C碟序列號

Register=SeriaNumber+info.wProcessorRevision;

Register=Register^7609926; //相加後最異或運算

return Registet;

}

   此程序雖是一個簡單的DEMO,但稍微加工就可以為商品軟體所用。再此說一下硬碟序列號分為兩中1邏輯磁牒序列號,2物理硬碟 序列號。後者是硬碟出廠時所固定唯一程式碼,如在DOS下可以直接通過IN,OUT讀寫連接阜來獲取,但WIN下就須寫VXD來實現此操作。 思法和實現方法已經指出。再具體的自己來做吧
為IE收藏 · 收藏主題
__________________
http://bbsimg.qianlong.com/upload/01/08/29/68/1082968_1136014649812.gif
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
 



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 02:49 AM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1