| 
 | 
找到了以前保存的光盘,现将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 编辑 ] |   
 
 
 
 |