ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
沪ICP备05041459号
About AdvDbg Consult Train Services Products Tools Community Contact   登录 | 注册

Bochs vs. VMware

熟悉 Bochs 的人看了这个题目多半都会认为 Bochs 和 VMware 没有可比性,虽然 Bochs 运行图形系统的速度会让你有种奔向黑洞的感觉...


Kris Kaspersky 在《Hacker Debugging Uncovered》一书里列举过他原来实验的一些数据:
                 +-----------------------------+
                 | 宿主机        PIII  733MHz  |
                 +-----------------------------+
                 | VMware        PIII  366MHz  |
                 | Virtual PC    PIII  187MHz  |
                 | Bochs         PIII  1.49MHz |
                 +-----------------------------+
嘿嘿~ Bochs 大致相当于 0.203%。当然,这样计算是非常不准确的,这里只是示意一下。 ^_^



Virtual PC 甚至不能跑 SoftICE,玩家级的东西还是算了吧。VMware 较好的支持了 SoftICE 但是不能进行 OS 级调试(不过,我想他们要是想做也是绝对能做的),这时候 Bochs 的 Emulator 的概念就出来了,这东西整个就是一硬件的 ICE,价值不言而喻。



呃,今天真正想说的是 VMware 的 Bug......
感觉 VMware 底层许多地方做的不细,小问题不少,我随便测测就发现了:(1) 启动时不检测启动扇区 0xAA55 的 Magic Number;(2) 保护模式退回实模式时不判断 CR0 PE (Protection Enabled) 位是否清0;(3) 貌似根本就不支持 BIOS int 10h号中断 00h号功能调用(显示模式切换) 等等等等。

所以,VMware 也是非常面向应用的,想开发属于自己的操作系统的人是不会喜欢他们的。



最后放一段我的测试代码 —— 显示模式切换,将开机后默认的“80×25 16色文本模式”切换至“320×200 4色图形模式,并操作像素点绘制4条直线”。这段(引导扇区)代码在 Bochs 下工作的非常好,而 VMware 下则是种种怪异的现象~   我想我应该是写了非常详细的注释,感兴趣的朋友瞅瞅吧~  ^_^



[为了方便显示(22' 液晶显示屏的人除外),下面代码做了进缩]
; ==================================================== ;
;                .:  keenjoy95 2007  :.                ;
;          .:  keenjoy95_at_gmail_dot_com  :.          ;
; ---------------------------------------------------- ;
; 代码描述  :  引导扇区演示程序                        ;
; 编译方法  :  nasm  boot.asm -o boot.bin              ;
; ==================================================== ;

        org     07c00h               ; ORG伪指令也被称为程序起始地址伪指令 / 定位伪指令
                                     ; 该伪指令用于指示编译器(链接器)将其后续代码(段)定位于指定地址
                                     ; 由于本示例是引导扇区演示程序,所以目标定位地址为0000:7c00h
        jmp     MYOS_ENTRY           ; 无条件跳转到程序的入口点MYOS_ENTRY标号处


SetVideoMode:
        mov     ax, 0004h            ; 320 * 200 * 4 图形模式
                                     ;     ---------------------------------------------------
                                     ;              0(00h)                     319(13fh)
                                     ;        0(00h)┏━━━━━━━━━━━━━━━━┓
                                     ;              ┃                                ┃
                                     ;              ┃                                ┃
                                     ;              ┃                                ┃
                                     ;              ┃   显示器  320 * 200 显示方式   ┃
                                     ;              ┃            4 种色彩            ┃
                                     ;              ┃                                ┃
                                     ;              ┃                                ┃
                                     ;      199(C7h)┗━━━━━━━━━━━━━━━━┛
                                     ;
        int     10h                  ; BIOS 10h号中断-00h号功能           (视频模式切换功能调用)
        ret                          ; 子程序无参数返回

SetBackGround:
        mov     ah, 0bh
        mov     bx, 0001h            ; 背景颜色设置为蓝色
        int     10h                  ; BIOS 10h号中断-0Bh号功能           (背景颜色设置功能调用)
        ret                          ; 子程序无参数返回

WriteGraphicsPixel:
        mov     cx, 0                ; Y 坐标设置
        mov     dx, 20               ; X 坐标设置
Back1:                               ;
        mov     ax, 0c01h            ; 320 * 200 * 4 图形模式像素颜色设置
        int     10h                  ; BIOS 10h号中断-0ch号功能           (像素写模式功能调用)
        inc     cx                   ; ┓
        cmp     cx, 320              ; ┣ X 坐标递增至屏幕宽度
        jnz     Back1                ; ┛
                                     ; ---------------------------------------------------------
        mov     cx, 0                ; Y 坐标设置
        mov     dx, 180              ; X 坐标设置
Back2:                               ;
        mov     ax, 0c01h            ; 320 * 200 * 4 图形模式像素颜色设置
        int     10h                  ; BIOS 10h号中断-0ch号功能           (像素写模式功能调用)
        inc     cx                   ; ┓
        cmp     cx, 320              ; ┣ X 坐标递增至屏幕宽度
        jnz     Back2                ; ┛
                                     ; ---------------------------------------------------------
        mov     cx, 20               ; Y 坐标设置
        mov     dx, 0                ; X 坐标设置
Back3:                               ;
        mov     ax, 0c02h            ; 320 * 200 * 4 图形模式像素颜色设置
        int     10h                  ; BIOS 10h号中断-0ch号功能           (像素写模式功能调用)
        inc     dx                   ; ┓
        cmp     dx, 200              ; ┣ Y 坐标递增至屏幕高度
        jnz     Back3                ; ┛
                                     ; ---------------------------------------------------------
        mov     cx, 300              ; Y 坐标设置
        mov     dx, 0                ; X 坐标设置
Back4:                               ;
        mov     ax, 0c03h            ; 320 * 200 * 4 图形模式像素颜色设置
        int     10h                  ; BIOS 10h号中断-0ch号功能           (像素写模式功能调用)
        inc     dx                   ; ┓
        cmp     dx, 200              ; ┣ Y 坐标递增至屏幕高度
        jnz     Back4                ; ┛
        ret                          ; 子程序无参数返回

ScrollWindows:
        mov     ax, 0600h            ; AH 赋值为功能号06h(窗口上滚)       (BIOS INT 10-06h 定义参数)
                                     ; AL 赋值为0, 窗口信息全部移出(清屏) (BIOS INT 10-06h 定义参数)
        mov     bx, 0700h            ; BH 底部空白行属性赋值为黑底灰白字  (BIOS INT 10-06h 定义参数)
                                     ; BL 保留
        mov     cx, 0000h            ; 窗口左上角的行列、号赋值为00h 00h  (BIOS INT 10-06h 定义参数)
        mov     dx, 184fh            ; 窗口右下角的行列、号赋值为18h 4fh  (BIOS INT 10-06h 定义参数)
                                     ;     ---------------------------------------------------
                                     ;               0(00h)                      79(4fh)
                                     ;        0(00h)┏━━━━━━━━━━━━━━━━┓
                                     ;              ┃                                ┃
                                     ;              ┃                                ┃
                                     ;              ┃                                ┃
                                     ;              ┃     显示器  25*80 显示方式     ┃
                                     ;              ┃                                ┃
                                     ;              ┃                                ┃
                                     ;              ┃                                ┃
                                     ;       24(18h)┗━━━━━━━━━━━━━━━━┛
                                     ;
        int     10h                  ; BIOS 10h号中断-06h号功能           (清屏功能调用)
        ret                          ; 子程序无参数返回

MYOS_ENTRY:
        mov     ax, cs               ; ┓
        mov     ds, ax               ; ┣ 段寄存器初始化
        mov     es, ax               ; ┛
        call    ScrollWindows        ; 调用清除屏幕子程序
        call    SetVideoMode         ; 调用视频模式切换子程序
        call    SetBackGround        ; 调用背景颜色设置子程序
        call    WriteGraphicsPixel   ; 调用绘图子程序
        jmp     $                    ; 主程序进入无限循环

MYOS_PAD:
        times   510-($-$$)   db   0  ; 循环填充剩余空间,使生成的二进制代码大小恰好为一个扇区(512Byte)
        dw      0xAA55               ; 引导扇区结束标志
; ---8<--------------- [Cut Here] --------------->8--- ;
;                .:  keenjoy95 2007  :.                ;
;          .:  keenjoy95_at_gmail_dot_com  :.          ;
;                ! NO rights reserved !                ;
; ---------------------------------------------------- ;

 
 



NUPT   WANGyu
 
 
 
 
 
 
 
 
 
 

posted on Wednesday, October 24, 2007 9:52 AM 由 WANGyu

# re: Bochs vs. VMware @ Sunday, October 28, 2007 10:27 PM

写的很漂亮,内容和排版都很有滋有味!
无论是ICE还是Bochs,它们的一个共同点就是为我们提供了一种控制和观察软件的方式,如果希望,可以精确到每一条指令是如何运行的。这看似简单的目标,实现起来和意识到它的重要性都不容易。

Raymond

# re: Bochs vs. VMware @ Monday, October 29, 2007 11:15 AM

貌似 VMware 的开发者是按照“自己的想法”做了底层虚拟,许多细节不完全符合 IBM PC 和 VGA BIOS 之类的要求,我那天一次性发现的问题有:
(1) VMware 启动时不检测启动扇区 +510偏移处的 Magic Number :0xAA55。
(2) 保护模式退回实模式时不判断 CR0 PE (Protection Enabled) 位是否清0。
(3) 不支持 BIOS int 10h号中断 00h号功能调用的图形模式(显示模式切换,320×200×256图形模式 or 640×480×16图形模式)。
(4) 屏幕滚动操作后将光标位置强制置为 0,0。

这些问题至少显得 VMware 某些细节实现的太随意了,虽然普通用户不会在意这些,但终究是“不专业”。So,VMware 太面向应用了。

PS:最近在看 MJ001 的文章《u88财富快车流氓软件RK驱动分析》,够悍的rk,正好小的我也学学IDA~ ^_^

向Raymond老师学习!

WANGyu

# re: Bochs vs. VMware @ Monday, October 29, 2007 11:44 AM

Rootkit.com 将 FU Rootkit 用到的技术称为“第二代Rootkit技术”,也就是所谓的 DKOM —— Direct Kernel Object Manipulation。

但是其实这名词有点搞笑了~ 就一个函数的生命周期而言,函数本身只是一个功能的封装,它最后也是要操作数据结构以完成某种任务的 —— 所以,这种攻击想法就是绕开API本身,直接去操作数据结构。

老想法了,而且是N年前就存在!

比如 —— BIOS的 int 10号中断 13号功能调用是“字符串屏幕显示”。而我们可以不经过这个BIOS中断,直接去“操作”显卡的缓冲区实现同样的效果。

16K大小的缓存首地址位于 0xB8000,256K大小的缓存首地址位于 0xA0000。

操作方法如下:
[1] 将源地址 (SI) 指向待显示的字符串、将目的地址 (GS:DI) 指向显卡缓冲区
[2] 显示偏移像这样计算:(80 * X + Y) * 2 —— X、Y是屏幕坐标。
[3] lodsw 指令将待显示的编码(字符和属性)装入 AX 寄存器。
[4] mov [gs:di], ax 显示之~

OK!这就是“BIOS调用版”的 DKOM~ 嘿嘿,不过我们这里没有 KO,我们操作的是“物理内存” —— 所以我们是 DPMM!

玩笑了玩笑了~ 不过 KOH 的检测的确比较麻烦~ 一个典型的应用是 XP SP2 以后的 SYSENTER Hook。

WANGyu

# re: Bochs vs. VMware @ Monday, October 29, 2007 12:09 PM

“无论是ICE还是Bochs,它们的一个共同点就是为我们提供了一种控制和观察软件的方式,如果希望,可以精确到每一条指令是如何运行的。”

Raymond 老师说的非常好。

ICE 我是没钱玩了,而Bochs 则像是上帝,他可以看着 BIOS 以及 OS 是如何初始化的。一句指令 一句指令的看着他们长起来的感觉真好,嘿嘿~

致敬~

WANGyu

# re: Bochs vs. VMware @ Monday, November 05, 2007 4:49 PM

“16K大小的缓存首地址位于 0xB8000,256K大小的缓存首地址位于 0xA0000”

上面的话,我是随口说说的,其实不是这样。

更多信息请看1MB内存使用分布,或是去啃 Michael Abrash 那本异常经典的70章的书~

WANGyu

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2005 Advanced Debugging Ltd. All Rights Reserved.