Windows序列號(hào)生成器
VMProtect 是新一代軟件盜版保護(hù)解決方案。VMProtect 是目前強(qiáng)大的反盜版解決方案之一,許多領(lǐng)先的軟件發(fā)行商都在使用它。VMProtect允許保護(hù)可執(zhí)行文件(EXE,SCR),動(dòng)態(tài)鏈接庫(kù)(DLL,OCX,BPL)和驅(qū)動(dòng)程序(SYS)。
加密解密技術(shù)交流群(766135708)
Windows 密鑰生成器是用于 x86 和 x64 平臺(tái)的 DLL 文件、一個(gè) C 語(yǔ)言頭文件和一個(gè) MSVC 兼容的庫(kù)文件。因此,庫(kù)既可以靜態(tài)鏈接也可以動(dòng)態(tài)加載。生成器的所有文件都位于Keygen\DLL文件夾中。生成序列號(hào)的測(cè)試應(yīng)用程序也在那里。
生成器 API
生成器僅導(dǎo)出兩個(gè)函數(shù):第一個(gè)函數(shù)生成一個(gè)序列號(hào),而第二個(gè)函數(shù)釋放第一個(gè)函數(shù)分配的內(nèi)存。讓我們從第一個(gè)開始:
VMProtectErrors __stdcall VMProtectGenerateSerialNumber ( VMProtectProductInfo * pProductInfo, VMProtectSerialNumberInfo * pSerialInfo, char ** pSerialNumber );第一個(gè)參數(shù)是指向VMProtect ProductInfo結(jié)構(gòu)的指針,其內(nèi)容已上傳到 VMProtect(請(qǐng)參閱導(dǎo)出產(chǎn)品參數(shù))。該結(jié)構(gòu)包含產(chǎn)品使用的算法和產(chǎn)品的標(biāo)識(shí)符號(hào)。
第二個(gè)參數(shù)是指向VMProtectSerialNumberInfo結(jié)構(gòu)的指針,其內(nèi)容被移動(dòng)到生成的序列號(hào)中。該結(jié)構(gòu)包含序列號(hào)的所有字段和定義應(yīng)將哪些字段寫入序列號(hào)的位掩碼。
struct VMProtectSerialNumberInfo { INT flags; wchar_t * pUserName; wchar_t * pEMail; DWORD dwExpDate; DWORD dwMaxBuildDate; BYTE nRunningTimeLimit; char * pHardwareID; size_t nUserDataLength; BYTE * pUserData; };flags字段包VMProtectSerialNumberFlags中的位標(biāo)志,該集合在結(jié)構(gòu)之前進(jìn)行了描述:
- HAS_USER_NAME – 將pUserName變量中的用戶名放入序列號(hào)中。
- HAS_EMAIL – 將pEMail變量中的電子郵件放入序列號(hào)中。
- HAS_EXP_DATE – 序列號(hào)將在dwExpDate變量中指定的日期之后過(guò)期。
- HAS_MAX_BUILD_DATE – 序列號(hào)僅適用于在dwMaxBuildDate變量中指定的日期之前構(gòu)建的產(chǎn)品版本 。
- HAS_TIME_LIMIT – 程序在nRunningTimeLimit變量指定的時(shí)間到期后停止工作(時(shí)間以分鐘為單位指定,不應(yīng)超過(guò) 255)。
- HAS_HARDWARE_ID – 該程序僅適用于具pHardwar變量中指定的 ID 的硬件。
- HAS_USER_DATA – 將nUserDataLength長(zhǎng)度的自定義用戶數(shù)據(jù)放在pUserData的地址到序列號(hào)。
第三個(gè)參數(shù)是指向指針的指針。生成的序列號(hào)的地址寫在那里。生成序列號(hào)后,應(yīng)該復(fù)制它,地址必須傳遞給生成器的第二個(gè) API 函數(shù),該函數(shù)將釋放序列號(hào)占用的內(nèi)存。
void __stdcall VMProtectFreeSerialNumberMemory ( char * pSerialNumber);
VMProtectGenerateSerialNumber函數(shù)返回一個(gè)VMProtectErrors值,如果成功生成序列號(hào),則該值包含 0,或者包含一個(gè)錯(cuò)誤代碼。可能的錯(cuò)誤代碼是:
- ALL_RIGHT – 沒有錯(cuò)誤,序列號(hào)已生成。
- UNSUPPORTED_ALGORITHM – 在函數(shù)的第一個(gè)參數(shù)中傳遞了不正確的密鑰加密算法。
- UNSUPPORTED_NUMBER_OF_BITS – 在函數(shù)的第一個(gè)參數(shù)中傳遞了不正確的位數(shù)。
- USER_NAME_IS_TOO_LONG – UTF-8 編碼的用戶名長(zhǎng)度超過(guò) 255 字節(jié)。
- EMAIL_IS_TOO_LONG – UTF-8 編碼的用戶電子郵件的長(zhǎng)度超過(guò) 255 字節(jié)。
- USER_DATA_IS_TOO_LONG – 用戶數(shù)據(jù)的長(zhǎng)度超過(guò) 255 字節(jié)。
- HWID_HAS_BAD_SIZE – 硬件標(biāo)識(shí)符的大小不正確。
- PRODUCT_CODE_HAS_BAD_SIZE – 在函數(shù)的第一個(gè)參數(shù)中傳遞的產(chǎn)品標(biāo)識(shí)符大小不正確。
- SERIAL_NUMBER_TOO_LONG – 序列號(hào)太長(zhǎng),無(wú)法滿足算法中指定的位數(shù)。
- BAD_PRODUCT_INFO – 函數(shù)的第一個(gè)參數(shù)不正確或?yàn)?NULL。
- BAD_SERIAL_NUMBER_INFO – 函數(shù)的第二個(gè)參數(shù)不正確或?yàn)?NULL。
- BAD_SERIAL_NUMBER_CONTAINER – 該函數(shù)的第三個(gè)參數(shù)未指向要寫入序列號(hào)地址的內(nèi)存。
- NOT_EMPTY_SERIAL_NUMBER_CONTAINER – 函數(shù)的第三個(gè)參數(shù)不指向空內(nèi)存單元,該單元必須為 NULL。
- BAD_PRIVATE_EXPONENT – 函數(shù)的第一個(gè)參數(shù)包含不正確的私有指數(shù)值。
- BAD_MODULUS – 函數(shù)的第一個(gè)參數(shù)包含不正確的模數(shù)值。
錯(cuò)誤可以分為兩類:由不正確的參數(shù)或第一個(gè)參數(shù)的不正確值引起的錯(cuò)誤,以及其他所有錯(cuò)誤。第一類錯(cuò)誤很少見,它們表示結(jié)構(gòu)配置不正確。您應(yīng)該重新上傳產(chǎn)品信息并檢查結(jié)構(gòu)是否填寫正確??梢栽谙旅嬲业秸_填充結(jié)構(gòu)的示例。
第二類錯(cuò)誤是由于嘗試向鍵中放入超過(guò)其大小所能容納的更多數(shù)據(jù)而引起的。在這種情況下,我們建議向電子商務(wù)提供商發(fā)送一條消息,其中包含“密鑰將在 24 小時(shí)內(nèi)發(fā)送”之類的文本,而不是實(shí)際的序列號(hào),并將所有必需的信息發(fā)送到您自己的電子郵箱。在這種情況下,密鑰是在 VMProtect 中手動(dòng)生成的,一些數(shù)據(jù)被截?cái)嘁赃m應(yīng)最大密鑰大小的所有關(guān)鍵信息。
使用示例
下面是調(diào)用上述函數(shù)并生成序列號(hào)的代碼示例。注意最開始的代碼塊。在您將其替換為從 VMProtect 為您的產(chǎn)品導(dǎo)出的示例之前,該示例將不起作用:
////////////////////////////////////////////////////////////////////////// // !!! this block should be generated by VMProtect !!! /// ////////////////////////////////////////////////////////////////////////// VMProtectAlgorithms g_Algorithm = ALGORITHM_RSA; size_t g_nBits = 0; byte g_vModulus[1]; byte g_vPrivate[1]; byte g_vProductCode[1]; ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// int _tmain(int argc, _TCHAR* argv[]) { VMProtectProductInfo pi; pi.algorithm = g_Algorithm; pi.nBits = g_nBits; pi.nModulusSize = sizeof(g_vModulus); pi.pModulus = g_vModulus; pi.nPrivateSize = sizeof(g_vPrivate); pi.pPrivate = g_vPrivate; pi.nProductCodeSize = sizeof(g_vProductCode); pi.pProductCode = g_vProductCode; VMProtectSerialNumberInfo si = {0}; si.flags = HAS_USER_NAME | HAS_EMAIL; si.pUserName = L"John Doe"; si.pEMail = L"john@doe.com"; char * pBuf = NULL; VMProtectErrors res = VMProtectGenerateSerialNumber(&pi, &si, &pBuf); if (res == ALL_RIGHT) { printf("Serial number:\n%s\n", pBuf); VMProtectFreeSerialNumberMemory(pBuf); } else { printf("Error: %d\n", res); } return 0;
這是來(lái)自Keygen\DLL\Example的 Microsoft Visual Studio 示例項(xiàng)目。下面是代碼中最有趣的部分以及我們的評(píng)論。
main函數(shù)的第一行使用從 VMProtect 導(dǎo)出的數(shù)據(jù)填充VMProtectProductInfo結(jié)構(gòu)。此代碼是典型的,不應(yīng)更改以避免錯(cuò)誤。然后我們創(chuàng)建VMProtectSerialNumberInfo結(jié)構(gòu)并將用戶名和電子郵件的位組合插入標(biāo)志字段。在下一行中,我們將用戶名和密碼放入結(jié)構(gòu)中的相應(yīng)字段。請(qǐng)注意,值在 UNICODE 編碼中被接受。密鑰生成器會(huì)將它們轉(zhuǎn)換為 UTF-8。
然后,我們初始化一個(gè)指針變量,用于存儲(chǔ)生成的密鑰的地址,并調(diào)用VMProtectGenerateSerialNumber,然后分析返回碼。如果沒有錯(cuò)誤,生成的密鑰將輸出到控制臺(tái),并調(diào)用免費(fèi)序列號(hào)記憶功能。
VMprotect SerialNumberInfo 結(jié)構(gòu)的其余字段
結(jié)構(gòu)的某些字段可能需要一些額外的解釋。例如,dwExpDate和dwMaxBuildDate字段包含特定格式的日期:0xYYYYMMDD,即年存儲(chǔ)在高位字中,月和日分別存儲(chǔ)在低位字的高低字節(jié)中。為了產(chǎn)生這樣的數(shù)字,使用了以下宏:MAKEDATE(y, m, d)。您可以這樣稱呼它:MAKEDATE(2010, 05, 12)。pHardwareID字段應(yīng)包含指向許可 SDK的VMProtectGetCurrentHWID方法返回的字符串的指針。