VM保护简单原理

来源:互联网 发布:系统网络架构图 编辑:程序博客网 时间:2024/05/16 19:37

转自:http://bbs.pediy.com

 

/*VM初探作者:blueapplezQQ:124272113Email:blueapple1987@163.comhttp://bbs.pediy.com/*/#include "windows.h"/* 下面是虚拟指令 我们只模拟了2条指令 *///push 0x12345678  push一个4字节的数#define vPushData    0x10//call 0x12345678  call一个4字节的地址#define vCall        0x12//结束符#define vEnd        0xff//一个字符串char *str = "Hello World";/*这是我们构造的虚拟指令, 数据还不  在mian里面我们进行了修改push 0push 0push offset str  ;把字符串的地址入栈push 0call MessageBoxA ;*/BYTE bVmData[] = {vPushData,0x00, 0x00, 0x00, 0x00, vPushData,0x00, 0x00, 0x00, 0x00,vPushData,0x00, 0x00, 0x00, 0x00,vPushData,0x00, 0x00, 0x00, 0x00,vCall,0x00, 0x00, 0x00, 0x00,vEnd};//这就是简单的虚拟引擎了_declspec(naked) void  VM(PVOID pvmData){__asm{//取vCode地址放入ecxmov ecx, dword ptr ss:[esp+4]__vstart://取第一个字节到al中mov al, byte ptr ds:[ecx]cmp al, vPushDataje    __vPushDatacmp al, vCallje    __vCallcmp al, vEndje __vEndint 3__vPushData:inc ecxmov edx, dword ptr ds:[ecx]push edxadd ecx, 4jmp __vstart__vCall:inc ecxmov edx, dword ptr ds:[ecx]call edxadd ecx, 4jmp __vstart__vEnd:ret}}int main(int argc, char* argv[]){//修改虚拟指令的数据*(DWORD *)(bVmData+10 + 1) = (DWORD)str;*(DWORD *)(bVmData+20 + 1) = (DWORD)MessageBoxA;//执行虚拟指令VM(bVmData);return 0;}


 

原创粉丝点击