|
抽了一点时间,注释了一下Mbldr引导程序,有的地方不理解,可能是反汇编工具的不足,总之,抛砖引玉吧,希望高人指点。
寄存器初始化
0:7C00 FA CLI ;禁止中断
0:7C01 31C9 XOR CX,CX ;使CX=0
0:7C03 8ED1 MOV SS,CX ;SS=0
0:7C05 BC007C MOV SP,7C00h ;SP=7C00
0:7C08 89E6 MOV SI,SP ;SI=7C00
0:7C0A 51 PUSH CX ;CX入栈
0:7C0B 07 POP ES ;ES=0
0:7C0C 51 PUSH CX ;CX入栈
0:7C0D 1F POP DS ;DS=0
引导程序代码转移
0:7C0E FC CLD ;置数据传输正方向
0:7C0F BF0006 MOV DI,0600h ;目的指针DI=600
0:7C12 FEC5 INC CH ;使CX=100
0:7C14 F3 REPZ ;CX不为0则重复执行
0:7C15 A5 MOVSW ;按字从7C00传送至600
0:7C16 E9008A JMP 8B19 ;此处实现从7C16到619的转移
据netwinxp版主解释:7C16:E9008A JMP .+8A00;7C19+8A00=0619(溢出部分不管)
显示启动菜单
0:0619 BE0A07 MOV SI,070Ah ;指向70A处的启动菜单字符串
0:061C AC LODSB ;装入一个字节到AL
0:061D 84C0 TEST AL,AL ;测试AL中是否字符串结束字节00
0:061F 7406 JZ Short 0627 ;显示结束转627
0:0621 B40E MOV AH,0Eh ;AH=0E设置以电传模式写屏
0:0623 CD10 INT 10h ;调用显示中断服务程序
0:0625 EBF5 JMP Short 061C ;转到61C
截获INT 1Ch中断
0:0627 66BBF6060000 MOV EBX,000006F6h ;EBX指向替代的临时INT 1Ch中断服务程序
0:062D 66871E7000 XCHG EBX,[0070] ;替换INT 1Ch中断服务程序入口地址向量
0:0632 FB STI ;允许中断
延时及获取键盘输入
0:0633 B639 MOV DH,39h ;DH=39设置键盘等待倒计时初始值
0:0635 B401 MOV AH,01h ;设置获得键盘缓冲区键值功能(不清除缓冲区)
0:0637 CD16 INT 16h ;调用键盘中断服务程序
0:0639 7419 JZ Short 0654 ;未获取到按键值转到654
0:063B B400 MOV AH,00h ;设置读取键盘输入功能(清除缓冲区)
0:063D CD16 INT 16h ;调用键盘中断服务程序
0:063F 3C0D CMP AL,0Dh ;判断是否是回车键
0:0641 7427 JZ Short 066A ;是回车键转到66A
0:0643 3C1B CMP AL,1Bh ;判断是否是Esc键
0:0645 7505 JNZ Short 064C ;不是则转到64C
0:0647 C606F60690 MOV Byte Ptr [06F6],90h ;将6F6处改为NOP空指令
0:064C 88E0 MOV AL,AH ;AL=AH将扫描码送入AL
0:064E 2C3B SUB AL,3Bh ;AL=AL-3B将AL中的扫描码转换为0—5的数值
0:0650 3C06 CMP AL,06h ;将AL与06比较
0:0652 7218 JB Short 066C ;AL小于06转到66C
0:0654 B80100 MOV AX,0001h ;AX=0001
0:0657 39C1 CMP CX,AX ;将CX与AX=1比较
0:0659 72DA JB Short 0635 ;CX小于1转到635
0:065B 29C1 SUB CX,AX ;CX=CX-AX
0:065D B40E MOV AH,0Eh ;AH=0E设置以电传模式写屏
0:065F 88F0 MOV AL,DH ;AL=DH
0:0661 CD10 INT 10h ;调用显示中断服务程序
0:0663 FECE DEC DH ;DH=DH-1
0:0665 80FE30 CMP DH,30h ;将DH与30比较
0:0668 73CB JNB Short 0635 ;不小于30转到635
0:066A B000 MOV AL,00h ;AL=0清除AL中的按键值
0:066C 90 NOP ;空指令
0:066D 90 NOP ;空指令
0:066E 90 NOP ;空指令
恢复INT 1Ch中断
0:066F FA CLI ;关中断
0:0670 66891E7000 MOV [0070],EBX ;恢复INT 1Ch中断服务程序入口地址向量
0:0675 FB STI ;开中断
修整启动扇区号指针
0:0676 98 CBW ;将AL(字节)转换为AX(字)
0:0677 C1E002 SHL AX,02h ;将AX左移两位高位移进CF,低位置0
0:067A 01C6 ADD SI,AX ;SI=79D+AX,SI指向保存的启动扇区号
启动扇区号有效性判断
0:067C 668B2C MOV EBP,[SI] ;将用户选中的启动扇区号送入EBP
0:067F 6645 INC EBP ;EBP=EBP+1通过此动作获取标志
0:0681 7502 JNZ Short 0685 ;根据标志判断EBP是否为FFFF,不是则转到685
0:0683 CD18 INT 18h ;调用INT 18作启动失败处理
0:0685 664D DEC EBP ;EBP=EBP-1还原EBP值
对分区表项做去除隐藏处理并激活启动分区
0:0687 BEBE7D MOV SI,7DBEh ;SI=7DBE指向分区表头
0:068A B90400 MOV CX,0004h ;CX=4设置分区表项搜索计数值
0:068D B000 MOV AL,00h ;AL=0
0:068F 663B6C08 CMP EBP,[SI+08h] ;将EBP与分区表项保留扇区数比较
0:0693 7502 JNZ Short 0697 ;不相等转到697
0:0695 B080 MOV AL,80h ;AL=80
0:0697 8804 MOV [SI],AL ;动态处理[SI]指向的分区表项活动标志
0:0699 8A4404 MOV AL,[SI+04h] ;取当前分区表属性标志到AL
0:069C 0C10 OR AL,10h ;把AL中属性标志值转成隐藏形式
0:069E 3C11 CMP AL,11h ;判断是否是DOS 12-bit FAT分区
0:06A0 7418 JZ Short 06BA ;是则转到6BA
0:06A2 3C14 CMP AL,14h ;判断是否是DOS 3.0+ 16-bit FAT <32M分区
0:06A4 7414 JZ Short 06BA ;是则转到6BA
0:06A6 3C16 CMP AL,16h ;判断是否是DOS 3.31+ 16-bit FAT >32M分区
0:06A8 7410 JZ Short 06BA ;是则转到6BA
0:06AA 3C17 CMP AL,17h ;判断是否是Windows NT NTFS分区
0:06AC 740C JZ Short 06BA ;是则转到6BA
0:06AE 3C1B CMP AL,1Bh ;判断是否是WIN95_OSR2/Win98 FAT32分区
0:06B0 7408 JZ Short 06BA ;是则转到6BA
0:06B2 3C1C CMP AL,1Ch ;判断是否是WIN95_OSR2/Win98 FAT32 LBA分区
0:06B4 7404 JZ Short 06BA ;是则转到6BA
0:06B6 3C1E CMP AL,1Eh ;判断是否是WIN95/98/DOS 16-bit FAT LBA分区
0:06B8 750B JNZ Short 06C5 ;不是则转到6C5
0:06BA 663B6C08 CMP EBP,[SI+08h] ;将EBP与分区表项保留扇区数比较
0:06BE 7502 JNZ Short 06C2 ;不相等则转到6C2
0:06C0 24EF AND AL,0EFh ;AL和EF相与,去除隐藏属性
0:06C2 884404 MOV [SI+04h],AL ;将真实属性写回分区表项
0:06C5 81C61000 ADD SI,0010h ;调整分区表项指针指向下一项
0:06C9 E2C2 LOOP 068D ;循环至68D
将去除隐藏属性的MBR回写
0:06CB BEFA06 MOV SI,06FAh ;SI=6FA指向INT13扩展功能调用包
0:06CE B80043 MOV AX,4300h ;设置INT13扩展写功能
0:06D1 CD13 INT 13h ;调用INT13执行写盘功能
装入用户指定的磁盘DBR并移交引导控制权
0:06D3 6685ED TEST EBP,EBP ;EBP相与
0:06D6 7502 JNZ Short 06DA ;EBP非0转到6DA
0:06D8 FEC2 INC DL ;DL=DL+1
0:06DA 66896C08 MOV [SI+08h],EBP ;将EBP写入扩展功能包读取扇区号位置
0:06DE B442 MOV AH,42h ;设置INT13扩展读功能
0:06E0 CD13 INT 13h ;调用INT13执行读盘功能
0:06E2 7307 JNB Short 06EB ;调用成功转到6EB
0:06E4 B280 MOV DL,80h ;DL=80
0:06E6 6631ED XOR EBP,EBP ;EBP=0
0:06E9 EBEF JMP Short 06DA ;转到6DA
0:06EB 813EFE7D55AA CMP Word Ptr [7DFE],0AA55h ;判断装入扇区的有效性
0:06F1 75F1 JNZ Short 06E4 ;非法扇区转到6E4
0:06F3 E90A75 JMP 7700 ;此处实现到7C00的转移
据netwinxp版主解释:06F3:E90A75 JMP .+750A;06F6+750A=7C00
临时的INT 1Ch中断服务程序
0:06F6 41 INC CX ;CX=CX+1
0:06F7 CF IRET ;中断返回
此处代码未使用
0:06F8 53 PUSH BX ;BX入栈
0:06F9 CB RETF ;返回调用程序
INT13扩展功能调用包,共16字节
0:06FA 1000 ADC [BX+SI],AL ;INT13扩展功能调用包包头
0:06FC 0100 ADD [BX+SI],AX ;
0:06FE 007C00 ADD [SI+00h],BH ;
0:0701 0000 ADD [BX+SI],AL ;
0:0703 0000 ADD [BX+SI],AL ;
0:0705 0000 ADD [BX+SI],AL ;
0:0707 0000 ADD [BX+SI],AL ;
0:0709 000A ADD [BP+SI],CL ;
Mbldr引导程序的内存映像
0:0600 FA 31 C9 8E D1 BC 00 7C-89 E6 51 07 51 1F FC BF z1I.Q<.|.fQ.Q.|?
0:0610 00 06 FE C5 F3 A5 E9 00-8A BE 0A 07 AC 84 C0 74 ..~Es%i..>..,.@t
0:0620 06 B4 0E CD 10 EB F5 66-BB F6 06 00 00 66 87 1E .4.M.kuf;v...f..
0:0630 70 00 FB B6 39 B4 01 CD-16 74 19 B4 00 CD 16 3C p.{694.M.t.4.M.<
0:0640 0D 74 27 3C 1B 75 05 C6-06 F6 06 90 88 E0 2C 3B .t'<.u.F.v...`,;
0:0650 3C 06 72 18 B8 01 00 39-C1 72 DA 29 C1 B4 0E 88 <.r.8..9ArZ)A4..
0:0660 F0 CD 10 FE CE 80 FE 30-73 CB B0 00 90 90 90 FA pM.~N.~0sK0....z
0:0670 66 89 1E 70 00 FB 98 C1-E0 02 01 C6 66 8B 2C 66 f..p.{.A`..Ff.,f
0:0680 45 75 02 CD 18 66 4D BE-BE 7D B9 04 00 B0 00 66 Eu.M.fM>>}9..0.f
0:0690 3B 6C 08 75 02 B0 80 88-04 8A 44 04 0C 10 3C 11 ;l.u.0....D...<.
0:06A0 74 18 3C 14 74 14 3C 16-74 10 3C 17 74 0C 3C 1B t.<.t.<.t.<.t.<.
0:06B0 74 08 3C 1C 74 04 3C 1E-75 0B 66 3B 6C 08 75 02 t.<.t.<.u.f;l.u.
0:06C0 24 EF 88 44 04 81 C6 10-00 E2 C2 BE FA 06 B8 00 $o.D..F..bB>z.8.
0:06D0 43 CD 13 66 85 ED 75 02-FE C2 66 89 6C 08 B4 42 CM.f.mu.~Bf.l.4B
0:06E0 CD 13 73 07 B2 80 66 31-ED EB EF 81 3E FE 7D 55 M.s.2.f1mko.>~}U
0:06F0 AA 75 F1 E9 0A 75 41 CF-53 CB 10 00 01 00 00 7C *uqi.uAOSK.....|
0:0700 00 00 00 00 00 00 00 00-00 00 0A 46 31 2A 43 5F ...........F1*C_
0:0710 50 41 4E 58 50 0D 0A 46-32 20 49 42 4D 5F 50 41 PANXP..F2 IBM_PA
0:0720 4E 0D 0A 46 33 20 44 5F-50 41 4E 20 20 0D 0A 46 N..F3 D_PAN ..F
0:0730 34 20 45 5F 50 41 4E 20-20 0D 0A 46 35 20 46 5F 4 E_PAN ..F5 F_
0:0740 50 41 4E 20 20 0D 0A 46-36 20 44 45 4C 4C 5F 50 PAN ..F6 DELL_P
0:0750 41 4E 0D 0A 0A 45 53 43-20 73 74 6F 70 73 20 32 AN...ESC stops 2
0:0760 73 20 74 69 6D 65 72 0D-0A 45 4E 54 45 52 20 62 s timer..ENTER b
0:0770 6F 6F 74 73 20 64 65 66-61 75 6C 74 0D 0A 46 2D oots default..F-
0:0780 6B 65 79 73 20 62 6F 6F-74 20 4F 53 0D 0A 5B 20 keys boot OS..[
0:0790 20 20 20 20 20 20 20 20-20 5D 0D 5B 00 3F 00 00 ].[.?..
0:07A0 00 5F 62 3C 02 E9 57 FB-02 31 D3 32 08 79 4E 6A ._b<.iW{.1S2.yNj
0:07B0 0D 00 4C A1 12 00 00 00-D9 73 D9 73 00 00 00 01 ..L!....YsYs....
0:07C0 01 00 1C FE FF FF 3F 00-00 00 20 62 3C 02 00 00 ...~..?... b<...
0:07D0 C1 FF 12 FE FF FF 5F 62-3C 02 4B F5 BE 00 00 00 A..~.._b<.Ku>...
0:07E0 C1 FF 0F FE FF FF AA 57-FB 02 56 F4 A5 0F 00 00 A..~..*W{.Vt%...
0:07F0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA ..............U*
注:棕色为INT13扩展功能调用包;蓝色为显示信息;红色为启动分区的绝对扇区号;绿色为磁盘签名;桃红色为分区表。
Mbldr引导程序的反汇编代码.rar
(10.52 KB, 下载次数: 144)
[ 本帖最后由 lvyanan 于 2009-12-3 11:35 编辑 ] |
|