|
花了一上午终于把windows启动光盘中的Bootfix.bin反汇编并看完了。
其实我们可以改写bootfix.bin程序来实现光盘启动的多菜单功能。
反汇编代码如下:
192F:0100 1E PUSH DS
192F:0101 06 PUSH ES
192F:0102 8CC8 MOV AX,CS ;
192F:0104 8ED8 MOV DS,AX ;
192F:0106 8EC0 MOV ES,AX ;
192F:0108 06 PUSH ES ;
192F:0109 B80030 MOV AX,3000 ;
192F:010C 8EC0 MOV ES,AX ;扇区装入数据段3000
192F:010E BB0000 MOV BX,0000 ;扇区装入地址0000
192F:0111 B80102 MOV AX,0201 ;
192F:0114 B90100 MOV CX,0001 ;
192F:0117 BA8000 MOV DX,0080 ;
192F:011A CD13 INT 13 ;读入硬盘引导扇区
192F:011C 7304 JNB 0122 ;读入 成功跳转
192F:011E 07 POP ES ;
192F:011F E9E400 JMP 0206 ;读入 失败跳转
192F:0122 07 POP ES ;多此一举出栈又入栈
192F:0123 06 PUSH ES ;
192F:0124 B80030 MOV AX,3000 ;
192F:0127 8EC0 MOV ES,AX ;
192F:0129 B90400 MOV CX,0004 ;
192F:012C BDBE01 MOV BP,01BE ;BP指向第一分区表记录
192F:012F 26 ES: ;
192F:0130 807E0000 CMP BYTE PTR [BP+00],00 ;是不是活动分区?
192F:0134 7C0B JL 0141 ;是,活动分区跳转
192F:0136 7518 JNZ 0150 ;
192F:0138 83C510 ADD BP,+10 ;不是,指向下一个分区记录
192F:013B E2F2 LOOP 012F ;继续查找活动分区
192F:013D 07 POP ES ;
192F:013E E9C500 JMP 0206 ;
192F:0141 55 PUSH BP ;
192F:0142 83C510 ADD BP,+10 ;指向下一个分区记录;只允许1活动分区其他都是非活动分区才可
192F:0145 49 DEC CX ;
192F:0146 740C JZ 0154 ;
192F:0148 26 ES: ;
192F:0149 807E0000 CMP BYTE PTR [BP+00],00 ;是不是活动分区?
192F:014D 74F3 JZ 0142 ;是,非活动分区跳转
192F:014F 5D POP BP ;
192F:0150 07 POP ES ;
192F:0151 E9B200 JMP 0206 ;
192F:0154 5D POP BP ;
192F:0155 07 POP ES ;
192F:0156 BE4301 MOV SI,0143 ;装入提示字符串地址
192F:0159 AC LODSB ;
192F:015A A26401 MOV [0164],AL ;存入首字符到[0164]内存
192F:015D 56 PUSH SI ;
192F:015E BE4301 MOV SI,0143 ;
192F:0161 E8C500 CALL 0229 ;调用函数显示 Press any key to boot from CD
192F:0164 5E POP SI ;
192F:0165 B98000 MOV CX,0080 ;
192F:0168 B401 MOV AH,01 ;是否有普通键按下
192F:016A CD16 INT 16 ;
192F:016C 7406 JZ 0174 ;ZF=1无按键 ZF=0有按键
192F:016E B400 MOV AH,00 ;
192F:0170 CD16 INT 16 ;
192F:0172 E2F4 LOOP 0168 ;读取按键值循环
192F:0174 FA CLI ;
192F:0175 06 PUSH ES ;
192F:0176 33C0 XOR AX,AX ;//修改定时中断向量表
192F:0178 8EC0 MOV ES,AX ;ES=0000
192F:017A BB2000 MOV BX,0020 ;
192F:017D 26 ES: ;
192F:017E 8B07 MOV AX,[BX] ;
192F:0180 A36701 MOV [0167],AX ;保存原中断服务程序地址
192F:0183 26 ES: ;
192F:0184 8B4702 MOV AX,[BX+02] ;
192F:0187 A36901 MOV [0169],AX ;保存原中断服务程序段地址
192F:018A 26 ES: ;
192F:018B C7070901 MOV WORD PTR [BX],0109 ;写入新中断服务程序地址
192F:018F 26 ES: ;
192F:0190 8C4F02 MOV [BX+02],CS ;写入新中断服务程序段地址
192F:0193 07 POP ES ;
192F:0194 FB STI ;
192F:0195 803E640100 CMP BYTE PTR [0164],00 ;
192F:019A 7406 JZ 01A2 ;
192F:019C B401 MOV AH,01 ;是否有普通键按下
192F:019E CD16 INT 16 ;
192F:01A0 7543 JNZ 01E5 ;ZF=1无按键 ZF=0有按键
192F:01A2 B402 MOV AH,02 ;
192F:01A4 CD16 INT 16 ;读8个功能键状态
192F:01A6 2404 AND AL,04 ;
192F:01A8 753B JNZ 01E5 ;是否有Ctrl/Alt/Shift键按下
192F:01AA 833E6D0100 CMP WORD PTR [016D],+00 ;
192F:01AF 7F0E JG 01BF ;
192F:01B1 56 PUSH SI ;
192F:01B2 BE6501 MOV SI,0165 ;
192F:01B5 E87100 CALL 0229 ;调用函数显示 I
192F:01B8 5E POP SI ;
192F:01B9 C7066D011200 MOV WORD PTR [016D],0012 ;
192F:01BF 833E6B0100 CMP WORD PTR [016B],+00 ;
192F:01C4 75CF JNZ 0195 ;循环检查按键是否按下,直到等待结束
192F:01C6 E80300 CALL 01CC ;
192F:01C9 EB20 JMP 01EB ;引导硬盘启动
192F:01CB 90 NOP ;
192F:01CC FA CLI ;//定时中断处理程序恢复
192F:01CD 06 PUSH ES ;
192F:01CE 33C0 XOR AX,AX ;
192F:01D0 8EC0 MOV ES,AX ;
192F:01D2 BB2000 MOV BX,0020 ;
192F:01D5 A16701 MOV AX,[0167] ;
192F:01D8 26 ES: ;
192F:01D9 8907 MOV [BX],AX ;恢复原中断服务程序地址
192F:01DB A16901 MOV AX,[0169] ;
192F:01DE 26 ES: ;
192F:01DF 894702 MOV [BX+02],AX ;恢复原中断服务程序段地址
192F:01E2 07 POP ES ;
192F:01E3 FB STI ;
192F:01E4 C3 RET ;
192F:01E5 E8E4FF CALL 01CC ;
192F:01E8 EB1C JMP 0206 ;
192F:01EA 90 NOP ;
192F:01EB B80030 MOV AX,3000 ;读入的硬盘启动区扇区复制到启动地址空间
192F:01EE 8ED8 MOV DS,AX ;
192F:01F0 33C0 XOR AX,AX ;
192F:01F2 8EC0 MOV ES,AX ;
192F:01F4 33F6 XOR SI,SI ;
192F:01F6 BF007C MOV DI,7C00 ;
192F:01F9 B90002 MOV CX,0200 ;
192F:01FC FC CLD ;
192F:01FD F3 REPZ ;
192F:01FE A4 MOVSB ;
192F:01FF B280 MOV DL,80 ;
192F:0201 EA007C0000 JMP 0000:7C00 ;引导硬盘启动扇区
192F:0206 07 POP ES ;
192F:0207 1F POP DS ;
192F:0208 CB RETF ;
192F:0209 9C PUSHF ;//新 INT 8H 定时中断处理程序
192F:020A FA CLI ;
192F:020B 2E CS: ;
192F:020C 833E6B0100 CMP WORD PTR [016B],+00 ;
192F:0211 740A JZ 021D ;
192F:0213 2E CS: ;
192F:0214 FF0E6D01 DEC WORD PTR [016D] ;
192F:0218 2E CS: ;
192F:0219 FF0E6B01 DEC WORD PTR [016B] ;
192F:021D 9D POPF ;
192F:021E 2E CS: ;
192F:021F FF366901 PUSH [0169] ;
192F:0223 2E CS: ;
192F:0224 FF366701 PUSH [0167] ;
192F:0228 CB RETF ;//返回原 INT 8H 中断处理程序
192F:0229 50 PUSH AX ;//显示函数
192F:022A 53 PUSH BX ;
192F:022B 803E640100 CMP BYTE PTR [0164],00 ;
192F:0230 740E JZ 0240 ;
192F:0232 AC LODSB ;
192F:0233 3C00 CMP AL,00 ;以0x00结尾停止显示
192F:0235 7409 JZ 0240 ;
192F:0237 B40E MOV AH,0E ;TTY_TEXT
192F:0239 BB0700 MOV BX,0007 ;
192F:023C CD10 INT 10 ;调用中断显示提示文字
192F:023E EBF2 JMP 0232 ;
192F:0240 5B POP BX ;
192F:0241 58 POP AX ;
192F:0242 C3 RET ;
-d 243
192F:0240 0D 0A 50 72 65-73 73 20 61 6E 79 20 6B ..Press any k
192F:0250 65 79 20 74 6F 20 62 6F-6F 74 20 66 72 6F 6D 20 ey to boot from
192F:0260 43 44 2E 00 00 2E 00 00-00 00 00 49 00 12 00 00 CD.........I....
192F:0270 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
192F:0280 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
192F:0290 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
192F:02A0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
192F:02B0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
192F:02C0 00 00 00 ... |
|