winston 发表于 2012-3-7 00:08:18

[原]VisualC++信息安全编程(3)内联汇编实现主引导区备份

硬盘的第一个扇区被保留为主引导扇区,它位于整个硬盘的0磁道0柱面1扇区,包括硬盘主引导记录MBR(Main Boot Record)和分区表DPT(Disk Partition Table)。其中主引导记录的作用就是检查分区表是否正确以及确定哪个分区为引导分区,并在程序结束时把该分区的启动程序(也就是操作系统引导扇区)调入内存加以执行。至于分区表,很多人都知道,以80H或00H为开始标志,以55AAH为结束标志,共64字节,位于本扇区的最末端。

= 硬盘主引导记录(MBR) + 硬盘分区表(DPT)

  用FDISK 进行硬盘分区时产生的, 它属于整个硬盘而不属于某个独立的DOS 分区, 是硬盘正确引导和使用的必要条件.

  物理位置:0柱面0磁头1扇区(Cylinder 0, Head 0, Sector 1)

  系统扇区(System Sectors): 0C-0H-2S,0C-0H-63S, 共 62 Sectors

  大小:512字节

  其中:MBR 446字节(0000--01BD),DPT 64字节(01BE--01FD),结束标志2字节(55 AA)

  功能:MBR通过检查DPT分区信息引导系统跳转至DBR

  详解: (DEBUG -A: MOV AX,0201 MOV BX,0200 MOV CX,0001 MOV DX,0080 INT 13)

  000H--08AH MBR启动程序(寻找开机分区)

  08BH--0D9H MBR启动字符串

  0DAH--1BCH 保留( "0 ")

  1BEH--1FDH 硬盘分区表

  1FEH--1FFH 结束标志(55AA)



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      




作者:yincheng01 发表于2012-1-6 6:47:53 原文链接

页: [1]
查看完整版本: [原]VisualC++信息安全编程(3)内联汇编实现主引导区备份