当前位置:编程学习 > 网站相关 >>

VisualC++信息安全编程(1)内联汇编实现NT下读MBR

MBR,全称为Master Boot Record,即硬盘的主引导记录。  
MBR,全称为Master Boot Record,即硬盘的主引导记录。 
 为了便于理解,一般将MBR分为广义和狭义两种:广义的MBR包含整个扇区(引导程序、分区表及分隔标识),也就是上面所说的主引导记录;而狭义的MBR仅指引导程序而言。  
 
硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR)。它由三个部分组成,主引导程序、硬盘分区表DPT(Disk Partition table)和硬盘有效标志(55AA)。在总共512字节的主引导扇区里主引导程序(boot loader)占446个字节,第二部分是Partition table区(分区表),即DPT,占64个字节,硬盘中分区有多少以及每一分区的大小都记在其中。第三部分是magic  number,占2个字节,固定为55AA。
 
 
 
我们来实现在VC++下面实现读取MBR。
 
C++内联汇编
 
在C++代码中插入__asm {}即可
 
 
 
;************************************************** 
.386p 
.model flat, stdcall      ;平坦内存模式 
option casemap :none   ; 大小写敏感 
;*************************************************** 
include \masm32\include\windows.inc 
include \masm32\include\user32.inc 
include \masm32\include\kernel32.inc 
include \masm32\include\advapi32.inc 
       
includelib \masm32\lib\user32.lib 
includelib \masm32\lib\kernel32.lib 
includelib \masm32\lib\advapi32.lib 
 
ShowError proto :DWORD 
ShowBuffer proto  
 
.data                            ;数据段 
    FileName db '\\.\PHYSICALDRIVE0',0  ;打开第一个物理硬盘 
    align 4             ;双字对齐 
    readed  dd  0          ;实际读出的字节数 
    Buffer    db  512 dup (0)  ;存放读出的数据的缓冲区 
    hFile        dd  0          ;句柄存放处 
     
    Caption     db 'NT中读写物理磁盘',0      ;Caption的字符串 
    ErrCreate   db   '建文件错,该程序不能在Win9X下执行!',0   ;出错信息 
    ErrRead     db '读盘错误!',0                           ;出错信息 
     
    ShowText    db   4096*3 dup (0)               ;转换后用于显示的字符串 
    Number  db '0123456789ABCDEF'           ;16进制数转换为ACSII码要用到的数据 
 
.code                                                ;代码段 
main: 
    ;建立文件 
    invoke CreateFile,offset FileName,\ 
GENERIC_READ,FILE_SHARE_READ OR FILE_SHARE_WRITE,\ 
NULL,OPEN_EXISTING,NULL,NULL 
    mov  [hFile],eax 
    cmp  eax,INVALID_HANDLE_VALUE 
    jnz  read 
    invoke ShowError,offset ErrCreate            ;显示错误信息 
read:                                               ;读数据 
    invoke ReadFile,eax,offset Buffer,512,offset readed,NULL 
    cmp  eax,0 
    jnz  show 
    invoke ShowError,offset ErrRead         ;显示错误信息 
show:                                                
    invoke ShowBuffer                           ;显示读出的内容 
    invoke CloseHandle ,[hFile]                    ;关闭文件句柄 
    invoke ExitProcess,0                            ;退出 
ShowError  proc ,MESSAGE:DWORD                     ;显示出错信息并退出 
    invoke MessageBoxA,NULL,MESSAGE,offset Caption,MB_OK 
    cmp  [hFile],0 
    jz   ShowErrorEnd 
    invoke CloseHandle ,[hFile] ;关闭句柄 
ShowErrorEnd: 
    invoke ExitProcess,0        ;退出 
ShowError  endp 
 
ShowBuffer  proc                            ;显示所读出的信息 
                                            ;把16进制数据转换成ASCII码的形式 
    mov  esi,offset Buffer      ;数据 
    mov  edi,offset ShowText    ;转换后的数据 
    mov  ebx,offset Number 
    mov  ecx,0 
    xor  eax,eax 
Again: 
    cmp  [readed],0 
    jz   ConversionEnd 
    dec  [readed] 
    mov  al,[esi] 
    push eax 
             shr  eax,4                  ;高4位 
    mov  al,[ebx+eax] 
    mov  byte ptr[edi],al 
             inc  edi 
 &
补充:综合编程 , 安全编程 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,