|
找到了以前保存的光盘,现将01年我改编过的主引导程序源码提供如下,有注释,自己消化吧。
&&&&&&&&&&&&&&&&&&
&&原主引导程序段&&
&&&&&&&&&&&&&&&&&&
0600 FA CLI ;关中断
0601 33C0 XOR AX,AX ;AX清0
0603 8ED0 MOV SS,AX ;SS清0
0605 BC007C MOV SP,7C00 ;堆栈指针指向7C00
0608 8BF4 MOV SI,SP ;源指针指向7C00
060A 50 PUSH AX ;AX入栈
060B 07 POP ES ;ES清0
060C 50 PUSH AX ;AX入栈
060D 1F POP DS ;DS清0
060E FB STI ;开中断
060F FC CLD ;设置数据传输正方向
0610 BF0006 MOV DI,0600 ;目的指针指向600
0613 B90001 MOV CX,0100 ;设置数据传输512个字节
0616 F2 REPNZ ;设置重复
0617 A5 MOVSW ;字传输
0618 EAC1060000 JMP 0000:06C1 ;转移到0:6C1(嵌入的程序)
061D BEBE07 MOV SI,07BE ;源指针指向7BE(第一表项头部)
0620 B304 MOV BL,04 ;设置操作次数
0622 803C80 CMP BYTE PTR [SI],80 ;判断SI所指定的表项是否活动分区
0625 740E JZ 0635 ;是则转635行执行
0627 803C00 CMP BYTE PTR [SI],00 ;判断SI所指定的表项是否非活动分区
062A 751C JNZ 0648 ;不是则转648行执行
062C 83C610 ADD SI,+10 ;源指针加10指向下一表项头部
062F FECB DEC BL ;操作计数减1
0631 75EF JNZ 0622 ;操作计数非0转622行执行
0633 CD18 INT 18 ;执行INT18中断(启动ROM-BASIC)
0635 8B14 MOV DX,[SI] ;准备读操作系统引导扇的磁头和盘标志
0637 8B4C02 MOV CX,[SI+02] ;准备读操作系统引导扇的柱面和扇区号
063A 8BEE MOV BP,SI ;保存活动分区的头指针
063C 83C610 ADD SI,+10 ;源指针加10指向下一表项头部
063F FECB DEC BL ;操作计数减1
0641 741A JZ 065D ;操作计数为0转65D行执行
0643 803C00 CMP BYTE PTR [SI],00 ;判断下一表项有否活动标记
0646 74F4 JZ 063C ;没有则转63C行执行
0648 BE8B06 MOV SI,068B ;SI指向多活动分区出错信息头部
064B AC LODSB ;取SI指向的显示信息字节
064C 3C00 CMP AL,00 ;判断显示信息字节是否结束为标志0
064E 740B JZ 065B ;是则转65B行执行
0650 56 PUSH SI ;SI入栈保存
0651 BB0700 MOV BX,0007 ;
0654 B40E MOV AH,0E ;设置INT10中断0E功能号
0656 CD10 INT 10 ;执行INT10中断显示字符
0658 5E POP SI ;恢复SI值
0659 EBF0 JMP 064B ;转移到64B行执行
065B EBFE JMP 065B ;转移到65B行执行
065D BF0500 MOV DI,0005 ;设置磁盘操作重试次数
0660 BB007C MOV BX,7C00 ;设置操作系统引导程序存储偏移指针
0663 B80102 MOV AX,0201 ;设置INT13中断读一个扇区功能
0666 57 PUSH DI ;DI入栈保存
0667 CD13 INT 13 ;执行INT13中断读操作系统引导程序
0669 5F POP DI ;恢复DI值
066A 730C JNB 0678 ;读盘成功转678行执行
066C 33C0 XOR AX,AX ;读盘失败,AX清0
066E CD13 INT 13 ;执行INT13中断,初始化磁盘
0670 4F DEC DI ;磁盘操作重试次数减1
0671 75ED JNZ 0660 ;DI不为0转660行执行
0673 BEA306 MOV SI,06A3 ;否则SI指向显示错误装入操作系统的信息
0676 EBD3 JMP 064B ;转到64B行执行出错信息显示功能
0678 BEB506 MOV SI,06B5 ;SI指向显示找不到操作系统的信息
067B BFFE7D MOV DI,7DFE ;DI指向操作系统引导程序尾部
067E 813D55AA CMP WORD PTR [DI],AA55 ;判断该引导扇合法否
0682 75C7 JNZ 064B ;不合法转64B行显示SI指向的信息
0684 8BF5 MOV SI,BP ;SI指向活动分区头部
0686 EA007C0000 JMP 0000:7C00 ;转移到操作系统引导程序处执行
&&&&&&&&&&&&&&&&
&&密码锁程序段&&
&&&&&&&&&&&&&&&&
06C1 BEBE07 MOV SI,07BE ;SI指向分区表头
06C4 B80080 MOV AX,8000 ;预置AX寄存器值
06C7 3804 CMP [SI],AL ;判断第一表项是否活动分区
06C9 740B JZ 06D6 ;不是活动分区则执行6D6行
06CB 8804 MOV [SI],AL ;将第一表项设为非活动分区
06CD 884404 MOV [SI+04],AL ;将第一表项的操作系统标志设为00
06D0 886410 MOV [SI+10],AH ;将第二表项设为活动分区
06D3 E80F00 CALL 06E5 ;调用主引导扇区回写子过程
06D6 A11704 MOV AX,[0417] ;取BIOS键盘状态字
06D9 240C AND AL,0C ;屏蔽CTRL与ALT以外的键状态位
06DB 3C0C CMP AL,0C ;判断是否按下CTRL与ALT键
06DD 7461 JZ 0740 ;是则转740行进行密码修改操作
06DF 3C04 CMP AL,04 ;判断是否按下CTRL键
06E1 743E JZ 0721 ;是则转721行进行密码验证操作
06E3 EB56 JMP 073B ;否则转73B行执行原主引导程序
&&&&&&回写主引导扇区子过程&&&&&&
06E5 B80103 MOV AX,0301 ;设置写功能03及操作扇区数为01
06E8 BB0006 MOV BX,0600 ;设置磁盘操作数据的缓冲区偏移量600
06EB B90100 MOV CX,0001 ;设置硬盘操作的柱面号00及扇区号01
06EE BA8000 MOV DX,0080 ;设置硬盘标志80及00磁头号
06F1 CD13 INT 13 ;执行INT13磁盘I/O中断
06F3 C3 RET ;返回调用程序
&&&&&&密码验证子过程&&&&&&
06F4 BF2000 MOV DI,0020 ;设置控制键盘输入的最大键数
06F7 BEB007 MOV SI,07B0 ;SI指向输入密码提示信息头
06FA E88500 CALL 0782 ;调用显示输入密码提示信息的子过程
06FD BE9507 MOV SI,0795 ;SI指向密码区长度字节
0700 31DB XOR BX,BX ;初始化密码位偏移指针
0702 B410 MOV AH,10 ;设置INT16的AH功能号为10
0704 43 INC BX ;密码位偏移指针加1
0705 8A0C MOV CL,[SI] ;密码长度字节送入CL
0707 80F900 CMP CL,00 ;判断密码长度是否为0
070A 7414 JZ 0720 ;为0转720行返回调用程序
070C 4F DEC DI ;键盘输入键数减1
070D 7411 JZ 0720 ;键盘输入控制数为0转720行返回调用程序
070F CD16 INT 16 ;执行BIOS键盘I/O中断,读取键值到AL
0711 D0C8 ROR AL,1 ;将AL中的ASCII码右移循环1位
0713 3A00 CMP AL,[BX+SI] ;判断对应位密码值是否相符
0715 75E9 JNZ 0700 ;不相符转700行从头比较
0717 FEC9 DEC CL ;相符密码长度值减1
0719 7405 JZ 0720 ;密码长度值为0表示密码验证通过,返回调用程序
071B 43 INC BX ;密码位偏移指针加1
071C 31C0 XOR AX,AX ;设置INT16的AH功能号为0
071E EBEF JMP 070F ;转到70F行继续进行密码比较
0720 C3 RET ;返回调用程序
&&&&&&启动隐藏分区程序段&&&&&&
0721 E8D0FF CALL 06F4 ;调用密码验证子过程
0724 80F900 CMP CL,00 ;判断密码验证是否通过
0727 7512 JNZ 073B ;CL非0为未通过,转23B执行原主引导程序
0729 B80680 MOV AX,8006 ;预置AX寄存器值
072C 8826BE07 MOV [07BE],AH ;将第一表项设为活动分区
0730 A2C207 MOV [07C2],AL ;将第一表项设为有效操作系统标志
0733 31C0 XOR AX,AX ;AX寄存器清0
0735 A2CE07 MOV [07CE],AL ;清除第二表项的活动分区标志
0738 E8AAFF CALL 06E5 ;调用回写主引导扇区的子过程
073B EA1D060000 JMP 0000:061D ;转去执行原主引导程序
&&&&&&密码修改程序段&&&&&&
0740 E8B1FF CALL 06F4 ;调用密码验证子过程
0743 80F900 CMP CL,00 ;判断密码验证是否通过
0746 75F3 JNZ 073B ;CL非0为未通过,转73B执行原主引导程序
0748 BEA507 MOV SI,07A5 ;SI指向输入新密码提示信息头
074B E83400 CALL 0782 ;调用显示输入密码提示信息的子过程
074E BF0A00 MOV DI,000A ;置密码长度控制寄存器值
0751 BE9507 MOV SI,0795 ;SI指向密码及密码长度存储区
0754 31DB XOR BX,BX ;设置密码及密码长度偏移指针
0756 B410 MOV AH,10 ;设置INT16中断的功能号
0758 CD16 INT 16 ;执行INT16中断,读键值到AL
075A 3C0D CMP AL,0D ;判断是否回车键
075C 740A JZ 0768 ;是回车键转768行执行
075E D0C8 ROR AL,1 ;将AL中的ASCII码右移循环1位
0760 43 INC BX ;密码位偏移指针加1
0761 8800 MOV [BX+SI],AL ;将加密的新密码值写入密码存储区
0763 4F DEC DI ;密码长度控制寄存器值减1
0764 7402 JZ 0768 ;密码长度为0转768行执行
0766 EBEE JMP 0756 ;转移到756行继续输入新密码值
0768 881C MOV [SI],BL ;将密码长度计数值写入密码长度存储位
076A BEA007 MOV SI,07A0 ;SI指向重新输入新密码提示信息头
076D 31DB XOR BX,BX ;设置密码及密码长度偏移指针
076F 8A1E9507 MOV BL,[0795] ;取新密码长度到BL
0773 89DF MOV DI,BX ;使DI等于新密码长度
0775 E882FF CALL 06FA ;调用密码验证子过程
0778 80F900 CMP CL,00 ;判断新密码验证是否通过
077B 75CB JNZ 0748 ;验证未通过转748行重新输入新密码
077D E865FF CALL 06E5 ;调用回写主引导扇区子过程
0780 EBB9 JMP 073B ;转去执行原主引导程序
&&&&&&修改原主引导程序显示过程的子过程&&&&&&
0782 B2C3 MOV DL,C3 ;将DL置为C3(RET指令的机器码)
0784 86165B06 XCHG DL,[065B] ;将原主引导程序显示信息程序段改为子过程
0788 B80300 MOV AX,0003 ;设置INT10中断功能号为03
078B CD10 INT 10 ;执行INT10中断,将屏幕设为25列X80行显示模式
078D E8BBFE CALL 064B ;调用原主引导程序的显示程序
0790 86165B06 XCHG DL,[065B] ;将原主引导程序显示信息程序段还原
0794 C3 RET ;返回调用程序
&&&&&&主引导扇区的内存映象&&&&&&
0600 FA 33 C0 8E D0 BC 00 7C-8B F4 50 07 50 1F FB FC .3.....|..P.P...
0610 BF 00 06 B9 00 01 F2 A5-EA C1 06 00 00 BE BE 07 ................
0620 B3 04 80 3C 80 74 0E 80-3C 00 75 1C 83 C6 10 FE ...<.t..<.u.....
0630 CB 75 EF CD 18 8B 14 8B-4C 02 8B EE 83 C6 10 FE .u......L.......
0640 CB 74 1A 80 3C 00 74 F4-BE 8B 06 AC 3C 00 74 0B .t..<.t.....<.t.
0650 56 BB 07 00 B4 0E CD 10-5E EB F0 EB FE BF 05 00 V.......^.......
0660 BB 00 7C B8 01 02 57 CD-13 5F 73 0C 33 C0 CD 13 ..|...W.._s.3...
0670 4F 75 ED BE A3 06 EB D3-BE B5 06 BF FE 7D 81 3D Ou...........}.=
0680 55 AA 75 C7 8B F5 EA 00-7C 00 00 49 6E 76 61 6C U.u.....|..Inval
0690 69 64 20 70 61 72 74 69-74 69 6F 6E 20 74 61 62 id partition tab
06A0 6C 65 00 45 72 72 6F 72-20 6C 6F 61 64 69 6E 67 le.Error loading
06B0 20 4F BE 53 00 4D 69 73-73 69 6E 67 20 4F BE 53 O.S.Missing O.S
06C0 00 BE BE 07 B8 00 80 38-04 74 0B 88 04 88 44 04 .......8.t....D.
06D0 88 64 10 E8 0F 00 A1 17-04 24 0C 3C 0C 74 61 3C .d.......$.<.ta<
06E0 04 74 3E EB 56 B8 01 03-BB 00 06 B9 01 00 BA 80 .t>.V...........
06F0 00 CD 13 C3 BF 20 00 BE-B0 07 E8 85 00 BE 95 07 ..... ..........
0700 31 DB B4 10 43 8A 0C 80-F9 00 74 14 4F 74 11 CD 1...C.....t.Ot..
0710 16 D0 C8 3A 00 75 E9 FE-C9 74 05 43 31 C0 EB EF ...:.u...t.C1...
0720 C3 E8 D0 FF 80 F9 00 75-12 B8 06 80 88 26 BE 07 .......u.....&..
0730 A2 C2 07 31 C0 A2 CE 07-E8 AA FF EA 1D 06 00 00 ...1............
0740 E8 B1 FF 80 F9 00 75 F3-BE A5 07 E8 34 00 BF 0A ......u.....4...
0750 00 BE 95 07 31 DB B4 10-CD 16 3C 0D 74 0A D0 C8 ....1.....<.t...
0760 43 88 00 4F 74 02 EB EE-88 1C BE A0 07 31 DB 8A C..Ot........1..
0770 1E 95 07 89 DF E8 82 FF-80 F9 00 75 CB E8 65 FF ...........u..e.
0780 EB B9 B2 C3 86 16 5B 06-B8 03 00 CD 10 E8 BB FE ......[.........
0790 86 16 5B 06 C3 00 00 00-00 00 00 00 00 00 00 00 ..[.............
07A0 07 07 52 65 2D 07 49 6E-70 75 74 20 6E 65 77 20 ..Re-.Input new
07B0 70 61 73 73 77 6F 72 64-3A 07 07 00 00 00 00 01 password:.......
07C0 01 00 00 FE 3F 3F 3F 00-00 00 01 B0 0F 00 80 00 ....???.........
07D0 01 40 0B FE 7F 44 40 B0-0F 00 C5 FA 3F 00 00 00 ....D@.....?...
07E0 41 45 05 FE BF 0A 05 AB-4F 00 46 89 30 00 00 00 AE......O.F.0...
07F0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA ..............U.
注:
7A0,7A1,7A5,7B9,7BA处的07值为ASCII码的发声码
[ 本帖最后由 lvyanan 于 2007-12-12 08:26 PM 编辑 ] |
|