主引导记录(MBR)信息分析与获取

2023-05-16

前段时间在安装黑苹果时,发现一个问题,电脑在启动时,会找激活分区,如果没有找到,那就启动不起来。

那能否写个小程序读取一下MBR信息,把激活分区换成其它,搞点恶作剧呢,于是就有了这篇读取MBR信息的文章,但是没写入,不敢尝试。

通过动手学习,对硬盘MBR信息有了更好的了解。

1、我的硬盘主引导记录信息及分析

80 01 01 00 07 FE FF FF 3F 00 00 00 0D F0 BF 03(主分区)
偏移00H---80---激活标志---表示可引导
偏移01H---01---表示分区开始的磁头号为1
偏移02H---01---转换为二进制后为8位,0-5位表示该分区的起始扇区号---此处为1
偏移03H---00---02H的6-7位与03H的全部8位,共10位,组成起始磁柱号---此处为0
偏移04H---07---表示文件系统类型NTFS。
偏移05H---FE---转换为十进制254,表示分区结束的磁头号为254
偏移06H---FF---转换为二进制1111 1111,0-5位即3F,十进制下的63---该分区的结束扇区号为63。
偏移07H---FF---与06H的6-7位10合起来为3FF,即十进制下的1023---该分区的结束磁柱号为1023。
偏移08H、09H、0AH,0BH---3F 00 00 00---为分区起始相对扇区号63
偏移0CH、0DH、0EH,0FH---0D F0 BF 03---为分区总的扇区数3BFF00D,转换为十进制为62910477。

00 FE FF FF 05 FE FF FF 4C F0 BF 03 75 E6 82 21(扩展分区)
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00(没有使用)
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00(没有使用)
55 AA(MBR的结束标志位)
从上面可以看出MBR开分区结构最多只能识别4个主要分区,但是为什么我们的电脑上可以分4个以上的盘呢?
这是因为一般电脑上是一个主分区,一个扩展分区,在扩展分区中又分的逻辑分区(扩展分区中可以有多个逻辑分区)


2、获取相关信息的代码(Win7下,请以管理员身份运行)

//基于http://www.cnblogs.com/onepc/archive/2011/12/01/2270468.html来修改的。
//在此感谢此博友
//2012.10.10
#include <iostream>
#include <windows.h>
using namespace std;

#pragma pack(1) //字节对齐
typedef struct _PARTITION_ENTRY//分区表结构
{
    UCHAR active; //状态(是否被激活)   重要
    UCHAR StartHead; //分区起始磁头号   
    USHORT StartSecCyli; //与63相位与得出的是开始扇区,把它右移6位就是开始柱面
    UCHAR PartitionType; // 分区类型   重要 
    UCHAR EndHead; //分区结束磁头号
    USHORT EndSecCyli; //与63相位与得出的就是结束扇区,把它右移6位就是结束柱面
    ULONG StartLBA; // 扇区起始逻辑地址(相对扇区号)   重要
    ULONG TotalSector; // 分区大小      重要
} PARTITION_ENTRY, *PPARTITION_ENTRY;

//引导区512BYTE结构
typedef struct _MBR_SECTOR
{
    UCHAR BootCode[440];//启动记录440 Byte
    ULONG DiskSignature;//磁盘签名
    USHORT NoneDisk;//二个字节
    PARTITION_ENTRY Partition[4];//分区表结构64 Byte
    USHORT Signature;//结束标志2 Byte 55 AA
} MBR_SECTOR, *PMBR_SECTOR;

#pragma pack()

int main()
{
	TCHAR szDevicename[64]={0};
	MBR_SECTOR _ReadMbr;
	wsprintf(szDevicename,L"\\\\.\\PHYSICALDRIVE0");
	HANDLE hDevice=CreateFile(szDevicename,GENERIC_READ|GENERIC_WRITE,
		FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
	if(hDevice==INVALID_HANDLE_VALUE)
	{
		cout<<"打开设备出错"<<endl;
		return -1;
	}
	memset(&_ReadMbr,0,sizeof(MBR_SECTOR));
	DWORD leng=512;
	DWORD count;
	DeviceIoControl(hDevice,FSCTL_LOCK_VOLUME,NULL,0,NULL,0,&count,NULL);
	UCHAR sz[512]={0};
	//ReadFile(hDevice,sz,512,&leng,NULL);
	BOOL bcheck=ReadFile(hDevice,&_ReadMbr,512,&leng,NULL);
	memcpy(sz,&_ReadMbr,512);
	for(int i=0;i<66;i++)
	{
		printf("%02X ",sz[446+i]);
		if((i+1)%16==0)
			printf("\n");
	}
	printf("\n");
	if(bcheck==FALSE && leng<512)
	{
		cout<<"读取MBR出错!"<<endl;
		DeviceIoControl(hDevice,FSCTL_UNLOCK_VOLUME,NULL,0,NULL,0,&count,NULL);
		CloseHandle(hDevice);
		return -1;
	}
	char *szTemp=new char[64];
	for(int i=0;i<4;i++)
	{
		if(_ReadMbr.Partition[i].PartitionType==0)
		{
			continue;
		}
		memset(szTemp,0,64);
		if(_ReadMbr.Partition[i].active==128)
		{
			cout<<"激活分区"<<endl;
		}else
			cout<<"非激活分区"<<endl;
        memset(szTemp,0,64);
        sprintf(szTemp,"激活分区标志位:%02X",_ReadMbr.Partition[i].active);
        cout<<szTemp<<endl;
        memset(szTemp,0,64);
        sprintf(szTemp,"分区起始磁头号:%d",_ReadMbr.Partition[i].StartHead);
        cout<<szTemp<<endl;
        memset(szTemp,0,64);
        int temp = _ReadMbr.Partition[i].StartSecCyli;
        sprintf(szTemp,"分区起始扇区号:%d",temp & 63);//63转为二进制111111,做&运算,只取低6位
        cout<<szTemp<<endl;
        memset(szTemp,0,64);
        sprintf(szTemp,"分区起始磁柱号:%d",temp>>6);//取高10位
        cout<<szTemp<<endl;
        memset(szTemp,0,64);
        sprintf(szTemp,"分区文件类型标识:%02d",_ReadMbr.Partition[i].PartitionType);
        cout<<szTemp<<endl;
        memset(szTemp,0,64);
        sprintf(szTemp,"分区结束磁头号:%d",_ReadMbr.Partition[i].EndHead);
        cout<<szTemp<<endl;
        memset(szTemp,0,64);
        temp = _ReadMbr.Partition[i].EndSecCyli;
        sprintf(szTemp,"分区结束扇区号:%d",temp & 63);
        cout<<szTemp<<endl;
        memset(szTemp,0,64);
        sprintf(szTemp,"分区结束磁柱号:%d",temp>>6);
        cout<<szTemp<<endl;
        memset(szTemp,0,64);
        sprintf(szTemp,"分区起始相对扇区号:%d",_ReadMbr.Partition[i].StartLBA);
        cout<<szTemp<<endl;
        memset(szTemp,0,64);
        sprintf(szTemp,"分区总的扇区数:%d",_ReadMbr.Partition[i].TotalSector);
        cout<<szTemp<<endl;
	}
	DeviceIoControl(hDevice, FSCTL_UNLOCK_VOLUME, NULL, 0, NULL, 0, &count, NULL);
    CloseHandle(hDevice);
	system("pause");
	return 0;
}


  


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

主引导记录(MBR)信息分析与获取 的相关文章

随机推荐

  • vs2019的下载及安装教程

    天下武功 xff0c 唯快不破 xff0c 虽然支持 C C 43 43 开发工具 也就是大家口中的IDE 有很多 xff0c 但是在团队项目开发中使用最多的还是Visual Studio xff08 以下简称VS xff09 xff0c
  • 【JavaScript】按钮绑定点击事件-onCliek事件

    JavaScript 按钮绑定点击事件 onCliek事件 lt button type 61 34 submit 34 id 61 34 btn 34 gt btn lt button gt 1 第一种 34 btn 34 click f
  • python.matplotlib实现手动鼠标移动坐标点

    01 操作动画 随意拖动任一点 xff0c 任意运动 02 关键代码 编程 xff1a python 3 6运行环境 xff1a Pycharm只展示部分关键代码 xff0c 需要源码的见文末链接关键 xff1a 一定要注意能不能运动 xf
  • 在windows10环境下安装Tensorflow2.1.0--cpu版本,及jupyter使用tensorflow出现kernel内核崩溃的解决(踩坑无数,总结出的快捷方法)

    最近跟着导师学习深度学习 xff0c 需要进行安装tensorflow xff0c 老师给的方法很简洁 xff0c 直接pip install tensorflow xff0c 由于在国内嘛 xff0c 可想而知 xff0c 99 肯定Re
  • 数据库范式

    1NF 无重复列 所有的域都应该是原子的 xff0c 即每一列都是不可分割的数据项 2NF 消除部分子函数依赖 假如 xff1a 学号 xff0c 姓名 xff0c 年龄 xff0c 课程号 xff0c 成绩 xff0c 学分 xff0c
  • Redis之秒杀下单优化以及认识redis消息队列

    目录 一 秒杀优化 异步秒杀思路 二 秒杀优化 Redis 完成秒杀资格判断 1 VoucherServiceImpl xff0c 新增优惠券的同时加入到Redis 2 编写lua 基于lua完成一人一单 xff0c seckill lua
  • 【逆向工程】mapper文件报错:Result Maps collection already contains value for...BaseResultMap

    在使用逆向工程生成代码及mapper文件的时候 xff0c 第一次生成完之后 xff0c 发现少配了一个数据库表 xff0c 因此也就少了对应的实体类和mapper文件 xff0c 于是就直接在工程中添配置上缺少的数据库表就又执行了一遍 x
  • 关于Android studio第一次创建工程时加载过慢的解决方法

    在进行Android开发的时候 xff0c 原来使用的是Android studio2 1版本的 xff0c 突然心血来潮 xff0c 去官网下了一个最新版本的 突然之间遇到许多问题 第一个问题就是第一次创建工程时加载过慢 在网上查找了许多
  • Spring项目实践(三)--- Spring配置文件详解

    不同于我们讲的pom xml以及web xml xff0c 这两个文件的名称是固定的 xff0c 不可更改的 xff0c 这里的设计采用的是约定优于配置的原则 而Spring的配置文件的名称是可以更改的 xff0c 实际上我们在 Sprin
  • Spring项目实践(四)--- Spring MVC配置文件详解

    前三讲我们依次讲了pom xml web xml和spring配置文件 xff0c 这次我们来讲一下springmvc的配置 首先明确一下springmvc是spring的一个模块 springmvc的配置文件 xff0c 也不是固定命名的
  • ShadowSSDT Hook

    ShadowSSDT表的获取 这里的ShadowSSDT表的获取是通过函数KeAddSystemServiceTable来获取的 使用这个函数的原因 xff1a 1 这个函数是已经导出的 xff0c 可以在代码中直接使用 2 这个函数里面使
  • BCTF总结

    缘由 上周 xff0c 我们小组Sigma参加了 百度杯 BCTF比赛 xff0c 经历了难忘的双休 xff0c 这次的BCTF跟以前参加的国内类似的安全比赛有些不同 xff0c 时间只有48小时 xff0c 题目不多 xff0c 但难度大
  • BCTF_海报探秘(300)

    这个题目来自上周的BCTF比赛 xff0c 题目是海报探秘 xff08 300 xff09 xff0c 一张png图片中隐藏了KEY xff0c 解出KEY xff0c 具体报告 xff0c 请下载 xff1a http download
  • 博客转移

    最近好久不来CSDN了 xff0c 自己搭建了一个博客 欢迎各位去新博客留言 http www l0g1n cn 以前学习汇编的博客 http www asmedu net blog user usermain jsp neighborId
  • 《Windows程序设计》之BLOKOUT1

    LRESULT CALLBACK WndProc HWND hwnd UINT message WPARAM wParam LPARAM lParam static BOOL fBlocking fValidBox static POINT
  • MySQL(mariadb)

    MySQL历史 1979年 xff1a TcX公司 Monty Widenius xff0c Unireg1996年 xff1a 发布MySQL1 0 xff0c Solaris版本 xff0c Linux版本1999年 xff1a MyS
  • 天猫抢红包小工具源码

    时间很仓促 xff0c 写的很乱 xff0c 也就能用明天一天了 主要还是学习这个过程 include lt Windows h gt include lt stdio h gt include lt iostream gt include
  • vs2010开发qt程序debug正常,release出错

    在debug模式下 xff0c 配置的动态链接库是qtmaind lib QtGuid4 lib QtCored4 lib 这些链接库 xff0c 在release模式下是不适用的 xff0c 进入到qt的目录下 xff0c 发现了有一些不
  • cout与wcout

    一直以来只知道有cout用来输出 xff0c 今天用cout输出wchar时出现问题了 xff0c 输出结果是一段地址 xff0c 才发现了wcout的存在 使用wcout输出中文时 xff0c 又出现问题 xff0c 中文输出不了 xff
  • 主引导记录(MBR)信息分析与获取

    前段时间在安装黑苹果时 xff0c 发现一个问题 xff0c 电脑在启动时 xff0c 会找激活分区 xff0c 如果没有找到 xff0c 那就启动不起来 那能否写个小程序读取一下MBR信息 xff0c 把激活分区换成其它 xff0c 搞点