需要一些DOS下BIOS中断的知识,于是看磁盘操作。
我想实现这么件事情……把自己的程序写进磁盘的MBR里(当然先要备份一份MBR,否则如果你没有装磁盘保护的软件,那就……),这样系统启动就最先启动我的程序,转而再去执行MBR。或许我的想法不对,看一下MBR的引导程序都干了什么。
0013FF28 33 C0 xor eax,eax
0013FF2A 8E D0 mov ss,ax
0013FF2C BC 00 7C FB 50 mov esp,50FB7C00h ;esp指向活动分区的引导程序 MOV SP,7C00 STI PUSH AX
0013FF31 07 pop es
0013FF32 50 push eax
0013FF33 1F pop ds
0013FF34 FC cld
0013FF35 BE 1B 7C BF 1B mov esi,1BBF7C1Bh
0013FF3A 06 push es
0013FF3B 50 push eax
0013FF3C 57 push edi
0013FF3D B9 E5 01 F3 A4 mov ecx,0A4F301E5h
0013FF42 CB retf
0013FF43 BE BE 07 B1 04 mov esi,4B107BEh
0013FF48 38 2C 7C cmp byte ptr [esp+edi*2],ch ;ch=0 ????
0013FF4B 09 75 15 or dword ptr [ebp+15h],esi
0013FF4E 83 C6 10 add esi,10h
0013FF51 E2 F5 loop 0013FF48
0013FF53 CD 18 int 18h ;如果没有活动分区就启动ROM BASIC
0013FF55 8B 14 8B mov edx,dword ptr [ebx+ecx*4]
0013FF58 EE out dx,al
0013FF59 83 C6 10 add esi,10h ;SI指向下一个分区
0013FF5C 49 dec ecx ;计数器减1
0013FF5D 74 16 je 0013FF75 ;分区检测完毕,转入读系统引导区
0013FF5F 38 2C 74 cmp byte ptr [esp+esi*2],ch ;CMP [SI],CH JZ FFFA
0013FF62 F6 BE 10 07 4E AC idiv byte ptr [esi-53B1F8F0h] ;MOV SI,0710 DEC SI LOODSB
0013FF68 3C 00 cmp al,0 ;错误信息显示完毕了吗
0013FF6A 74 FA je 0013FF66 ;是,转入死循环
0013FF6C BB 07 00 B4 0E mov ebx,0EB40007h ;mov bx,0007 mov AH,0Eh
0013FF71 CD 10 int 10h ;显示一个字符
0013FF73 EB F2 jmp 0013FF67
0013FF75 89 46 25 mov dword ptr [esi+25h],eax
0013FF78 96 xchg eax,esi
0013FF79 8A 46 04 mov al,byte ptr [esi+4]
0013FF7C B4 06 mov ah,6
0013FF7E 3C 0E cmp al,0Eh
0013FF80 74 11 je 0013FF93
0013FF82 B4 0B mov ah,0Bh
0013FF84 3C 0C cmp al,0Ch
0013FF86 74 05 je 0013FF8D
0013FF88 3A C4 cmp al,ah
0013FF8A 75 2B jne 0013FFB7
0013FF8C 40 inc eax
0013FF8D C6 46 25 06 mov byte ptr [esi+25h],6
0013FF91 75 24 jne 0013FFB7
0013FF93 BB AA 55 50 B4 mov ebx,0B45055AAh ;MOV BX,55AA PUSH EAX
0013FF98 41 inc ecx ;MOV EAX,41h
0013FF99 CD 13 int 13h ;扩展读扇区
0013FF9B 58 pop eax
0013FF9C 72 16 jb 0013FFB4
0013FF9E 81 FB 55 AA 75 10 cmp ebx,1075AA55h ;CMP EBX,55AA JNZ 0013FFB4
0013FFA4 F6 C1 01 test cl,1 ;TEST CL,1
0013FFA7 74 0B je 0013FFB4
0013FFA9 8A E0 mov ah,al
0013FFAB 88 56 24 mov byte ptr [esi+24h],dl
0013FFAE C7 06 A1 06 EB 1E mov dword ptr [esi],1EEB06A1h
0013FFB4 88 66 04 mov byte ptr [esi+4],ah ;最后处理 ?
0013FFB7 BF 0A 00 B8 01 mov edi,1B8000Ah
0013FFBC 02 8B DC 33 C9 83 add cl,byte ptr [ebx-7C36CC24h] ;INC WORD PTR [DI] JG 0007
0013FFC2 FF 05 7F 03 8B 4E inc dword ptr ds:[4E8B037Fh] ;MOV CX,[BP+25] MOV CX,[BP+02]
0013FFC8 25 03 4E 02 CD and eax,0CD024E03h ;INT 13
0013FFCD 13 72 29 adc esi,dword ptr [edx+29h]
0013FFD0 BE 46 07
0013FFDE 7F DA jg 0013FFBA
0013FFE0 85 F6 test esi,esi
0013FFE2 75 83 jne 0013FF67
0013FFE4 BE 27 07 EB 8A mov esi,8AEB0727h
0013FFE9 98 cwde
0013FFEA 91 xchg eax,ecx
0013FFEB 52 push edx
0013FFEC 99 cdq
0013FFED 03 46 08 add eax,dword ptr [esi+8]
这是我把自己机器MBR反汇编的结果,如果没有磁盘知识就是天书了。实际上无非做了些查找比对活动分区的事情,找到活动分区后转而去执行DBR的引导程序。
今天写了个读取磁盘的小程序,明天试一下。