首页
社区
课程
招聘
[旧帖] [原创]我自己写的个虚拟机 0.00雪花
发表于: 2009-9-9 08:35 4569

[旧帖] [原创]我自己写的个虚拟机 0.00雪花

2009-9-9 08:35
4569

想申个精,这是我昨天写了一晚上写的虚拟机,模拟了一个调用MessageBox的过程。实现的指令不算多。支持立即数和[]这种取地址的方式。大家直接看程序吧。
对不起,10分钟前发布的版本有点问题,这个已经解决了masm32直接编译ml /c /coff 链接的时候link /subsystem:windows /section:.text,RWE 完全可以运行: )

.586
.model flat,stdcall
option casemap:none

include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
  
.data

chCaption db 'Message', 0
chText db 'oh yeah!', 0
chUser32 db 'user32.dll', 0

chSrc db 0h, 08h                       ;这条相当于x86的push 0
         dd 0h                              
         db 7h, 0C0h                     ;相当于x86的mov eax, chCaption
         dd chCaption                  
         db 0h, 00h                       ;相当于x86的push chText
         db 0h, 08h                       
         dd chText
         db 0h, 08h                        ;相当于x86的push 0
         dd 0h                                
         db 2h, 08h                        ;call MessageBox
         dd 77d507eah                  
         db 3h, 0h                          ;rent虚拟机退出
.code
opcode dd ?
start:
    call here
here:
    pop ebx
    mov eax, here
    sub ebx, eax

    lea eax, [chSrc + ebx]
    mov opcode, eax
    ;指定opcode

    invoke LoadLibrary, offset chUser32

    push eax
    push esp
    push ebp
    push esi
    push edi
    push ebx
    push ecx
    push edx
    pushfd
    mov esi, opcode
    lea edi, [esp + 20h]
    lea ebp, [ASM + ebx]
    jmp Dispatch
   
   
    db 0CCh

VNOT:
    pop eax
    not dword ptr[eax]
    pushfd
    pop [edi - 20h]
    jmp Dispatch
VNEG:
    pop eax
    neg dword ptr[eax]
    pushfd
    pop [edi - 20h]
    jmp Dispatch
VJMP:
    pop eax
    add esi, [eax]
    jmp Dispatch

VCALL:
    pop ecx
    mov ecx, [ecx]
    call ecx
    mov [edi], eax
    jmp Dispatch

    db 0CCh
                              ;以上是初始化工作,从这开始进入分配器
Dispatch:
    xor eax, eax             ;reset eax
    mov al, [esi]
    inc esi
    mov edx, [ebp + 4*eax]   ;reset edx
    mov al, [esi]
    inc esi
    test al, 80h             ;;;比较单双操作数
    jnz Double   
                              
    test al, 40h             ;这里开始是对单操作数指令的处理
    jnz SingalAddr
    cmp al, 08h
    jz ImmiValue
    lea ecx, [edi + 4*eax]          ;push eax
    push ecx               ;操作寄存器
    jmp edx
  ImmiValue:
    push esi                        ;push immi
    add esi, 4
    jmp edx
SingalAddr:
    cmp al, 08h
    jz ImmiAddr
    mov ecx, [edi + 4*eax]          ;push [eax]
    push ecx               ;操作寄存器中的地址
    jmp edx
  ImmiAddr:
    mov eax, [esi]                  ;push [immi]
    push eax
    add esi, 4
    jmp edx

Double:                     ;这里开始是对双操作数指令的处理
    xor ecx, ecx
    and al, 7Fh
    test al, 40h
    jnz HaveImmi
    and al, 40h                 
    mov cl, [esi]
    inc esi
    test cl, 80h
    jnz FValue              
    lea eax, [edi + 4*eax]      ;mov eax, ecx
    push eax
    lea ecx, [edi + 4*ecx]
    push ecx
    jmp edx
  FValue:
    test cl, 40h                ;mov eax, [ecx]
    jnz BValue
    lea eax, [edi + 4*eax]
    push eax
    mov ecx, [edi + 4*ecx]
    push ecx
    jmp edx
  BValue:
    mov eax, [edi + 4*eax]      ;mov [eax], ecx
    push eax
    mov ecx, [edi + 4*ecx]
    push ecx
    jmp edx
HaveImmi:                     
    and al, 0BFh
    test al, 20h
    jnz HaveAddr
    lea ecx, [edi + 4*eax]
    push ecx                     ;mov eax, immi
    push esi
    add esi, 4
    jmp edx
  HaveAddr:                  
    test al, 10h
    jnz ImmiBValue
    and al, 0Fh                ;mov eax, [immi]
    lea ecx, [edi + 4*eax]
    push ecx
    push [esi]
    add esi, 4
    jmp edx
  ImmiBValue:
    and al, 0EFh                ;mov [eax], immi
    mov ecx, [edi + 4*eax]
    push ecx
    push esi
    add esi, 4
    jmp edx
    jmp edx
   
    db 0CCh                     ;以上都是分配器程序
   

VMOV:
    pop eax
    pop ecx
    mov eax, [eax]
    mov [ecx], eax
    jmp Dispatch

VLEA:
    pop eax
    pop ecx
    mov [ecx], eax
    jmp Dispatch

VRETN:
     mov al, [esi]
     lea esp, [edi + 8h]
     mov edx, [esp - 4]
     lea esp, [esp + eax]
     jmp edx
VPUSH:
    pop eax
    push [eax]
    jmp Dispatch

VPOP:
    pop eax
    pop [eax]
    jmp Dispatch

VADD:
    pop eax
    pop ecx
    add [ecx], eax
    jmp Dispatch

VSUB:
    pop eax
    pop ecx
    sub [ecx], eax
    jmp Dispatch

ASM dd VPUSH
    dd VPOP
    dd VCALL
    dd VRETN
    dd VJMP
    dd VNOT
    dd VNEG
    dd VMOV
    dd VLEA
    dd VADD
    dd VSUB
   
end start


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (37)
雪    币: 178
活跃值: (159)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
只能说学习
2009-9-9 08:50
0
雪    币: 291
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
只能跟着你,一起说学习
2009-9-9 09:47
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
虚拟机玩不起,跟代码会 又难受又很耗精力。
2009-9-9 09:56
0
雪    币: 84
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
怎么用.......
2009-9-9 12:20
0
雪    币: 612
活跃值: (996)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
~~强悍
2009-9-9 13:00
0
雪    币: 370
活跃值: (52)
能力值: ( LV13,RANK:350 )
在线值:
发帖
回帖
粉丝
7
恩 不错 学习了
你这个opcode dd ? 可以弄到.data下 就不设EWR也行 另外在加个ExitProcess吧
期待更精彩的VM
加精鼓励和支持
2009-9-9 13:18
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
8
VM呀。。
2009-9-9 13:27
0
雪    币: 1757
活跃值: (939)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
有编译出来的执行程序不?
2009-9-9 13:33
0
雪    币: 41
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
看不懂啊~~~
2009-9-9 13:45
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ber
11
不知比起VM会怎么样!
2009-9-9 14:16
0
雪    币: 104
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
谢谢大家,现在这个算是个雏形吧,离实际应用还很远。
回moonife 兄,我想把它写入一个段中,以后可以直接把它嵌入PE文件里,所以把opcode的地址也放进去了,呵呵。
2009-9-9 14:22
0
雪    币: 90
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
强啊
不知能上网不!
2009-9-9 17:26
0
雪    币: 253
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
能上网啊
这哥们完全不在状态啊。。。
2009-9-9 18:23
0
雪    币: 104
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
版主大人,何时发放邀请码啊?
2009-9-13 19:36
0
雪    币: 93
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
不错,学习了
2009-9-13 20:04
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
我只能膜拜再膜拜!!
强人~~~
2009-9-20 21:10
0
雪    币: 194
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
给我一个邀请码嘛,我很希望学习啊
2009-9-28 11:17
0
雪    币: 272
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
看不懂  
2009-9-28 11:37
0
雪    币: 204
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
不错,,,学习学习
2009-9-28 19:28
0
雪    币: 1653
活跃值: (1072)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
饿..

有点复杂..得慢慢学习..
2009-9-28 21:27
0
雪    币: 233
活跃值: (43)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
22
太强悍了!6个了
2009-10-23 13:57
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
这好象不是我能看懂的,既然版主说好,我也就也说好
2009-10-23 14:43
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
虚拟机不是不可以再开个系统??
2009-10-23 14:49
0
雪    币: 138
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
完全不懂
2009-10-23 14:56
0
游客
登录 | 注册 方可回帖
返回
//