汇编——NT中读取MBR内容

 

;**************************************************
;
ReadMBROnDiskNT.asm
;
功能:Windows NT、2K、XP中读MBR
;
      
;
**************************************************
.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
    
pop  eax
    
and  eax,0FH                ;低4位
             mov  al,[ebx+eax]
    
mov  byte ptr[edi],al
inc  edi
             
mov  byte ptr[edi],' '        ;空格
    inc  edi
             
inc  esi
             
inc  ecx
    
cmp  ecx,16
    
jnz  Again
    
xor  ecx,ecx
    
mov  byte ptr[edi-1],13        ;是回车
    jmp  Again
ConversionEnd:
;显示转换后的字符串
    invoke MessageBoxA,NULL,offset ShowText,offset Caption,MB_OK
    
ret
ShowBuffer  endp
    end main

 

 

posted @ 2009-12-24 22:16 灰鸽子 阅读(...) 评论(...) 编辑 收藏