- 注册时间
 - 2010-8-21
 
- 最后登录
 - 2017-5-28
 
- 在线时间
 - 3 小时
 
 
 
 
 
编程入门 
  
	- 魔鬼币
 - 605 
 
 
 
 | 
 
VMProtect使用说明以及调用方法 
 
一. 接口说明 
 
//开始保护处标记(对应于功能设置:反调试、内存保护等等) 
 
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); 
 
//解密被保护的名为字符串A 
 
char * VMProtectDecryptStringA(const char *value); 
 
//解密被保护的名为字符串W 
 
wchar_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 
 
); 
 |   
 
 
 
 |