winston 发表于 2012-3-7 00:04:55

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

MBR,全称为Master Boot Record,即硬盘的主引导记录。  为了便于理解,一般将MBR分为广义和狭义两种:广义的MBR包含整个扇区(引导程序、分区表及分隔标识),也就是上面所说的主引导记录;而狭义的MBR仅指引导程序而言。  
硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR)。它由三个部分组成,主引导程序、硬盘分区表DPT(Disk Partition table)和硬盘有效标志(55AA)。在总共512字节的主引导扇区里主引导程序(boot loader)占446个字节,第二部分是Partition table区(分区表),即DPT,占64个字节,硬盘中分区有多少以及每一分区的大小都记在其中。第三部分是magicnumber,占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        dd0          ;实际读出的字节数
        Buffer    db512 dup (0);存放读出的数据的缓冲区
        hFile             dd0          ;句柄存放处
       
        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,eax
        cmpeax,INVALID_HANDLE_VALUE
        jnzread
        invoke ShowError,offset ErrCreate            ;显示错误信息
read:                                                   ;读数据
        invoke ReadFile,eax,offset Buffer,512,offset readed,NULL
        cmpeax,0
        jnzshow
        invoke ShowError,offset ErrRead                  ;显示错误信息
show:                                                  
        invoke ShowBuffer                           ;显示读出的内容
        invoke CloseHandle ,                        ;关闭文件句柄
        invoke ExitProcess,0                                ;退出
ShowErrorproc ,MESSAGE:DWORD                               ;显示出错信息并退出
        invoke MessageBoxA,NULL,MESSAGE,offset Caption,MB_OK
        cmp,0
        jz   ShowErrorEnd
        invoke CloseHandle ,        ;关闭句柄
ShowErrorEnd:
        invoke ExitProcess,0                ;退出
ShowErrorendp

ShowBufferproc                                            ;显示所读出的信息
                                              ;把16进制数据转换成ASCII码的形式
        movesi,offset Buffer                ;数据
        movedi,offset ShowText         ;转换后的数据
        movebx,offset Number
        movecx,0
        xoreax,eax
Again:
        cmp,0
        jz   ConversionEnd
        dec
        moval,
        push eax
                 shreax,4                                 ;高4位
        moval,
        movbyte ptr,al
                 incedi
        popeax
        andeax,0FH                          ;低4位
                 moval,
        movbyte ptr,al
incedi
                 movbyte ptr,' '                ;空格
        incedi
                 incesi
                 incecx
        cmpecx,16
        jnzAgain
        xorecx,ecx
        movbyte ptr,13                ;是回车
        jmpAgain
ConversionEnd:
;显示转换后的字符串
        invoke MessageBoxA,NULL,offset ShowText,offset Caption,MB_OK
        ret
ShowBufferendp
        end main


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

页: [1]
查看完整版本: [原]VisualC++信息安全编程(1)内联汇编实现NT下读MBR