[zz]Smeagol写的个虚拟机
标 题: 【原创】我自己写的个虚拟机【申请邀请码】作 者: Smeagol
时 间: 2009-09-09,08:35
链 接: http://bbs.pediy.com/showthread.php?t=97440
想申个精,这是我昨天写了一晚上写的虚拟机,模拟了一个调用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,
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,
lea ebp,
jmp Dispatch
db 0CCh
VNOT:
pop eax
not dword ptr
pushfd
pop
jmp Dispatch
VNEG:
pop eax
neg dword ptr
pushfd
pop
jmp Dispatch
VJMP:
pop eax
add esi,
jmp Dispatch
VCALL:
pop ecx
mov ecx,
call ecx
mov , eax
jmp Dispatch
db 0CCh
;以上是初始化工作,从这开始进入分配器
Dispatch:
xor eax, eax ;reset eax
mov al,
inc esi
mov edx, ;reset edx
mov al,
inc esi
test al, 80h ;;;比较单双操作数
jnz Double
test al, 40h ;这里开始是对单操作数指令的处理
jnz SingalAddr
cmp al, 08h
jz ImmiValue
lea ecx, ;push eax
push ecx ;操作寄存器
jmp edx
ImmiValue:
push esi ;push immi
add esi, 4
jmp edx
SingalAddr:
cmp al, 08h
jz ImmiAddr
mov ecx, ;push
push ecx ;操作寄存器中的地址
jmp edx
ImmiAddr:
mov eax, ;push
push eax
add esi, 4
jmp edx
Double: ;这里开始是对双操作数指令的处理
xor ecx, ecx
and al, 7Fh
test al, 40h
jnz HaveImmi
and al, 40h
mov cl,
inc esi
test cl, 80h
jnz FValue
lea eax, ;mov eax, ecx
push eax
lea ecx,
push ecx
jmp edx
FValue:
test cl, 40h ;mov eax,
jnz BValue
lea eax,
push eax
mov ecx,
push ecx
jmp edx
BValue:
mov eax, ;mov , ecx
push eax
mov ecx,
push ecx
jmp edx
HaveImmi:
and al, 0BFh
test al, 20h
jnz HaveAddr
lea ecx,
push ecx ;mov eax, immi
push esi
add esi, 4
jmp edx
HaveAddr:
test al, 10h
jnz ImmiBValue
and al, 0Fh ;mov eax,
lea ecx,
push ecx
push
add esi, 4
jmp edx
ImmiBValue:
and al, 0EFh ;mov , immi
mov ecx,
push ecx
push esi
add esi, 4
jmp edx
jmp edx
db 0CCh ;以上都是分配器程序
VMOV:
pop eax
pop ecx
mov eax,
mov , eax
jmp Dispatch
VLEA:
pop eax
pop ecx
mov , eax
jmp Dispatch
VRETN:
mov al,
lea esp,
mov edx,
lea esp,
jmp edx
VPUSH:
pop eax
push
jmp Dispatch
VPOP:
pop eax
pop
jmp Dispatch
VADD:
pop eax
pop ecx
add , eax
jmp Dispatch
VSUB:
pop eax
pop ecx
sub , 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 很简陋啊 很简陋啊
zapline 发表于 2009-9-10 21:21 http://www.52pojie.cn/images/common/back.gif
呵呵,小z来完善它...写个ZaplineVM 的确简陋。。。 的确简陋。。。 这么小巧的虚拟机,还真不错!
呵呵,小z来完善它...写个ZaplineVM
zzage 发表于 2009-9-10 21:29 http://bbs.52pojie.cn/images/common/back.gif
其实这些俺也写了没人带我继续不下去了 这么简陋我也还是没看懂
页:
[1]