翻译|使用教程|编辑:安雯斯|2023-05-29 16:35:12.060|阅读 152 次
概述: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@cahobeh.cn