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{}を挿入すればよい
プライマリブート領域のバックアップは次のとおりです.
プライマリ・ブート領域は次のように復元されます.
=ハードディスクマスタブートレコード(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