找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3855|回复: 0

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

[复制链接]
发表于 2012-3-7 00:04:55 | 显示全部楼层 |阅读模式
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 {}即可

  1. ;**************************************************
  2. .386p
  3. .model flat, stdcall      ;平坦内存模式
  4. option casemap :none   ; 大小写敏感
  5. ;***************************************************
  6. include \masm32\include\windows.inc
  7. include \masm32\include\user32.inc
  8. include \masm32\include\kernel32.inc
  9. include \masm32\include\advapi32.inc
  10.       
  11. includelib \masm32\lib\user32.lib
  12. includelib \masm32\lib\kernel32.lib
  13. includelib \masm32\lib\advapi32.lib
  14. ShowError proto :DWORD
  15. ShowBuffer proto
  16. .data                            ;数据段
  17.         FileName db '\\.\PHYSICALDRIVE0',0  ;打开第一个物理硬盘
  18.         align 4                                ;双字对齐
  19.         readed        dd  0          ;实际读出的字节数
  20.         Buffer    db  512 dup (0)  ;存放读出的数据的缓冲区
  21.         hFile             dd  0          ;句柄存放处
  22.        
  23.         Caption                db 'NT中读写物理磁盘',0      ;Caption的字符串
  24.         ErrCreate        db   '建文件错,该程序不能在Win9X下执行!',0   ;出错信息
  25.         ErrRead                db '读盘错误!',0                           ;出错信息
  26.        
  27.         ShowText        db   4096*3 dup (0)               ;转换后用于显示的字符串
  28.         Number        db '0123456789ABCDEF'           ;16进制数转换为ACSII码要用到的数据
  29. .code                                                ;代码段
  30. main:
  31.         ;建立文件
  32.         invoke CreateFile,offset FileName,\
  33. GENERIC_READ,FILE_SHARE_READ OR FILE_SHARE_WRITE,\
  34. NULL,OPEN_EXISTING,NULL,NULL
  35.         mov  [hFile],eax
  36.         cmp  eax,INVALID_HANDLE_VALUE
  37.         jnz  read
  38.         invoke ShowError,offset ErrCreate            ;显示错误信息
  39. read:                                                   ;读数据
  40.         invoke ReadFile,eax,offset Buffer,512,offset readed,NULL
  41.         cmp  eax,0
  42.         jnz  show
  43.         invoke ShowError,offset ErrRead                    ;显示错误信息
  44. show:                                                  
  45.         invoke ShowBuffer                           ;显示读出的内容
  46.         invoke CloseHandle ,[hFile]                        ;关闭文件句柄
  47.         invoke ExitProcess,0                                ;退出
  48. ShowError  proc ,MESSAGE:DWORD                               ;显示出错信息并退出
  49.         invoke MessageBoxA,NULL,MESSAGE,offset Caption,MB_OK
  50.         cmp  [hFile],0
  51.         jz   ShowErrorEnd
  52.         invoke CloseHandle ,[hFile]        ;关闭句柄
  53. ShowErrorEnd:
  54.         invoke ExitProcess,0                ;退出
  55. ShowError  endp
  56. ShowBuffer  proc                                            ;显示所读出的信息
  57.                                                 ;把16进制数据转换成ASCII码的形式
  58.         mov  esi,offset Buffer                ;数据
  59.         mov  edi,offset ShowText         ;转换后的数据
  60.         mov  ebx,offset Number
  61.         mov  ecx,0
  62.         xor  eax,eax
  63. Again:
  64.         cmp  [readed],0
  65.         jz   ConversionEnd
  66.         dec  [readed]
  67.         mov  al,[esi]
  68.         push eax
  69.                  shr  eax,4                                 ;高4位
  70.         mov  al,[ebx+eax]
  71.         mov  byte ptr[edi],al
  72.                  inc  edi
  73.         pop  eax
  74.         and  eax,0FH                            ;低4位
  75.                  mov  al,[ebx+eax]
  76.         mov  byte ptr[edi],al
  77. inc  edi
  78.                  mov  byte ptr[edi],' '                ;空格
  79.         inc  edi
  80.                  inc  esi
  81.                  inc  ecx
  82.         cmp  ecx,16
  83.         jnz  Again
  84.         xor  ecx,ecx
  85.         mov  byte ptr[edi-1],13                ;是回车
  86.         jmp  Again
  87. ConversionEnd:
  88. ;显示转换后的字符串
  89.         invoke MessageBoxA,NULL,offset ShowText,offset Caption,MB_OK
  90.         ret
  91. ShowBuffer  endp
  92.         end main
复制代码


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

您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-4-30 20:57 , Processed in 0.014074 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表