翻譯|使用教程|編輯:安雯斯|2023-05-29 16:35:12.060|閱讀 245 次
概述:VMProtect是新一代軟件保護實用程序。本文分享VMProtect入門使用教程許可證部分,歡迎查閱~
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
VMProtect是新一代軟件保護實用程序。VMProtect支持德爾菲、Borland C Builder、Visual C/C++、Visual Basic(本機)、Virtual Pascal和XCode編譯器。
同時,VMProtect有一個內置的反匯編程序,可以與Windows和Mac OS X可執行文件一起使用,并且還可以鏈接編譯器創建的MAP文件,以快速選擇要保護的代碼片段。
為了輕松實現應用程序保護任務的自動化,VMProtect實現了內置腳本語言。VMProtect完全支持Windows系列的32/64位操作系統(從Windows 2000開始)和Mac OSX(從版本10.6開始)。重要的是,無論目標平臺如何,VMProtect都支持所有范圍的可執行文件,即Windows版本可以處理Mac OS X版本的文件,反之亦然。有其他問題請咨詢加密解密技術QQ群:766135708
VMProtect 是保護應用程序代碼免遭分析和破解的可靠工具,但只有在正確構建應用程序內保護機制并且沒有可能破壞整個保護的典型錯誤的情況下才能最有效地使用。
他們有什么用?
除了 VMProtect,其他軟件也可以生成序列號。這是自動發送序列號所必需的。客戶購買產品,電子商務代理向供應商網站發送 HTTP 查詢,生成器在服務器上運行并根據客戶數據生成序列號。序列號被發送給客戶和供應商。然后,供應商使用導入許可證對話框手動將序列號添加到 VMProtect。
怎么運行
VMProtect 的許可系統基于非對稱算法,這就是為什么需要秘密產品密鑰來生成序列號的原因。您可以在項目屬性窗口中導出此密鑰,并以任何合適的方式將其傳遞給生成器。
電子商務代理使用 HTTP 查詢調用生成器。可以直接調用 PHP 生成器,基于 DLL 的生成器 - 間接調用,但原理是相同的:
有現成的發電機嗎?
許可系統帶有三個隨時可用的序列號生成器作為 DLL,用于 .Net 平臺和PHP。
我可以制作自己的發電機嗎?
是的你可以。序列號的格式在這里,序列號的加密算法在這里描述。
安全嗎?
一般來說,是的,這是安全的。但是,您應該遵循以下建議:
描述
Windows 密鑰生成器是用于 x86 和 x64 平臺的 DLL 文件、一個 C 語言頭文件和一個 MSVC 兼容的庫文件。因此,庫既可以靜態鏈接也可以動態加載。
生成器的所有文件都位于Keygen\DLL文件夾中。生成序列號的測試應用程序也在那里。
生成器 API
生成器僅導出兩個函數:第一個函數生成一個序列號,而第二個函數釋放第一個函數分配的內存。讓我們從第一個也是主要的開始:
VMProtectErrors __stdcall VMProtectGenerateSerialNumber ( VMProtectProductInfo * pProductInfo, VMProtectSerialNumberInfo * pSerialInfo, char ** pSerialNumber );
第一個參數是指向VMProtectProductInfo結構的指針,其內容已上傳到 VMProtect(請參閱導出產品參數)。該結構包含產品私鑰、使用的算法和產品的標識符。有關填充此結構的更多詳細信息如下。
第二個參數是指向VMProtectSerialNumberInfo結構的指針,其內容被移動到生成的序列號中。該結構包含序列號的所有字段和定義應將哪些字段寫入序列號的位掩碼。
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中的位標志,該集合在結構之前進行了描述:
第三個參數是指向指針的指針。生成的序列號的地址寫在那里。生成序列號后,應該復制它,地址必須傳遞給生成器的第二個 API 函數,該函數將釋放序列號占用的內存。
void __stdcall VMProtectFreeSerialNumberMemory ( char * pSerialNumber);
VMProtectGenerateSerialNumber函數返回一個VMProtectErrors值,如果成功生成序列號,則該值包含 0,或者包含一個錯誤代碼。可能的錯誤代碼是:
錯誤可以分為兩類:由不正確的參數或第一個參數的不正確值引起的錯誤,以及其他所有錯誤。第一類錯誤很少見,它們表示結構配置不正確。您應該重新上傳產品信息并檢查結構是否填寫正確。可以在下面找到正確填充結構的示例。
第二類錯誤是由于嘗試向鍵中放入超過其大小所能容納的更多數據而引起的。在這種情況下,我們建議向電子商務提供商發送一條消息,其中包含“密鑰將在 24 小時內發送”之類的文本,而不是實際的序列號,并將所有必需的信息發送到您自己的電子郵箱。在這種情況下,密鑰是在 VMProtect 中手動生成的,一些數據被截斷以適應最大密鑰大小的所有關鍵信息。
使用示例
下面是調用上述函數并生成序列號的代碼示例。注意最開始的代碼塊。在您將其替換為從 VMProtect 為您的產品導出的示例之前,該示例將不起作用:
////////////////////////////////////////////////////////////////////////// // !!! 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 示例項目。下面是代碼中最有趣的部分以及我們的評論。
main函數的第一行使用從 VMProtect 導出的數據填充VMProtectProductInfo結構。此代碼是典型的,不應更改以避免錯誤。然后我們創建VMProtectSerialNumberInfo結構并將用戶名和電子郵件的位組合插入標志字段。在下一行中,我們將用戶名和密碼放入結構中的相應字段。請注意,值在 UNICODE 編碼中被接受。密鑰生成器會將它們轉換為 UTF-8。
然后,我們初始化一個指針變量,用于存儲生成的密鑰的地址,并調用VMProtectGenerateSerialNumber,然后分析返回碼。如果沒有錯誤,生成的密鑰將輸出到控制臺,并調用免費序列號記憶功能。
VMprotectSerialNumberInfo 結構的其余字段
結構的某些字段可能需要一些額外的解釋。例如,dwExpDate和dwMaxBuildDate字段包含特定格式的日期:0xYYYYMMDD,即年存儲在高位字中,月和日分別存儲在低位字的高低字節中。為了產生這樣的數字,使用了以下宏:MAKEDATE(y, m, d)。您可以這樣稱呼它:MAKEDATE(2010, 05, 12)。
pHardwareID字段應包含指向許可 SDK的VMProtectGetCurrentHWID方法返回的字符串的指針。
描述
密鑰生成器的 .Net 版本是包含生成序列號所需的所有內容的構建。源代碼在Keygen\Net中作為兩個項目:KeyGen(密鑰生成器本身)和 Usage(密鑰生成器的使用示例)。
密鑰生成器在源代碼中提供,以便在給定版本的 .Net Framework 下快速構建,但是我們強烈建議不要對代碼應用任何更改。在 VMProtect 的未來版本中,可能會向生成器添加一些新的可能性,這可能會導致重復修改代碼。此外,這可能會導致非常難以定位的錯誤。如果您在生成器的原始代碼中發現錯誤或想提出改進建議,請聯系支持團隊。
使用發電機
以Usage項目中的代碼為基礎,然后將指向 VMProtect.KeyGen.dll 構建的鏈接添加到您的項目中。之后,您將能夠在您的應用程序中生成序列號。為了正常運行,生成器必須“知道”您為哪個產品生成序列號。為此,在 VMProtect 中打開“Project | 導出密鑰對”對話框并選擇“KeyGen.Net 的參數”選項。下面的文本區域將包含文本信息,您應該將其作為字符串常量復制并粘貼到您的應用程序中。
下面是調用生成器的示例代碼:
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 復制的字符串應該放在作為參數傳遞給序列號類構造函數的數據變量中。如果在解析產品數據時出現任何問題,構造函數將拋出包含問題描述的異常。如果構造函數成功完成其工作,則生成器已準備好生成序列號。
序列號可以包含使用生成器屬性指定的各種信息。上面的示例顯示了如何填寫序列號的所有字段。某些領域有限制。例如,用戶名和電子郵件不能接受超過 255 個字符的 UTF-8 編碼字符串。如果提供的數據不正確,屬性會拋出包含問題描述的異常。
生成器設置完成后,將調用Generate()方法。此方法生成一個序列號。在此步驟中,將序列號的所有數據合并,計算校驗和并加密數據。如果數據量超過允許的長度,該方法將拋出異常。
如果需要生成多個序列號,可以連續多次使用生成器類,而不需要從頭開始創建。要清除生成器的任何給定屬性,只需為其分配一個空值即可
以上便是本篇文章的分享,如果您有任何疑問或者想獲取更多產品試用/授權/價格信息,可以咨詢我們的了解~
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn