原創(chuàng)|使用教程|編輯:胡濤|2023-06-13 14:42:06.130|閱讀 346 次
概述:本文介紹在vmprotect中使用秘鑰生成器,歡迎查閱~
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
VMProtect是新一代軟件保護(hù)實(shí)用程序。VMProtect支持德爾菲、Borland C Builder、Visual C/C++、Visual Basic(本機(jī))、Virtual Pascal和XCode編譯器。
同時(shí),VMProtect有一個(gè)內(nèi)置的反匯編程序,可以與Windows和Mac OS X可執(zhí)行文件一起使用,并且還可以鏈接編譯器創(chuàng)建的MAP文件,以快速選擇要保護(hù)的代碼片段。
為了輕松實(shí)現(xiàn)應(yīng)用程序保護(hù)任務(wù)的自動化,VMProtect實(shí)現(xiàn)了內(nèi)置腳本語言。VMProtect完全支持Windows系列的32/64位操作系統(tǒng)(從Windows 2000開始)和Mac OSX(從版本10.6開始)。重要的是,無論目標(biāo)平臺如何,VMProtect都支持所有范圍的可執(zhí)行文件,即Windows版本可以處理Mac OS X版本的文件,反之亦然。
VMProtect 是保護(hù)應(yīng)用程序代碼免遭分析和破解的可靠工具,但只有在正確構(gòu)建應(yīng)用程序內(nèi)保護(hù)機(jī)制并且沒有可能破壞整個(gè)保護(hù)的典型錯誤的情況下才能最有效地使用。
有什么用?
除了 VMProtect,其他軟件也可以生成序列號。這是自動發(fā)送序列號所必需的。客戶購買產(chǎn)品,電子商務(wù)代理向供應(yīng)商網(wǎng)站發(fā)送 HTTP 查詢,生成器在服務(wù)器上運(yùn)行并根據(jù)客戶數(shù)據(jù)生成序列號。序列號被發(fā)送給客戶和供應(yīng)商。然后,供應(yīng)商使用導(dǎo)入許可證對話框手動將序列號添加到 VMProtect。
怎么運(yùn)行
VMProtect 的許可系統(tǒng)基于非對稱算法,這就是為什么需要秘密產(chǎn)品密鑰來生成序列號的原因。您可以在項(xiàng)目屬性窗口中導(dǎo)出此密鑰,并以任何合適的方式將其傳遞給生成器。
電子商務(wù)代理使用 HTTP 查詢調(diào)用生成器。可以直接調(diào)用 PHP 生成器,基于 DLL 的生成器 - 間接調(diào)用,但原理是相同的:
有現(xiàn)成的序列號產(chǎn)生器么?
許可系統(tǒng)帶有三個(gè)隨時(shí)可用的序列號生成器作為 DLL,用于 .Net 平臺和PHP。
是否可以自己創(chuàng)建?
是的你可以。序列號的格式在這里,序列號的加密算法在這里描述。
安全嗎?
一般來說,可以,但是,您應(yīng)循以下建議:
Windows 密鑰生成器是用于 x86 和 x64 平臺的 DLL 文件、一個(gè) C 語言頭文件和一個(gè) MSVC 兼容的庫文件。因此,庫既可以靜態(tài)鏈接也可以動態(tài)加載。
生成器的所有文件都位于Keygen\DLL文件夾中。生成序列號的測試應(yīng)用程序也在那里。
生成器 API
生成器僅導(dǎo)出兩個(gè)函數(shù):第一個(gè)函數(shù)生成一個(gè)序列號,而第二個(gè)函數(shù)釋放第一個(gè)函數(shù)分配的內(nèi)存。讓我們從第一個(gè)也是主要的開始:
VMProtectErrors __stdcall VMProtectGenerateSerialNumber ( VMProtectProductInfo * pProductInfo, VMProtectSerialNumberInfo * pSerialInfo, char ** pSerialNumber );
第一個(gè)參數(shù)是指向VMProtectProductInfo結(jié)構(gòu)的指針,其內(nèi)容已上傳到 VMProtect(請參閱導(dǎo)出產(chǎn)品參數(shù))。該結(jié)構(gòu)包含產(chǎn)品私鑰、使用的算法和產(chǎn)品的標(biāo)識符。有關(guān)填充此結(jié)構(gòu)的更多詳細(xì)信息如下。
第二個(gè)參數(shù)是指向VMProtectSerialNumberInfo結(jié)構(gòu)的指針,其內(nèi)容被移動到生成的序列號中。該結(jié)構(gòu)包含序列號的所有字段和定義應(yīng)將哪些字段寫入序列號的位掩碼。
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)行了描述:
第三個(gè)參數(shù)是指向指針的指針。生成的序列號的地址寫在那里。生成序列號后,應(yīng)該復(fù)制它,地址必須傳遞給生成器的第二個(gè) API 函數(shù),該函數(shù)將釋放序列號占用的內(nèi)存。
void __stdcall VMProtectFreeSerialNumberMemory ( char * pSerialNumber);
VMProtectGenerateSerialNumber函數(shù)返回一個(gè)VMProtectErrors值,如果成功生成序列號,則該值包含 0,或者包含一個(gè)錯誤代碼。可能的錯誤代碼是:
錯誤可以分為兩類:由不正確的參數(shù)或第一個(gè)參數(shù)的不正確值引起的錯誤,以及其他所有錯誤。第一類錯誤很少見,它們表示結(jié)構(gòu)配置不正確。您應(yīng)該重新上傳產(chǎn)品信息并檢查結(jié)構(gòu)是否填寫正確。可以在下面找到正確填充結(jié)構(gòu)的示例。
第二類錯誤是由于嘗試向鍵中放入超過其大小所能容納的更多數(shù)據(jù)而引起的。在這種情況下,我們建議向電子商務(wù)提供商發(fā)送一條消息,其中包含“密鑰將在 24 小時(shí)內(nèi)發(fā)送”之類的文本,而不是實(shí)際的序列號,并將所有必需的信息發(fā)送到您自己的電子郵箱。在這種情況下,密鑰是在 VMProtect 中手動生成的,一些數(shù)據(jù)被截?cái)嘁赃m應(yīng)最大密鑰大小的所有關(guān)鍵信息。
使用示例
下面是調(diào)用上述函數(shù)并生成序列號的代碼示例。注意最開始的代碼塊。在您將其替換為從 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;
這是來自Keygen\DLL\Example的 Microsoft Visual Studio 示例項(xiàng)目。下面是代碼中最有趣的部分以及我們的評論。
main函數(shù)的第一行使用從 VMProtect 導(dǎo)出的數(shù)據(jù)填充VMProtectProductInfo結(jié)構(gòu)。此代碼是典型的,不應(yīng)更改以避免錯誤。然后我們創(chuàng)建VMProtectSerialNumberInfo結(jié)構(gòu)并將用戶名和電子郵件的位組合插入標(biāo)志字段。在下一行中,我們將用戶名和密碼放入結(jié)構(gòu)中的相應(yīng)字段。請注意,值在 UNICODE 編碼中被接受。密鑰生成器會將它們轉(zhuǎn)換為 UTF-8。
然后,我們初始化一個(gè)指針變量,用于存儲生成的密鑰的地址,并調(diào)用VMProtectGenerateSerialNumber,然后分析返回碼。如果沒有錯誤,生成的密鑰將輸出到控制臺,并調(diào)用免費(fèi)序列號記憶功能。
VMprotectSerialNumberInfo 結(jié)構(gòu)的其余字段
結(jié)構(gòu)的某些字段可能需要一些額外的解釋。例如,dwExpDate和dwMaxBuildDate字段包含特定格式的日期:0xYYYYMMDD,即年存儲在高位字中,月和日分別存儲在低位字的高低字節(jié)中。為了產(chǎn)生這樣的數(shù)字,使用了以下宏:MAKEDATE(y, m, d)。您可以這樣稱呼它:MAKEDATE(2010, 05, 12)。
pHardwareID字段應(yīng)包含指向許可 SDK的VMProtectGetCurrentHWID方法返回的字符串的指針。
.Net密鑰生成器 是包含生成序列號所需的所有內(nèi)容的構(gòu)建。源代碼在Keygen\Net中作為兩個(gè)項(xiàng)目:KeyGen(密鑰生成器本身)和 Usage(密鑰生成器的使用示例)。
密鑰生成器在源代碼中提供,以便在給定版本的 .Net Framework 下快速構(gòu)建,但是我們強(qiáng)烈建議不要對代碼應(yīng)用任何更改。在 VMProtect 的未來版本中,可能會向生成器添加一些新的可能性,這可能會導(dǎo)致重復(fù)修改代碼。此外,這可能會導(dǎo)致非常難以定位的錯誤。如果您在生成器的原始代碼中發(fā)現(xiàn)錯誤或想提出改進(jìn)建議,請聯(lián)系支持團(tuán)隊(duì)。
使用生成器
以Usage項(xiàng)目中的代碼為基礎(chǔ),然后將指向 VMProtect.KeyGen.dll 構(gòu)建的鏈接添加到您的項(xiàng)目中。之后,您將能夠在您的應(yīng)用程序中生成序列號。為了正常運(yùn)行,生成器必須“知道”您為哪個(gè)產(chǎn)品生成序列號。為此,在 VMProtect 中打開“Project | 導(dǎo)出密鑰對”對話框并選擇“KeyGen.Net 的參數(shù)”選項(xiàng)。下面的文本區(qū)域將包含文本信息,您應(yīng)該將其作為字符串常量復(fù)制并粘貼到您的應(yīng)用程序中。
下面是調(diào)用生成器的示例代碼:
try { string data = @""; // put the exported data here Generator g = new Generator(data); g.UserName = "John Doe"; g.EMail = "john@doe.com"; g.ExpirationDate = DateTime.Now.AddMonths(1); g.MaxBuildDate = DateTime.Now.AddYears(1); g.RunningTimeLimit = 15; g.HardwareID = "AQIDBAgHBgU="; g.UserData = new byte[] { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; string serial = g.Generate(); Console.WriteLine("Serial number:\n{0}\n", serial); } catch (Exception ex) { Console.WriteLine("Error: {0}", ex); }
您從 VMProtect 復(fù)制的字符串應(yīng)該放在作為參數(shù)傳遞給序列號類構(gòu)造函數(shù)的數(shù)據(jù)變量中。如果在解析產(chǎn)品數(shù)據(jù)時(shí)出現(xiàn)任何問題,構(gòu)造函數(shù)將拋出包含問題描述的異常。如果構(gòu)造函數(shù)成功完成其工作,則生成器已準(zhǔn)備好生成序列號。
序列號可以包含使用生成器屬性指定的各種信息。上面的示例顯示了如何填寫序列號的所有字段。某些領(lǐng)域有限制。例如,用戶名和電子郵件不能接受超過 255 個(gè)字符的 UTF-8 編碼字符串。如果提供的數(shù)據(jù)不正確,屬性會拋出包含問題描述的異常。
生成器設(shè)置完成后,將調(diào)用Generate()方法。此方法生成一個(gè)序列號。在此步驟中,將序列號的所有數(shù)據(jù)合并,計(jì)算校驗(yàn)和并加密數(shù)據(jù)。如果數(shù)據(jù)量超過允許的長度,該方法將拋出異常。
如果需要生成多個(gè)序列號,可以連續(xù)多次使用生成器類,而不需要從頭開始創(chuàng)建。要清除生成器的任何給定屬性,只需為其分配一個(gè)空值即可
UNIX 版本的密鑰生成器是一個(gè) PHP 文件,其中包含生成序列號所需的所有信息。該文件位于Keygen\PHP中。下面我們描述使用這種生成器的要點(diǎn)。
配置生成器
在 PHP 文件的開頭,設(shè)置代碼位于:
////////////////////////////////////////////////////////////////////////////////////////////// // The following lines should be generated by VMProtect License Manager $exported_algorithm = "RSA"; $exported_bits = 2048; $exported_private = "PJvj4kEpoQMIpYK+9wEt......xKeiSZgzdiln8Q=="; $exported_modulus = "rOlny/3QgZb/VmGr3CmY......I6ESAUmtQ+RBqQ=="; $exported_product_code = "oLQdGUn8kVk="; //////////////////////////////////////////////////////////////////////////////////////////////
此代碼由 VMProtect 自動生成(請參閱導(dǎo)出產(chǎn)品參數(shù))并且對于每個(gè)特定產(chǎn)品都是唯一的。準(zhǔn)確復(fù)制它至關(guān)重要,否則生成器將無法正常工作。
密鑰的內(nèi)容
生成器指定一個(gè)序列號的內(nèi)容。這些內(nèi)容在一個(gè)數(shù)組中指定,下面列出了密鑰的所有可能參數(shù)。然而,在實(shí)際應(yīng)用中,其中一些可能會被省略:
$params = array( user_name => "John Doe", // UTF-8! email => "john@doe.com", hwid => "vHGMdMRvGCPjWcCQ", // Exactly as returned by VMProtectGetCurrentHWID expire_date => array(year => 2009, month => 10, day => 1), maxbuild_date => array(year => 2009, month => 10, day => 1), time_limit => 10, user_data => base64_decode("CGCvRvMWcPHGdMjQ"), // string of bytes );
成功的密鑰生成處理函數(shù)
您可以在下面看到成功生成序列號時(shí)調(diào)用的最簡單的函數(shù)。發(fā)送給它的唯一參數(shù)是序列號字符串。該函數(shù)必須將序列號傳遞給調(diào)用者(電子商務(wù)代理),通常使用echo命令。為了方便起見,該字符串被初步拆分為每個(gè) 75 個(gè)符號的子字符串。此外,此功能可以通過電子郵件將生成的序列號發(fā)送給開發(fā)人員或?qū)⑵涮砑拥綌?shù)據(jù)庫中。
function OnSerialGenerated($serial) { $serial = wordwrap($serial, 75, "\n", true); echo $serial; }
密鑰生成器錯誤處理函數(shù)
需要我們注意的代碼的最后一部分是出現(xiàn)問題時(shí)調(diào)用的函數(shù)。此函數(shù)接收帶有錯誤消息的字符串,完成后調(diào)用die()函數(shù)。處理程序函數(shù)必須做兩件事:代替密鑰,向電子商務(wù)代理返回一條消息,說明將手動發(fā)送密鑰。并向開發(fā)人員發(fā)送有關(guān)錯誤的詳盡信息以修復(fù)它并手動生成密鑰。
function OnSerialGenerationFailed($details) { echo "You will receive serial number in the next 24 hours"; // message to the customer // mail("support@vendor.com", "Houston, we have a problem", $details); // message to vendor }
有幾種可能的錯誤原因:算法參數(shù)不正確,密鑰參數(shù)不正確,用戶名或電子郵件太長,或者序列號太長不適合算法中指定的位數(shù). 這就是為什么OnSerialGenerationFailed函數(shù)必須向開發(fā)人員發(fā)送有關(guān)該問題的詳細(xì)信息,以便他可以生成序列號并將其發(fā)送給客戶。
其他需要考慮的事情
示例包含密鑰生成器的簡化版本。它沒有考慮開發(fā)網(wǎng)絡(luò)生成器的建議。它不檢查調(diào)用方的 IP 地址,也不分析輸入?yún)?shù)。在開發(fā)自己的生成器時(shí)請注意這一點(diǎn)。
用戶名和電子郵件必須作為 UTF-8 字符串傳遞。確保您的電子商務(wù)代理以 UTF-8 編碼發(fā)送這些數(shù)據(jù),如果不是這樣,則對信息進(jìn)行轉(zhuǎn)碼。錯誤的編碼不會導(dǎo)致生成錯誤的序列號,但這樣的序列號顯示的注冊名可能與真實(shí)用戶名不同,所以他或她可能會在“關(guān)于”窗口中看到它時(shí)感到驚訝。應(yīng)用
非對稱加密是一個(gè)復(fù)雜的數(shù)學(xué)過程。如果使用純PHP實(shí)現(xiàn),沒有任何第三方庫,生成序列號可能需要幾十秒。生成器在可用時(shí)使用gmp_powm、bi_powmod、bcpowod函數(shù)。如果在您的主機(jī)上生成序列號的時(shí)間太長,我們建議要求主機(jī)提供商啟用這些功能。例如,gmp_powm函數(shù)的運(yùn)行速度是bcpowmod的十倍。
以上便是關(guān)于幾個(gè)秘鑰生成器的分享,如果您有任何疑問或者想獲取更多產(chǎn)品試用/授權(quán)/價(jià)格信息,可以咨詢我們的了解~
歡迎體驗(yàn)更多加密解密相關(guān)軟件或者加入我們技術(shù)交流群(766135708)
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn