|
論壇說明 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2006-05-25, 03:56 PM | #1 |
榮譽會員
|
軟體 - 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收藏 · 收藏主題 |
__________________ |
|
送花文章: 3,
|