VisualC++情報セキュリティプログラミング(3)インラインアセンブリによるプライマリブート領域のバックアップとリカバリ


ハードディスク(HDD)の最初のセクタは、ハードディスク(HDD)のメインブート記録MBR(Main Boot Record)とパーティションテーブルDPT(Disk Partition Table)を含む、ハードディスク全体の0トラック0の柱面1セクタに位置するメインブートセクタとして保持される.プライマリ・ブート・レコードの役割は、パーティション・テーブルが正しいかどうかを確認し、どのパーティションがブート・パーティションであるかを決定し、プログラムの終了時にそのパーティションの起動プログラム(すなわちオペレーティング・システム・ブート・セクタ)をメモリに呼び出して実行することです.パーティションテーブルについては、80 Hまたは00 Hを開始フラグとし、55 AAHを終了フラグとし、64バイトで、このセクタの最末端に位置していることが知られています.
 
=ハードディスクマスタブートレコード(MBR)+ハードディスクパーティションテーブル(DPT)
FDISKによるハードディスクのパーティション化は、ハードディスク全体に属する、ある独立したDOSパーティションに属さないことがハードディスクの正しい起動と使用の必要条件である.
物理位置:0柱面0ヘッド1セクタ(Cylinder 0,Head 0,Sector 1)
システムセクタ(System Sectors):0 C-0 H-2 S,0 C-0 H-63 S,計62 Sectors
サイズ:512バイト
ここで、MBR 446バイト(000−01 BDD)、DPT 64バイト(01 BE−01 FD)、終了フラグ2バイト(55 AA)
機能:MBRはDPTパーティション情報をチェックすることによってシステムをDBRにジャンプさせる
詳細:(DEBUG-A:MOV AX,0201 MOV BX,0200 MOV CX,0001 MOV DX,0080 INT 13)
000 H--08 A H MBR起動プログラム(起動パーティションを探す)
08 BH-0 D 9 HMBR起動文字列
0 DAH-1 BCH保持(「0」)
1 BEH-1 FDHハードディスクパーティションテーブル
1 FEH-1 FFH終了フラグ(55 AA)
 
 
 
C++インラインアセンブリ
C++コードに__asm{}を挿入すればよい
プライマリブート領域のバックアップは次のとおりです.
DATA SEGMENT
       
         D2 DB 'A:\BOOT.DAT',00H
DATA ENDS

CODE SEGMENT
     ASSUME CS:CODE,DS:DATA,ES:DATA
START:
          MOV   AX,DATA
          MOV   DS,AX
          MOV   ES,AX
          MOV	AH,09H                              
          MOV	DX,OFFSET D1                           
          INT	21H              ;     D1
          MOV	AX,0201H                            
          MOV	BX,0700H                           
          MOV	CX,0001H                           
          MOV	DX,0080H                            
          INT	13H              ; MBR                                       
          MOV	CX,0020H                            
          MOV	DX, OFFSET D2                         
          MOV	AH,3CH                            
          INT	21H              ;    A:\BOOT.DAT               
          MOV	AL,01H                              
          MOV	DX, OFFSET D2                            
          MOV	AH,3DH                           
          INT	21H              ;    A:\BOOT.DAT(   )            
          MOV	BX,AX                              
          MOV	DX,0700H                            
          MOV	CX,0200H                           
          MOV	AH,40H                           
          INT	21H              ;     MBR                     
          MOV   AH,4CH
          INT   21H              ;    
CODE ENDS
     END START

 
プライマリ・ブート領域は次のように復元されます.
DATA SEGMENT
      
       d2 db "        !!!  !!!",0dh,0ah
          db "           MBR1.EXE              A:\BOOT.DAT  (     "
          db " A     )            ,         ,    ,    !   "
          db "                        ?(Y/N)",0dh,0ah,"{1}quot;
       d3 db "    A:\BOOT.DAT     !",0dh,0ah,"{1}quot;
       d4 db "A:\BOOT.DAT",00H      
DATA ENDS

CODE SEGMENT
     ASSUME CS:CODE,DS:DATA,ES:DATA
START:

          MOV   AX,DATA
          MOV   DS,AX
          MOV   ES,AX
          MOV	AH,09H                              
          MOV	DX,OFFSET D1                           
          INT	21H           ;     d1                    
          MOV	AH,00H                              
          INT	16H           ;                                  
          MOV	AH,07H                              
          MOV	AL,00H                             
          MOV	BH,0A4h                             
          MOV	CX,0000H                            
          MOV	DX,184FH                            
          INT	10H           ;      (   ,   )                     
          MOV	AH,09H                              
          MOV	DX,OFFSET D2                        
          INT	21H           ;     d2(            ,  
                              ;       )                      
READ_KEYBOARD:
          MOV	AH,00H                              
          INT	16H                                 
          OR	AL,20H                              
          CMP	AL,79H                              
          JZ	WRITE          ; Y/y       MBR                    
          CMP	AL,6EH                              
          JZ	EXIT           ; N/n                            
          JMP	READ_KEYBOARD  ;                            
                             
EXIT:
          MOV	AH,07H                              
          MOV	AL,00H                              
          MOV	BH,07H                              
          MOV	CX,0000H                            
          MOV	DX,184FH                            
          INT	10H            ;                       
          MOV	AH,4CH                              
          INT	21H            ;                         
                               
WRITE:
          MOV	AH,3DH                              
          MOV	DX,OFFSET D4;                            
          MOV	AL,00H                              
          INT	21H            ;  A:\BOOT.DAT                     
          JB	ERROR                               
          PUSH	AX                                 
          MOV	AH,3FH                              
          MOV	DX,7000H                            
          MOV	CX,0200H                            
          POP	BX                                 
          INT	21H            ; A:\BOOT.DAT                        
          MOV	AH,03H                              
          MOV	AL,01H                              
          MOV	BX,7000H                            
          MOV	CX,0001H                            
          MOV	DX,0080H                            
          INT	13H            ;    MBR                     
          JMP	EXIT           ;                           
                                                         
ERROR:
          MOV	AH,09H                              
          MOV	DX,OFFSET D3   ;                                 
          INT	21H                                 
          MOV	AH,4CH                              
          INT	21H            ;    
CODE ENDS
END START