加密解密软件VMProtect教程(四):准备项目之SDK功能
VMProtect 是保护应用程序代码免遭分析和破解的可靠工具,但只有在正确构建应用程序内保护机制并且没有可能破坏整个保护的典型错误的情况下才能最有效地使用。SDK 功能可以集成到受保护应用程序的源代码中,以设置受保护区域的边界,以检测调试器或虚拟化工具。
VMProtect 是保护应用程序代码免遭分析和破解的可靠工具,但只有在正确构建应用程序内保护机制并且没有可能破坏整个保护的典型错误的情况下才能最有效地使用。
SDK 功能可以集成到受保护应用程序的源代码中,以设置受保护区域的边界,以检测调试器或虚拟化工具。
代码标记
- VMProtectBegin
- VMProtectBeginVirtualization
- VMProtectBeginMutation
- VMProtectBeginUltra
- VMProtectBeginVirtualizationLockByKey
- VMProtectBeginUltraLockByKey
- VMProtectEnd
服务功能
- VMProtectIsProtected
- VMProtectIsDebuggerPresent
- VMProtectIsVirtualMachinePresent
- VMProtectIsValidImageCRC
- VMProtectDecryptStringA
- VMProtectDecryptStringW
- VMProtectFreeString
许可功能
- VMProtectSetSerialNumber
- VMProtectGetSerialNumberState
- VMProtectGetSerialNumberData
- VMProtectGetCurrentHWID
VMProtectBegin
void VMProtectBegin(const char *MarkerName);
识别代码保护区域的开始的标记,必须在受保护代码块的第一个命令(或过程或函数调用)之前调用 VMProtectBegin。MarkerName 定义标记的名称,类似于 VMProtect 中的“VMProtectMarker”+MarkerName。例如,标记 VMProtectBegin('CheckRegistration') 将看起来像 VMProtectMarker “CheckRegistration”。如果未设置标记的名称,则以“VMProtectMarker”+marker_serial_number 的形式为其指定一个唯一名称。你可以在 VMProtect 中设置给定受保护块的编译类型。
VMProtectBeginVirtualization
void VMProtectBeginVirtualization(const char *MarkerName);
识别具有预定义 "虚拟化 "编译类型的代码保护区域的开始的标记。MarkerName 定义了标记的名称,在进一步使用 VMProtect 期间,无法更改此标记的编译类型。
VMProtectBeginMutation
void VMProtectBeginMutation(const char *MarkerName);
识别具有预定 "突变 "编译类型的代码保护区域的开始的标记。MarkerName 定义了标记的名称,在进一步使用 VMProtect 期间,无法更改此标记的编译类型
VMProtectBeginUltra
void VMProtectBeginUltra(const char *MarkerName);
识别预定义的“超(虚拟化+变异)”编译类型标识代码保护区开始的标记。MarkerName 定义标记的名称。在进一步使用 VMProtect 期间,无法更改此标记的编译类型。
VMProtectBeginVirtualizationLockByKey
void VMProtectBeginVirtualizationLockByKey(const char *MarkerName);
使用预定义的“虚拟化”编译类型和启用“锁定到密钥”选项标识代码保护区开始的标记。MarkerName 定义标记的名称。在进一步使用 VMProtect 期间,无法更改此标记的编译类型。
VMProtectBeginUltraLockByKey
void VMProtectBeginUltraLockByKey(const char *MarkerName);
使用预定义的“虚拟化”编译类型和启用“锁定到密钥”选项标识代码保护区开始的标记。MarkerName 定义标记的名称。在进一步使用 VMProtect 期间,无法更改此标记的编译类型。
VMProtectEnd
void VMProtectEnd(void);
识别代码保护区结束的标记。对 VMProtectEnd 的调用必须放在受保护代码块的最后一个命令(过程或函数调用)之后。
VMProtectIsProtected
bool VMProtectIsProtected(void);
如果文件由 VMProtect 处理,则 MProtectIsProtected 函数返回 True。
VMProtectIsDebuggerPresent
bool VMProtectIsDebuggerPresent(bool CheckKernelMode);
VMProtectIsDebuggerPresent函数允许检测应用程序在调试器下的启动。结果(真/假)可以被应用内保护机制处理。如果CheckKernelMode=False,该函数检查用户模式的调试器(OllyDBG, WinDBG等)。如果CheckKernelMode=True,用户模式和内核模式的调试器(SoftICE,Syser等)。当保护驱动时,CheckKernelMode的值没有意义,因为驱动总是在内核模式下工作,所以内核模式调试器的存在总是被检查。
VMProtectIsVirtualMachinePresent
bool VMProtectIsVirtualMachinePresent(void);
VMProtectIsVirtualMachinePresent函数允许检测应用程序在虚拟机工具下的启动: VMware, Virtual PC, VirtualBox, Sandboxie. 结果(真/假)可以用应用内保护机制来处理。
VMProtectIsValidImageCRC
bool VMProtectIsValidImageCRC(void);
VMProtectIsValidImageCRC函数检测可执行模块在进程的内存中被改变的事实(只检查不可改变的代码和数据段)。结果(真/假)可以用应用内保护机制来处理。
VMProtectDecryptStringA
const char * VMProtectDecryptStringA(const char *Value);
VMProtectDecryptStringA函数解密了ANSI字符串常量--Value。要解密常数,你必须把它列入受保护对象的列表中。
VMProtectDecryptStringW
const wchar_t * VMProtectDecryptStringW(const wchar_t *Value);
VMProtectDecryptStringW函数对Unicode字符串常数--Value进行解密。要解密该常量,你必须将其纳入受保护对象的列表中。
VMProtectFreeString
bool VMProtectFreeString(const void *Value);
VMProtectFreeString 函数释放为解密字符串分配的动态内存。释放内存不是必须的,但如果你这样做 – 你必须使用此功能。如果 VMProtectDecryptStringA/VMProtectDecryptStringW 第二次使用相同的参数而不破坏先前解密的字符串,则不会分配额外的内存。
以上便是本篇文章的分享,有感兴趣的小伙伴,可以私我了解~
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)