首页
社区
课程
招聘
[原创]vista引导过程分析(一)
发表于: 2010-3-17 19:24 14959

[原创]vista引导过程分析(一)

2010-3-17 19:24
14959

好事成双嘛,今天发了篇脱壳的文章,那就再发一个凑一对儿好了。
这是几周心血来潮想研究下bootkit,正好偶有个vista的虚拟机镜像,就搞了一下,结果就出了今天大家看到的这个半成品。(并且是很少的一部分)

一. 制作vista的bochs镜像

工具
把vmware镜像转成image格式 qemu-img.exe

qemu-img.exe x:\xx.vmdk x:\xx.img

二. 设置bochs  
直接拷贝dlxlinux的设置,修改bochsrc.bxrc里的
ata0-master: type=disk, path="vista.img", cylinders = 0, heads=64, spt=64

cylinders 设为0 
后面heads 和 spt 设为 8的整数倍

三. 完全记录vista启动过程
>b 0x7c00

>disassemble 0x7c00 0x7c20

00007c00: (                    ) : xor ax, ax                ; 33c0
00007c02: (                    ) : mov ss, ax                ; 8ed0
00007c04: (                    ) : mov sp, 0x7c00            ; bc007c
00007c07: (                    ) : mov es, ax                ; 8ec0
00007c09: (                    ) : mov ds, ax                ; 8ed8
00007c0b: (                    ) : mov si, 0x7c00            ; be007c
00007c0e: (                    ) : mov di, 0x0600            ; bf0006
00007c11: (                    ) : mov cx, 0x0200            ; b90002
00007c14: (                    ) : cld                       ; fc
00007c15: (                    ) : rep movsb byte ptr es:[di], byte ptr ds:[si] ;
 f3a4
00007c17: (                    ) : push ax                   ; 50
00007c18: (                    ) : push 0x061c               ; 681c06
00007c1b: (                    ) : retf                      ; cb

把各种段寄存器置零,把0x7c00处的0x200个字节拷贝到0x0600处,并跳转到0x061c处执行

<bochs:46> disassemble 0x061c 0x0762
0000061c: (                    ) : sti                       ; fb
0000061d: (                    ) : mov cx, 0x0004            ; b90400     
00000620: (                    ) : mov bp, 0x07be            ; bdbe07        这里是分区表

00000623: (                    ) : cmp byte ptr ss:[bp], 0x00 ; 807e0000     判断该分区是否是活动分区
00000627: (                    ) : jl .+0x000b               ; 7c0b          jl 00000634  若是80就跳转
00000629: (                    ) : jnz .+0x0110              ; 0f851001      jnz 0000073D 若不是0就跳转,及出现错误
0000062d: (                    ) : add bp, 0x0010            ; 83c510
00000630: (                    ) : loop .+0xfff1             ; e2f1          loop 00000623
00000632: (                    ) : int 0x18                  ; cd18          reboots 

00000634: (                    ) : mov byte ptr ss:[bp], dl  ; 885600        这里dl = 0x80,把分区
00000637: (                    ) : push bp                   ; 55
00000638: (                    ) : mov byte ptr ss:[bp+0x11], 0x05 ; c646    临时的循环变量
0000063c: (                    ) : mov byte ptr ss:[bp+0x10], 0x00 ; c646    临时变量标识是否支持int 13H 扩展的第二个子集
00000640: (                    ) : mov ah, 0x41              ; b441
00000642: (                    ) : mov bx, 0x55aa            ; bbaa55
00000645: (                    ) : int 0x13                  ; cd13         检查扩展Int13H是否存在,进位标志为1是不支持
00000647: (                    ) : pop bp                    ; 5d
00000648: (                    ) : jb .+0x000f               ; 720f         不支持就跳转到00000659
0000064a: (                    ) : cmp bx, 0xaa55            ; 81fb55aa     cflage为0,同时bx = 0xAA55h说明支持int 13H 扩展
0000064e: (                    ) : jnz .+0x0009              ; 7509         不支持就跳转到00000659
00000650: (                    ) : test cx, 0x0001           ; f7c10100     判断是否支持哪一个API子集

                                                            ;第一个子集提供了访问大硬盘所必须的功能, 包括 检查扩展 In13H
                                                            ;是否存在( 41h ), 扩展读( 42h ), 扩展写( 43h ), 校验扇区( 44h ),
                                                            ;扩展定位( 47h ) 和 取得驱动器参数( 48h ).
                                                            ;第二个子集提供了对软件控制驱动器锁定和弹出的支持, 包括 检查扩展
                                                            ;Int13H 是否存在( 41h ), 锁定/解锁驱动器( 45h ), 弹出驱动器( 46h ),
                                                            ;取得驱动器参数( 48h ), 取得扩展驱动器改变状态( 49h ), int 15h.
                                                            ;如果使用了调用规范中不支持的功能, BIOS 将返回错误码 ah = 01h,
                                                            ;CF = 1.

00000654: (                    ) : jz .+0x0003               ; 7403
00000656: (                    ) : inc byte ptr ss:[bp+0x10] ; fe4610

00000659: (                    ) : pushad                    ; 6660
0000065b: (                    ) : cmp byte ptr ss:[bp+0x10], 0x00 ; 807e       是否支持第二个子集
0000065f: (                    ) : jz .+0x0026               ; 7426             不支持就跳转到00000687

00000661: (                    ) : push 0x00000000           ; 6668000000
00000667: (                    ) : push dword ptr ss:[bp+0x8] ; 66ff7608       block_num
0000066b: (                    ) : push 0x0000               ; 680000
0000066e: (                    ) : push 0x7c00               ; 68007c      buffer_addr
00000671: (                    ) : push 0x0001               ; 680100      block_count
00000674: (                    ) : push 0x0010               ; 681000      packet_size and reserved  
00000677: (                    ) : mov ah, 0x42              ; b442
00000679: (                    ) : mov dl, byte ptr ss:[bp]  ; 8a5600      驱动器号
0000067c: (                    ) : mov si, sp                ; 8bf4
0000067e: (                    ) : int 0x13                  ; cd13

                                                            ;struct DiskAddressPacket
                                                            ;{
                                                            ;    BYTE PacketSize;     // 数据包尺寸:
                                                            ;                         //(固定值,恒等于16,即10H,指本结构所占用的存储空间) 
                                                            ;    BYTE Reserved;       // ==0
                                                            ;    WORD BlockCount;     // 要传输的数据块个数(以扇区为单位)
                                                            ;    DWORD BufferAddr;    // 传输缓冲地址(segment:offset)
                                                            ;    QWORD BlockNum;      // 磁盘起始绝对块地址
                                                            ;};

                                                            ;这里是从在MBR的分区表中读出1个扇区数据到0x7c00

                                                            
00000680: (                    ) : lahf                      ; 9f      把 eflage 低 8 位放进ah中
00000681: (                    ) : add sp, 0x0010            ; 83c410  恢复堆栈
00000684: (                    ) : sahf                      ; 9e      把 ah 写入 eflage 低 8 位
00000685: (                    ) : jmp .+0x0014              ; eb14    jmp 0000069b

00000687: (                    ) : mov ax, 0x0201            ; b80102  ah = 2, al = 1, 1扇区数
0000068a: (                    ) : mov bx, 0x7c00            ; bb007c
0000068d: (                    ) : mov dl, byte ptr ss:[bp]  ; 8a5600     驱动器  (00H~7FH:软盘;80H~0FFH:硬盘)
00000690: (                    ) : mov dh, byte ptr ss:[bp+0x1] ; 8a7601  磁头
00000693: (                    ) : mov cl, byte ptr ss:[bp+0x2] ; 8a4e02  扇区
00000696: (                    ) : mov ch, byte ptr ss:[bp+0x3] ; 8a6e03  柱面
00000699: (                    ) : int 0x13                  ; cd13

0000069b: (                    ) : popad                     ; 6661
0000069d: (                    ) : jnb .+0x001e              ; 731e  jnb 000006bd 正确读取数据就跳转到000006bd

0000069f: (                    ) : dec byte ptr ss:[bp+0x11] ; fe4e11
000006a2: (                    ) : jnz .+0x000c              ; 0f850c00  jnz 000006b2
000006a6: (                    ) : cmp byte ptr ss:[bp], 0x80 ; 807e0080
000006aa: (                    ) : jz .+0x008a               ; 0f848a00  jz 00000738
000006ae: (                    ) : mov dl, 0x80              ; b280
000006b0: (                    ) : jmp .+0xff82              ; eb82

000006b2: (                    ) : push bp                   ; 55
000006b3: (                    ) : xor ah, ah                ; 32e4
000006b5: (                    ) : mov dl, byte ptr ss:[bp]  ; 8a5600
000006b8: (                    ) : int 0x13                  ; cd13
000006ba: (                    ) : pop bp                    ; 5d
000006bb: (                    ) : jmp .+0xff9c              ; eb9c

000006bd: (                    ) : cmp word ptr ds:0x7dfe, 0xaa55 ; 813ef   
000006c3: (                    ) : jnz .+0x006e              ; 756e           jnz 00000733 判断引导扇区结束标志
000006c5: (                    ) : push word ptr ss:[bp]     ; ff7600
000006c8: (                    ) : call .+0x008a             ; e88a00         call Func1
000006cb: (                    ) : jnz .+0x0015              ; 0f851500       jnz 000006e4
000006cf: (                    ) : mov al, 0xd1              ; b0d1
000006d1: (                    ) : out 0x64, al              ; e664
000006d3: (                    ) : call .+0x007f             ; e87f00         call Func1
000006d6: (                    ) : mov al, 0xdf              ; b0df
000006d8: (                    ) : out 0x60, al              ; e660
000006da: (                    ) : call .+0x0078             ; e87800         call Func1
000006dd: (                    ) : mov al, 0xff              ; b0ff
000006df: (                    ) : out 0x64, al              ; e664
000006e1: (                    ) : call .+0x0071             ; e87100

000006e4: (                    ) : mov ax, 0xbb00            ; b800bb         int 0x1a / AH=0xBB 没有查到是什么作用
000006e7: (                    ) : int 0x1a                  ; cd1a            
000006e9: (                    ) : and eax, eax              ; 6623c0
000006ec: (                    ) : jnz .+0x003b              ; 753b             jnz 00000729
000006ee: (                    ) : cmp ebx, 0x41504354       ; 6681fb5443
000006f5: (                    ) : jnz .+0x0032              ; 7532             jnz 00000729
000006f7: (                    ) : cmp cx, 0x0102            ; 81f90201
000006fb: (                    ) : jb .+0x002c               ; 722c             jb 00000729
000006fd: (                    ) : push 0x0000bb07           ; 666807bb00  eax
00000703: (                    ) : push 0x00000200           ; 6668000200  ecx
00000709: (                    ) : push 0x00000008           ; 6668080000  edx
0000070f: (                    ) : push ebx                  ; 6653        ebx
00000711: (                    ) : push ebx                  ; 6653        esp 
00000713: (                    ) : push ebp                  ; 6655        ebp
00000715: (                    ) : push 0x00000000           ; 6668000000  esi
0000071b: (                    ) : push 0x00007c00           ; 6668007c00  edi  
00000721: (                    ) : popad                     ; 6661        AX = 0xBB00     
00000723: (                    ) : push 0x0000               ; 680000
00000726: (                    ) : pop es                    ; 07
00000727: (                    ) : int 0x1a                  ; cd1a     

00000729: (                    ) : pop dx                    ; 5a
0000072a: (                    ) : xor dh, dh                ; 32f6
0000072c: (                    ) : jmp far 0000:7c00         ; ea007c0000    jmp DBR 的代码中

00000731: (                    ) : int 0x18                  ; cd18

00000733: (                    ) : mov al, byte ptr ds:0x7b7 ; a0b707
00000736: (                    ) : jmp .+0x0008              ; eb08

00000738: (                    ) : mov al, byte ptr ds:0x7b6 ; a0b607
0000073b: (                    ) : jmp .+0x0003              ; eb03         jmp 00000740

0000073d: (                    ) : mov al, byte ptr ds:0x7b5 ; a0b507

00000740: (                    ) : xor ah, ah                ; 32e4
00000742: (                    ) : add ax, 0x0700            ; 050007
00000745: (                    ) : mov si, ax                ; 8bf0

00000747: (                    ) : lodsb al, byte ptr ds:[si] ; ac

00000748: (                    ) : cmp al, 0x00              ; 3c00
0000074a: (                    ) : jz .+0xfffc               ; 74fc   jz 00000748
0000074c: (                    ) : mov bx, 0x0007            ; bb0700
0000074f: (                    ) : mov ah, 0x0e              ; b40e
00000751: (                    ) : int 0x10                  ; cd10
00000753: (                    ) : jmp .+0xfff2              ; ebf2  jmp 00000747 

;Delay 无论向0x60还是0x64端口写东西前都有等状态寄存器0BF变0
00000755: (                    ) : sub cx, cx                ; 2bc9
00000757: (                    ) : in al, 0x64               ; e464
00000759: (                    ) : jmp .+0x0000              ; eb00 jmp 0000075b
0000075b: (                    ) : and al, 0x02              ; 2402
0000075d: (                    ) : loopne .+0xfff8           ; e0f8
0000075f: (                    ) : and al, 0x02              ; 2402
00000761: (                    ) : ret                       ; c3

DBR 分析

00007c00: (                    ) : jmp .+0x0052              ; eb52  jmp 00007c54

后面是数据
nop
db "NTFS", 0

00007c54: (                    ) : cli                       ; fa
00007c55: (                    ) : xor ax, ax                ; 33c0
00007c57: (                    ) : mov ss, ax                ; 8ed0       堆栈段寄存器置为0
00007c59: (                    ) : mov sp, 0x7c00            ; bc007c     把0x7c00 置为栈顶
00007c5c: (                    ) : sti                       ; fb
00007c5d: (                    ) : push 0x07c0               ; 68c007
00007c60: (                    ) : pop ds                    ; 1f         数据段寄存器置为0x07c0
00007c61: (                    ) : push ds                   ; 1e
00007c62: (                    ) : push 0x0066               ; 686600
00007c65: (                    ) : retf                      ; cb             相当于jmp 07c0:0066 (0x07c0 << 4 + 0x0066 = 0x7c66)

00007c66: (                    ) : mov byte ptr ds:0xe, dl   ; 88160e00 Reserved sectors 置为0x80     
00007c6a: (                    ) : cmp dword ptr ds:0x3, 0x5346544e ; 66813e03004e544653 判断File system ID是否是ntfs
00007c73: (                    ) : jnz .+0x0015              ; 7515   jnz 00007c8a
00007c75: (                    ) : mov ah, 0x41              ; b441
00007c77: (                    ) : mov bx, 0x55aa            ; bbaa55
00007c7a: (                    ) : int 0x13                  ; cd13   检查扩展Int13H是否存在,进位标志为1是不支持

00007c7c: (                    ) : jb .+0x000c               ; 720c   jb 00007c8a 不支持跳转

00007c7e: (                    ) : cmp bx, 0xaa55            ; 81fb55aa
00007c82: (                    ) : jnz .+0x0006              ; 7506    jnz 00007c8a 不支持跳转      
00007c84: (                    ) : test cx, 0x0001           ; f7c10100
00007c88: (                    ) : jnz .+0x0003              ; 7503    jnz 00007c8d  支持第二api子集

00007c8a: (                    ) : jmp .+0x00d2              ; e9d200  jmp 00007d5f   

支持int 13H 第一个api子集
00007c8d: (                    ) : push ds                   ; 1e  
00007c8e: (                    ) : sub sp, 0x0018            ; 83ec18   
00007c91: (                    ) : push 0x001a               ; 681a00
00007c94: (                    ) : mov ah, 0x48              ; b448
00007c96: (                    ) : mov dl, byte ptr ds:0xe   ; 8a160e00
00007c9a: (                    ) : mov si, sp                ; 8bf4
00007c9c: (                    ) : push ss                   ; 16
00007c9d: (                    ) : pop ds                    ; 1f
00007c9e: (                    ) : int 0x13                  ; cd13  
                                                            ;AH = 48h
                                                            ;DL = 驱动器号
                                                            ;DS:DI = 返回数据缓冲区地址
                                                            ;取得驱动器参数

                                                            ;struct DriveParametersPacket
                                                            ;{
                                                            ;WORD InfoSize;          // 数据包尺寸:
                                                            ;//(固定值,等于26,即1AH,指本结构所占用的存储空间)
                                                            ;WORD Flags;             // 信息标志
                                                            ;DWORD Cylinders;        // 磁盘柱面数
                                                            ;DWORD Heads;            // 磁盘磁头数
                                                            ;DWORD SectorsPerTrack;  // 每磁道扇区数
                                                            ;QWORD Sectors;          // 磁盘总扇区数
                                                            ;WORD SectorSize;        // 扇区尺寸 (以字节为单位)
                                                            ;};

执行该int 0x13前的堆栈
<bochs:22> print-stack
Stack address size 2
| STACK 0x7be4 [0x001a]  
| STACK 0x7be6 [0x07c0]
| STACK 0x7be8 [0x0000]
| STACK 0x7bea [0x0800]
| STACK 0x7bec [0x7e00]
| STACK 0x7bee [0x07be]
| STACK 0x7bf0 [0x0080]
| STACK 0x7bf2 [0xaa55]
| STACK 0x7bf4 [0x0080]
| STACK 0x7bf6 [0x0007]
| STACK 0x7bf8 [0x3000]
| STACK 0x7bfa [0x007c]
| STACK 0x7bfc [0x07c0]

执行该int 0x13后的堆栈
Stack address size 2
| STACK 0x7be4 [0x001a]  InfoSize
| STACK 0x7be6 [0x0002]  Flags
| STACK 0x7be8 [0x2000]
| STACK 0x7bea [0x0000]  Cylinders
| STACK 0x7bec [0x0040]
| STACK 0x7bee [0x0000]  Heads
| STACK 0x7bf0 [0x0040]
| STACK 0x7bf2 [0x0000]  SectorsPerTrack
| STACK 0x7bf4 [0x0000]
| STACK 0x7bf6 [0x0200]  
| STACK 0x7bf8 [0x0000]
| STACK 0x7bfa [0x0000]  Sectors
| STACK 0x7bfc [0x0200]  SectorSize  

恢复堆栈
00007ca0: (                    ) : lahf                      ; 9f
00007ca1: (                    ) : add sp, 0x0018            ; 83c418
00007ca4: (                    ) : sahf                      ; 9e
00007ca5: (                    ) : pop ax                    ; 58   SectorSize
00007ca6: (                    ) : pop ds                    ; 1f

00007ca7: (                    ) : jb .+0xffe1               ; 72e1  jb 0x7c8a 失败的话就尝试第一api子集
00007ca9: (                    ) : cmp ax, word ptr ds:0xb   ; 3b060b00  判断SectorSize是否和bpb参数中的对应值一致
00007cad: (                    ) : jnz .+0xffdb              ; 75db  jnz 0x7c8a 
00007caf: (                    ) : mov word ptr ds:0xf, ax   ; a30f00  SectorSize
00007cb2: (                    ) : shr word ptr ds:0xf, 0x04 ; c12e0f0004 SectorSize / 16 
                                                            ;这里是为了加到断基址上所以右移4位

00007cb7: (                    ) : push ds                   ; 1e
00007cb8: (                    ) : pop dx                    ; 5a
00007cb9: (                    ) : xor bx, bx                ; 33db
00007cbb: (                    ) : mov cx, 0x2000            ; b90020
00007cbe: (                    ) : sub cx, ax                ; 2bc8
00007cc0: (                    ) : inc dword ptr ds:0x11     ; 66ff061100   读了多少个Sector的计数
00007cc5: (                    ) : add dx, word ptr ds:0xf   ; 03160f00     
00007cc9: (                    ) : mov es, dx                ; 8ec2         指向下一个Sector,接收copy数据
00007ccb: (                    ) : inc word ptr ds:0x16      ; ff061600
00007ccf: (                    ) : call .+0x0040             ; e84000       call ReadData
00007cd2: (                    ) : sub cx, ax                ; 2bc8
00007cd4: (                    ) : jnbe .+0xffef             ; 77ef
00007cd6: (                    ) : mov ax, 0xbb00            ; b800bb
00007cd9: (                    ) : int 0x1a                  ; cd1a
00007cdb: (                    ) : and eax, eax              ; 6623c0
00007cde: (                    ) : jnz .+0x002d              ; 752d
00007ce0: (                    ) : cmp ebx, 0x41504354       ; 6681fb54435041
00007ce7: (                    ) : jnz .+0x0024              ; 7524  jnz 00007d0d

00007ce9: (                    ) : cmp cx, 0x0102            ; 81f90201
00007ced: (                    ) : jb .+0x001e               ; 721e
00007cef: (                    ) : push ss                   ; 16
00007cf0: (                    ) : push 0xbb07               ; 6807bb
00007cf3: (                    ) : push ss                   ; 16
00007cf4: (                    ) : push 0x0e70               ; 68700e
00007cf7: (                    ) : push ss                   ; 16
00007cf8: (                    ) : push 0x0009               ; 680900
00007cfb: (                    ) : push ebx                  ; 6653
00007cfd: (                    ) : push ebx                  ; 6653
00007cff: (                    ) : push ebp                  ; 6655
00007d01: (                    ) : push ss                   ; 16
00007d02: (                    ) : push ss                   ; 16
00007d03: (                    ) : push ss                   ; 16
00007d04: (                    ) : push 0x01b8               ; 68b801
00007d07: (                    ) : popad                     ; 6661
00007d09: (                    ) : push cs                   ; 0e
00007d0a: (                    ) : pop es                    ; 07
00007d0b: (                    ) : int 0x1a                  ; cd1a  

00007d0d: (                    ) : jmp .+0x016a              ; e96a01  jmp 00007E7A  跳转到下一个扇区的7A偏移处执行
                                                            ;及开始执行ntldr代码

00007d10: (                    ) : nop                       ; 90
00007d11: (                    ) : nop                       ; 90

;ReadData
00007d12: (                    ) : pushad                    ; 6660
00007d14: (                    ) : push ds                   ; 1e
00007d15: (                    ) : push es                   ; 06
00007d16: (                    ) : mov eax, dword ptr ds:0x11 ; 66a11100
00007d1a: (                    ) : add eax, dword ptr ds:0x1c ; 6603061c00  Hidden sectors 也就是起始扇区的开始
00007d1f: (                    ) : push ds                   ; 1e
00007d20: (                    ) : push 0x00000000           ; 666800000000
00007d26: (                    ) : push eax                  ; 6650         BlockNum
00007d28: (                    ) : push es                   ; 06
00007d29: (                    ) : push bx                   ; 53           BufferAddr
00007d2a: (                    ) : push 0x0001               ; 680100       BlockCount
00007d2d: (                    ) : push 0x0010               ; 681000       PacketSize 和 Reserved
00007d30: (                    ) : mov ah, 0x42              ; b442
00007d32: (                    ) : mov dl, byte ptr ds:0xe   ; 8a160e00     Reserved sectors
00007d36: (                    ) : push ss                   ; 16
00007d37: (                    ) : pop ds                    ; 1f
00007d38: (                    ) : mov si, sp                ; 8bf4
00007d3a: (                    ) : int 0x13                  ; cd13
00007d3c: (                    ) : pop ecx                   ; 6659
00007d3e: (                    ) : pop bx                    ; 5b
00007d3f: (                    ) : pop dx                    ; 5a
00007d40: (                    ) : pop ecx                   ; 6659
00007d42: (                    ) : pop ecx                   ; 6659
00007d44: (                    ) : pop ds                    ; 1f
00007d45: (                    ) : jb .+0x0016               ; 0f821600     jb 00007d5f
00007d49: (                    ) : inc dword ptr ds:0x11     ; 66ff061100
00007d4e: (                    ) : add dx, word ptr ds:0xf   ; 03160f00
00007d52: (                    ) : mov es, dx                ; 8ec2
00007d54: (                    ) : dec word ptr ds:0x16      ; ff0e1600
00007d58: (                    ) : jnz .+0xffbc              ; 75bc
00007d5a: (                    ) : pop es                    ; 07
00007d5b: (                    ) : pop ds                    ; 1f
00007d5c: (                    ) : popad                     ; 6661
00007d5e: (                    ) : ret                       ; c3

不支持int 13H 第一个api子集 
00007d5f: (                    ) : mov al, byte ptr ds:0x1f8 ; a0f801
00007d62: (                    ) : call .+0x0008             ; e80800       call PrintErrorMsg
00007d65: (                    ) : mov al, byte ptr ds:0x1fb ; a0fb01
00007d68: (                    ) : call .+0x0002             ; e80200       call PrintErrorMsg
00007d6b: (                    ) : jmp .+0xfffe              ; ebfe         hlt

PrintErrorMsg
00007d6d: (                    ) : mov ah, 0x01              ; b401
00007d6f: (                    ) : mov si, ax                ; 8bf0
00007d71: (                    ) : lodsb al, byte ptr ds:[si] ; ac
00007d72: (                    ) : cmp al, 0x00              ; 3c00
00007d74: (                    ) : jz .+0x0009               ; 7409
00007d76: (                    ) : mov ah, 0x0e              ; b40e
00007d78: (                    ) : mov bx, 0x0007            ; bb0700
00007d7b: (                    ) : int 0x10                  ; cd10
00007d7d: (                    ) : jmp .+0xfff2              ; ebf2
00007d7f: (                    ) : ret                       ; c3

总结DBR,拷贝Hidden sectors + 1之后的16个Sector到7e00开始扇区中,然后跳转到0x7e7a处开始执行

BOOTMGR 分析

00007e7a: (                    ) : movzx eax, word ptr ds:0xb ; 660fb7060b00    Bytes per sector
00007e80: (                    ) : movzx ebx, byte ptr ds:0xd ; 660fb61e0d00    Sectors per cluster
00007e86: (                    ) : mul eax, ebx              ; 66f7e3           计算每个蔟的字节数
00007e89: (                    ) : mov dword ptr ds:0x252, eax ; 66a35202       dword ptr[0x7e52] < eax
00007e8d: (                    ) : mov ecx, dword ptr ds:0x40 ; 668b0e4000      FILE record size indicator
00007e92: (                    ) : cmp cl, 0x00              ; 80f900
00007e95: (                    ) : jnle .+0x000e             ; 0f8f0e00          jnle 00007ea7
00007e99: (                    ) : neg cl                    ; f6d9
00007e9b: (                    ) : mov eax, 0x00000001       ; 66b801000000
00007ea1: (                    ) : shl eax, cl               ; 66d3e0            0x400
00007ea4: (                    ) : jmp .+0x0008              ; eb08              jmp 00007eae
00007ea6: (                    ) : nop                       ; 90

00007ea7: (                    ) : mov eax, dword ptr ds:0x252 ; 66a15202
00007eab: (                    ) : mul eax, ecx              ; 66f7e1             计算File Record Entry的大小
                                                            ;                    (字节为单位)

00007eae: (                    ) : mov dword ptr ds:0x266, eax ; 66a36602 
00007eb2: (                    ) : movzx ebx, word ptr ds:0xb ; 660fb71e0b00      Bytes per sector
00007eb8: (                    ) : xor edx, edx              ; 6633d2
00007ebb: (                    ) : div eax, ebx              ; 66f7f3              
00007ebe: (                    ) : mov dword ptr ds:0x256, eax ; 66a35602
00007ec2: (                    ) : call .+0x0495             ; e89504             call 0000835a

偶现在也就分析到这儿了,以后再续吧


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (14)
雪    币: 451
活跃值: (78)
能力值: ( LV12,RANK:470 )
在线值:
发帖
回帖
粉丝
2
qemu-img 这个比较好 感谢提供
这样可以不用在bochs里面安装系统咯
2010-3-18 17:26
0
雪    币: 463
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
完完全全的是打酱油了- - 唉,看不懂啊。。。
2010-4-14 00:30
0
雪    币: 1407
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
貌似以前有位大牛说过qemu-img转换vmdk文件得到的image文件到Bochs是用不了的,楼主这竟然可以。
2010-4-14 09:25
0
雪    币: 50161
活跃值: (20675)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
5
期待续篇再设精华。
2010-4-14 09:35
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
6
mbr和boot sector跟VISTA有什么关系。。。。完整分析了BOOTMGR/WINLOAD/WINRESUME再说是VISTA引导过程分析吧。。。
2010-4-14 10:46
0
雪    币: 727
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
学习下......
2010-4-14 12:31
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
请问下楼主 这个vista的vmdk文件你是在哪里下到的 可以给个链接么 我也想跑一下 但是找了很久发现国外的这个文件很多要付费才能下啊 多谢了哈
2010-4-23 10:34
0
雪    币: 1098
活跃值: (193)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
9
支持,我也觉得较好。
2010-5-13 09:39
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
这个还有点意思,呵呵
2010-5-13 14:58
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
不错,有点意思!
2010-5-14 15:19
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
完全看不懂额
2010-5-14 15:46
0
雪    币: 1098
活跃值: (193)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
13
我也觉得好。支持。
2010-12-9 08:15
0
雪    币: 29
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
不懂,求详细教程。
2010-12-14 03:38
0
雪    币: 392
活跃值: (89)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
15
support!
其实,用winHex读出$boot文件的内容(8K),然后用IDA用16位模式去反汇编,就能看到全部的代码了,当然要显示指定一下代码基地址7c00。

bochs运行太慢,不过,最大的好处是有数据。
2011-4-12 16:06
0
游客
登录 | 注册 方可回帖
返回
//