吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5476|回复: 7
收起左侧

[其他转载] [zz]Smeagol写的个虚拟机

 关闭 [复制链接]
zzage 发表于 2009-9-10 21:14
标 题: 【原创】我自己写的个虚拟机【申请邀请码】
作 者: 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, [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

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

zapline 发表于 2009-9-10 21:21
很简陋啊
 楼主| zzage 发表于 2009-9-10 21:29
很简陋啊
zapline 发表于 2009-9-10 21:21

呵呵,小z来完善它...写个ZaplineVM
ximo 发表于 2009-9-10 21:35
烂香蕉 发表于 2009-9-19 10:21
的确简陋。。。
hxsoft 发表于 2009-9-19 11:09
这么小巧的虚拟机,还真不错!
zapline 发表于 2009-9-19 12:23
呵呵,小z来完善它...写个ZaplineVM
zzage 发表于 2009-9-10 21:29


其实这些俺也写了  没人带我  继续不下去了
yixiangling 发表于 2010-11-29 09:49
这么简陋我也还是没看懂
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-17 00:36

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表