无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 6842|回复: 22

Mbldr引导程序的反汇编代码注释

[复制链接]
发表于 2009-11-30 13:35:59 | 显示全部楼层 |阅读模式
抽了一点时间,注释了一下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)
发表于 2009-11-30 13:40:50 | 显示全部楼层
Lvyanan老师杰作,支持!!!
这下可好了!
好好学习!
回复

使用道具 举报

发表于 2009-11-30 14:00:50 | 显示全部楼层
lvyanan老师辛苦了!
回复

使用道具 举报

发表于 2009-11-30 15:01:07 | 显示全部楼层
的确lvyanan老师辛苦了!

我在给模板时就把前一个 CD13 清零了!
防止回写MBR的,就可以随意编辑了!
回复

使用道具 举报

发表于 2009-11-30 15:18:31 | 显示全部楼层
想要增加彩色菜单或中文,试试看?!
回复

使用道具 举报

发表于 2009-11-30 15:24:23 | 显示全部楼层
一共才512K,差不多没有可以优化的代码了,想要加彩色菜单就要删除一些其它功能....
回复

使用道具 举报

发表于 2009-11-30 15:31:35 | 显示全部楼层

回复 #6 dws_001 的帖子

参照Lvyanan老师的1JF9,增加扇区数,调用第二扇区呀,
回复

使用道具 举报

发表于 2009-11-30 15:35:16 | 显示全部楼层
- -那是可以的,如果前63扇区都拿来用,可以做出很漂亮的效果,但那就不是MBLDR了.
回复

使用道具 举报

 楼主| 发表于 2009-11-30 15:50:23 | 显示全部楼层
这个程序构思并不见得很好,但它有一个Windows下的程序支持,可以比较容易部署而已,若不对扩展逻辑磁盘的DBR进行处理,扩展逻辑盘是不能启动的。
回复

使用道具 举报

发表于 2009-11-30 15:58:26 | 显示全部楼层
个人感觉主要是增加了一个INT 13H的扩展读写功能.还有就是楼上所说的有一个Windows下的程序支持,单纯从程序学习上来说,没有太多新意。
回复

使用道具 举报

 楼主| 发表于 2009-11-30 16:35:03 | 显示全部楼层
这个引导程序不具有对扩展逻辑磁盘的隐藏属性实施开关的功能。
回复

使用道具 举报

发表于 2009-11-30 18:00:08 | 显示全部楼层

回复 #12 lvyanan 的帖子

其实隐藏隐藏属性实施开关的功能用分区软件或WINHEX写一下,麻烦点而已。
我主要看好它直接启动扇区的功能,呵呵
回复

使用道具 举报

发表于 2009-11-30 20:02:51 | 显示全部楼层
我来解释红色部分
7C16:E9008A JMP .+8A00;7C19+8A00=0619(溢出部分不管)
同理
06F3:E90A75 JMP .+750A;06F6+750A=7C00

***E9机器码后面跟的是一个16位无符号立即数,表示段地址为CS,并把下一条指令的IP值加上那个16位无符号数的结果作为目标地址的偏移量进行跳转,简记为JMP .+rel16(不同汇编器写法可能略有差异),该跳转属于near型段内跳转,段间跳转通常记为JMP FAR xxxx:xxxx***

[ 本帖最后由 netwinxp 于 2009-11-30 20:16 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2009-11-30 20:33:55 | 显示全部楼层

回复 #14 netwinxp 的帖子

猫兄果然高明,受教了,原来是段内回环了,这种用法是想掩人耳目,还是为了避免被误认为病毒而做的回避?今后可以如法炮制了。
回复

使用道具 举报

发表于 2009-11-30 20:49:41 | 显示全部楼层
蛙兄过奖了,主要是我以前搞过单片机,有时候需要手工汇编,对机器码比较关心,不过这种指令不兼容8086,所以如果直接编写masm的话,要像用mov eax,...一样,在用之前要用.386伪指令标出,不过你一般用debug(只能显示8086兼容指令),所以只好直接用机器码。
回复

使用道具 举报

 楼主| 发表于 2009-11-30 21:13:37 | 显示全部楼层
呵呵!我可以用debug32来汇编。
回复

使用道具 举报

发表于 2009-11-30 21:14:19 | 显示全部楼层
lvyanan 老师完全可以提取其直接读入绝对扇区号的机制,来编写新的1JF9,应该可行!

改写它还不如重新编写!
回复

使用道具 举报

 楼主| 发表于 2009-11-30 21:21:28 | 显示全部楼层
原帖由 天涯海角1216 于 2009-11-30 21:14 发表
lvyanan 老师完全可以提取其直接读入绝对扇区号的机制,来编写新的1JF9,应该可行!
改写它还不如重新编写!

我也是用类似于这个程序的方法来实施启动扩展磁盘的,提取绝对扇区号的程序不在引导程序里,我的初始化程序里,已经有绝对扇区号提取功能和伪主分区修改功能了,不需要用他的机制,问题是我不会windows下的编程,所以我没法做与Mbldr一样的程序,否则我肯定做得比它的好,我的算法并不亚于它。
回复

使用道具 举报

发表于 2009-11-30 22:59:06 | 显示全部楼层
masm32虽然还是汇编句子格式,但由于PE格式的EXE(相对于MZ格式来说)绝大多数的部分是win api调用(绝大多数的句子是INVOKE ...),所以以其说masm32是汇编还不如说它是优化了的C++。
要学asm for win32先学C++。
我记得“小处”asm32搞得不错,不过那家伙好久没上论坛了。

[ 本帖最后由 netwinxp 于 2009-11-30 23:01 编辑 ]
回复

使用道具 举报

发表于 2009-12-3 00:12:03 | 显示全部楼层
太感谢老大的分享了,支持一下
回复

使用道具 举报

发表于 2021-1-18 23:02:54 | 显示全部楼层
感谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-4-18 10:41

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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