首页
社区
课程
招聘
[旧帖] [分享]VM程序简单介绍。还差2KX,怎么样才能得到呢? 0.00雪花
发表于: 2014-3-28 14:34 1207

[旧帖] [分享]VM程序简单介绍。还差2KX,怎么样才能得到呢? 0.00雪花

2014-3-28 14:34
1207
我是菜鸟,说的不对的地方请指教。谢谢大家!

//在冯~诺依曼的计算机体系结构下,由于执行代码和数据都是存在于内存中的,所以进行代码和数据的混淆成了破解和HACK的方便之门。

在内存中,代码段是很容易被反汇编的,数据段都是一些地址,所以有人就将代码段的代码 (指令)存放到了 数据段中,来增加反汇编的难度。这就是VM程序。

下面就是一个VM程序例子。

#include <windows.h>

const BYTE MyPush = 0x11;
const BYTE MyCall   = 0x22;
const BYTE MyEnd   = 0x33;

BYTE
DataSec[]={
                MyPush ,0x00,0x00,0x00,0x00,        
                MyPush ,0x00,0x00,0x00,0x00,        
                MyPush ,0x00,0x00,0x00,0x00,        
                MyPush ,0x00,0x00,0x00,0x00,        
                MyCall   ,0x00,0x00,0x00,0x00,
                MyEnd   };

__declspec(naked) void VM(PVOID DataSec)
{
        __asm
        {
                //取得参数
                mov ecx,dword ptr ss:[esp+4]
__Start:
                //得第一个字节
                mov al,byte ptr ds:[ecx]
//判断指令
                cmp al,MyPush
                je __Push
                cmp al,MyCall
                je __Call
                cmp al,MyEnd
                je __End
__Push:
                inc ecx //往后加1
                mov edx,dword ptr ds:[ecx]
                push edx
                add ecx,4//加4
                jmp __Start
__Call:
                inc ecx
                mov edx,dword ptr ds:[ecx]
                call edx
                add ecx,4
                jmp __Start
__End:
                ret
        }
}

void main()
{
        char *Caption = "VM";
        char *Text = "Hello";

        *(DWORD*)(DataSec+ 5 + 1) = (DWORD)Caption;
        *(DWORD*)(DataSec + 10 + 1) = (DWORD)Text;
        *(DWORD*)(DataSec + 20 + 1) = (DWORD)MessageBoxA;

        //执行虚拟指令
        VM(DataSec);
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回