首页
社区
课程
招聘
[原创]VM初探 讲述VM原理
2010-11-13 17:21 39421

[原创]VM初探 讲述VM原理

2010-11-13 17:21
39421

小弟最近看了点vm   下面是一些心得体会  跟大家分享
通俗的讲 vm就是自己设计一套指令集  和一套解析这个虚拟指令集的引擎   把原本的386代码翻译成你自己的虚拟指令  然后调用你的虚拟引擎来执行这些虚拟指令。。。
这样说不知道合适不?   欢迎一起参与讨论
本文的目的是告诉大家虚拟机并不可怕    其实我们每个人都设计一套虚拟指令   这将是Cracker的噩梦。
这里感谢  jackozoo 版主提供的一个vm  CrackMe源码 作为我的参考资料
感谢 老罗的代码着色器

下面是最简单的一个vm例子  只虚拟了  push 和 call 指令

/*
    VM初探
    作者:blueapplez
    QQ:1242721xx
    Email:blueapple1987@163.com
    http://bbs.pediy.com/
*/

#include "stdafx.h"
#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 0
    push 0
    push offset str  ;把字符串的地址入栈
    push 0
    call 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地址放入ecx
        mov ecx, dword ptr ss:[esp+4]
__vstart:
        //取第一个字节到al中
        mov al, byte ptr ds:[ecx]
        cmp al, vPushData
        je    __vPushData
        cmp al, vCall
        je    __vCall
        cmp al, vEnd
        je __vEnd
        int 3
__vPushData:
        inc ecx
        mov edx, dword ptr ds:[ecx]
        push edx
        add ecx, 4
        jmp __vstart
__vCall:
        inc ecx
        mov edx, dword ptr ds:[ecx]
        call edx
        add ecx, 4
        jmp __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;
}

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

最后于 2022-7-10 15:20 被kanxue编辑 ,原因:
收藏
点赞6
打赏
分享
最新回复 (57)
雪    币: 454
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
blueapplez 14 2010-11-13 17:31
2
0
希望不要误导大家。
雪    币: 2321
活跃值: (4028)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
熊猫正正 9 2010-11-13 17:44
3
0
刚起床,看到了,不错,稳坐沙发在说~~
雪    币: 169
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
benhua 2010-11-13 18:01
4
0
稳坐板凳  感谢楼主
雪    币: 7464
活跃值: (2061)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
寒冰心结 2010-11-13 18:09
5
0
嗯..原理介绍的挺形象..

谢谢分享..
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Nod 2010-11-13 18:57
6
0
学习了。
雪    币: 397
活跃值: (292)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
neineit 10 2010-11-13 19:42
7
0
感谢简单易懂的说明思路
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zapline 2010-11-13 19:47
8
0
support
雪    币: 38
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
风萧兮 1 2010-11-13 19:57
9
0
支持!!!!!!
雪    币: 315
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
antime 2010-11-13 20:02
10
0
支持 LZ 把  VMP 或者 Winlincense 的虚拟指令逆一道
雪    币: 1147
活跃值: (783)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
ycmint 5 2010-11-13 20:07
11
0
看了 清新脱俗 。。。。VM  。。。
雪    币: 454
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
blueapplez 14 2010-11-13 20:52
12
0
我没腾讯的习惯。
我喜欢自己搞。
雪    币: 611
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ximo 2010-11-13 21:04
13
0
这个架构,欠缺的东西太多太多了。。。
雪    币: 454
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
blueapplez 14 2010-11-13 21:07
14
0
是的
堆栈现场保存等等   太多太多的东西都没有
这个cpp就是说一下   到底什么是vm   讲述他的原理
雪    币: 376
活跃值: (3432)
能力值: ( LV5,RANK:69 )
在线值:
发帖
回帖
粉丝
小菜鸟一 2010-11-13 21:12
15
0
继续学习   
雪    币: 271
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wep 2010-11-13 21:40
16
0
感谢LZ分享
雪    币: 230
活跃值: (105)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
雪之苏 2 2010-11-14 04:13
17
0
代码有点小瑕疵
修改如下
__vCall:
        inc ecx
        mov edx, dword ptr ds:[ecx]
        mov ebx,ecx
        call edx
        mov ecx,ebx
        add ecx, 4
        jmp __vstart

ECX在call messagebox之后被作为返回值场所,被修改了
雪    币: 78
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
whypro 2010-11-14 08:12
18
0
继续学习!继续学习.
雪    币: 8861
活跃值: (2369)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 10 2010-11-14 09:56
19
0
LZ这个是pcode~
vm是那样纠结蛋痛的样子~
雪    币: 442
活跃值: (1329)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
tzl 10 2010-11-14 18:43
20
0
值得学习,支持楼主
雪    币: 51
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
西风X 2010-11-14 19:59
21
0
要做就做 VM中的VM,虚拟机中再用原子指令解释虚拟指令
雪    币: 89
活跃值: (53)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
swlilike 2010-11-14 21:05
22
0
这个原理    值得深究
雪    币: 306
活跃值: (85)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
hack一生 1 2010-11-14 23:31
23
0
谢谢lz,学习了..
雪    币: 3441
活跃值: (2708)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hackroad 2010-11-15 20:05
24
0
不错 对理解VM很好
雪    币: 354
活跃值: (147)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
haithink 1 2010-11-16 08:15
25
0
嗯,大早上起来看了这帖子,感觉神清气爽!
游客
登录 | 注册 方可回帖
返回