在ubuntu下安装nasm汇编工具:
sudo apt-get install nasm
反汇编MBR:
sudo dd if=/dev/sdb of=/tmp/sdb.mbr count=1
ndisasm -o0x7c00 ./sdb.mbr
mbr反汇编代码如下:
00007C00 FA cli #清中断
00007C01 B80010 mov ax,0x1000
00007C04 8ED0 mov ss,ax #ss-> 0x1000
00007C06 BC00B0 mov sp,0xb000 #sp-> 0xb000
00007C09 B80000 mov ax,0x0
00007C0C 8ED8 mov ds,ax # ds-> 0x0
00007C0E 8EC0 mov es,ax # es-> 0x0
00007C10 FB sti # 开中断
00007C11 BE007C mov si,0x7c00 # ds:si -> 0:0x7c00
00007C14 BF0006 mov di,0x600 # es:di -> 0:0x600
00007C17 B90002 mov cx,0x200 # cs-> 0x200
00007C1A F3A4 rep movsb # while(cs>0) ds:si --> es:di #即将mbr加载到0:0x600处:
00007C1C EA21060000 jmp word 0x0:0x621 # 跳到0:0x621处, 也就是从0:0x7c21处复制到0:0x621的代码.
#以下的运行地址应由0x7cxx变成0x06xx
00007C21 BEBE07 mov si,0x7be # si--> 0x7be, 0x7be就是0x600 + 0x1be, 0x1be也就是mbr的0x1be偏移,也就是第一个主分区的活动标志,0x80/0x0
00007C24 3804 cmp [si],al # if (MBR[0x1be] == 0) 说明是非活动分区
00007C26 750B jnz 0x7c33 # 如果是活动分区的话,则跳到0:0x7c33, 即找到了活动分区开始引导操作系统.
00007C28 83C610 add si,byte +0x10 # 没有找到活动分区,指针移动16字节, 一个主分区记录正好是16字节。
00007C2B 81FEFE07 cmp si,0x7fe # 继续判断是否是0x80;
00007C2F 75F3 jnz 0x7c24 # 不是的话,继续进行。
00007C31 EB16 jmp short 0x7c49 # 没有找到活动分区,则跳到0:0x7c49
00007C33 B402 mov ah,0x2 # ... 此处是读取操作系统引导代码。
00007C35 B001 mov al,0x1
00007C37 BB007C mov bx,0x7c00
00007C3A B280 mov dl,0x80
00007C3C 8A7401 mov dh,[si+0x1]
00007C3F 8B4C02 mov cx,[si+0x2]
00007C42 CD13 int 0x13
00007C44 EA007C0000 jmp word 0x0:0x7c00
00007C49 EBFE jmp short 0x7c49 # ... 死循环。加载操作系统失败。