一. 接口说明//开始保护处标记(对应于功能设置:反调试、内存保护等等)VMProtectBegin(const char *);//开始虚拟化代码处标记(包括保护设置)VMProtectBeginVirtualization(const char *);//开始变异代码处标记(包括保护设置)VMProtectBeginMutation(const char *);//开始虚拟+代码变异标记处VMProtectBeginUltra(const char *);VMProtectBeginVirtualizationLockByKey(const char *);VMProtectBeginUltraLockByKey(const char *);//保护结束处标记VMProtectEnd(void);//检测调试BOOL VMProtectIsDebuggerPresent(BOOL);//检测虚拟机BOOL VMProtectIsVirtualMachinePresent(void);//映像文件CRC校验BOOL VMProtectIsValidImageCRC(void);//解密被保护的名为字符串Achar * VMProtectDecryptStringA(const char *value);//解密被保护的名为字符串Wwchar_t * VMProtectDecryptStringW(const wchar_t *value);二. 使用方法1. 保护函数必须有始有终出现VMProtectBegin、VMProtectBeginVirtualization、VMProtectBeginMutation、VMProtectBeginUltra必须有相对应的VMProtectEnd结束。比如:void FunName(){VMProtectBegin(“FunName”); //最好用函数名,否则会出现重名冲突.....VMProtectEnd();}2. 保护的单元是函数,而不是整个EXE代码比如://不保护void fun1(char* msg){ char* szmsg = "fun1 none vm"; OutputDebugString( szmsg );}//虚拟化保护int fun2( int x, int y ){ int n = x + y; VMProtectBeginVirtualization("fun2"); OutputDebugString( "x+y= %d" ); VMProtectEnd(); return n;}//虚拟化和变异保护void fun3(){ VMProtectBeginUltra("fun3"); fun1("fun3 call fun1"); VMProtectEnd(); fun2( 2, 4 );}3. 保护嵌套情况void main(){ char* szMsg = "proxxb vm sapmle!"; //不被保护 VMProtectBegin("main"); //被保护 OutputDebugString( "vm protect test." ); //被保护 fun1(szMsg); //函数内部自己去保护 fun2( 2, 4 ); //函数内部自己去保护 fun1(szMsg); //函数内部自己去保护 fun3(); //不被保护 VMProtectEnd(); getchar(); //不被保护}4. 字符串保护应使用VMProtectDecryptStringA或VMProtectDecryptStringW函数保护名为字符串,被保护后,明晚字符串不再出现在内存,除非被解密的那一刻!char* Decrypt( char* key, char* buffer, long length ){ VMProtectBeginUltra("Decrypt"); ....VMProtectEnd();}调用方法:Decrypt(VMProtectDecryptStringA(“DecryptKey”), //此时密文密钥被解密buffer,512);5. 其它函数,暂时不用
