VMProtect使用说明

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();
}
  1. 保护的单元是函数,而不是整个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 );
}
  1. 保护嵌套情况
void main()
{
    char* szMsg = "proxxb vm sapmle!";        //不被保护
    
    VMProtectBegin("main"); //被保护
    OutputDebugString( "vm protect test." );    //被保护
    fun1(szMsg);     //函数内部自己去保护
    fun2( 2, 4 ); //函数内部自己去保护
    fun1(szMsg);  //函数内部自己去保护
    fun3();        //不被保护
    VMProtectEnd();
    getchar(); //不被保护
}
  1. 字符串保护
    应使用VMProtectDecryptStringA或VMProtectDecryptStringW函数保护名为字符串,被保护后,明晚字符串不再出现在内存,除非被解密的那一刻!
char* Decrypt( char* key, char* buffer, long length )
{
    VMProtectBeginUltra("Decrypt");
	VMProtectEnd();
}

调用方法:

Decrypt(
	VMProtectDecryptStringA(“DecryptKey”),    //此时密文密钥被解密
	buffer,
	512
);
  1. 其它函数,暂时不用
// 功能:设置开始标记
__declspec(dllimport) void __stdcall VMProtectBegin(const char *);
// 开始虚拟化代码处标记(包括保护设置)
__declspec(dllimport) void __stdcall VMProtectBeginVirtualization(const char *);
// 开始变异代码处标记(包括保护设置)
__declspec(dllimport) void __stdcall VMProtectBeginMutation(const char *);
// 开始虚拟+代码变异标记处
__declspec(dllimport) void __stdcall VMProtectBeginUltra(const char *);
// 绑定代码到序列号,进行虚拟保护
__declspec(dllimport) void __stdcall VMProtectBeginVirtualizationLockByKey(const char *);
// 绑定代码到序列号, 进行虚拟 + 变异保护
__declspec(dllimport) void __stdcall VMProtectBeginUltraLockByKey(const char *);
// 设置与虚拟/变异等功能配对的结束标记
__declspec(dllimport) void __stdcall VMProtectEnd(void);

// utils
// 检测调试器
__declspec(dllimport) BOOL __stdcall VMProtectIsDebuggerPresent(BOOL);
// 检测虚拟机
__declspec(dllimport) BOOL __stdcall VMProtectIsVirtualMachinePresent(void);
// 映像文件CRC校验
__declspec(dllimport) BOOL __stdcall VMProtectIsValidImageCRC(void);
// 功能:加密Ansi字符串常量, 返回加密后的字符串指针,主要是防止字符串被搜索到
__declspec(dllimport) char * __stdcall VMProtectDecryptStringA(const char *value);
// 功能:加Unicode字符串,返回加密后的字符串指针
__declspec(dllimport) wchar_t * __stdcall VMProtectDecryptStringW(const wchar_t *value);
// 释放所有被加密的字符串
__declspec(dllimport) BOOL __stdcall VMProtectFreeString(void *value);
// 设置序列号, 将序列号传递给授权模块, 返回零成功
__declspec(dllimport) INT  __stdcall VMProtectSetSerialNumber(const char * SerialNumber);
// 返回序列号状态,由常量定义的位组成,正常返回0,如果为常量定义的任意一位或多个值,则序列号为非法序列号
__declspec(dllimport) INT  __stdcall VMProtectGetSerialNumberState();
// 如果授权模块错误或者是VMProtectSerialNumberData结构或者其大小异常, 函数都将返回False
__declspec(dllimport) BOOL __stdcall VMProtectGetSerialNumberData(VMProtectSerialNumberData *pData, UINT nSize);
// 获取当前电脑的硬件识别码.如果HWID参数为NULL,nSize为0,则返回储存硬件识别码所需要的空间大小
__declspec(dllimport) INT  __stdcall VMProtectGetCurrentHWID(char * HWID, UINT nSize);
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值