Win10查看MBR

Win10查看MBR

偶然想起,MBR是BIOS自检后执行的程序,存在于磁盘的第一个扇区。

具体的参见百度词条即可。

https://baike.baidu.com/item/主引导记录/7612638?fromtitle=mbr&fromid=10473976&fr=aladdin

想着读取一下,再使用IDA分析看看。

代码:来源于网上,必须编译链接后,右键管理员运行。

#include<iostream>
#include<string.h>
#include<windows.h> 
using namespace std;
HANDLE GetDiskHandle(int iDiskNo)
{
	char szDriverBuffer[128];
	memset(szDriverBuffer,0,128);
	//格式化设备文件名称
	sprintf(szDriverBuffer,"\\\\.\\PhysicalDrive%d",iDiskNo);
	HANDLE m_hDevice = NULL;
	//CreateFile获取到设备句柄
	m_hDevice = CreateFileA(
	szDriverBuffer,// 设备名称,这里指第一块硬盘,多个硬盘的自己修改就好了
	GENERIC_READ, // 指定读访问方式
	FILE_SHARE_READ | FILE_SHARE_WRITE, // 共享模式为读|写,0表示不能共享
	NULL, // NULL表示该句柄不能被子程序继承
	OPEN_EXISTING, // 打开已经存在的文件,文件不存在则函数调用失败
	NULL, // 指定文件属性
	NULL);
	if (m_hDevice==INVALID_HANDLE_VALUE)
	{
		m_hDevice = NULL;
		//无效
		return INVALID_HANDLE_VALUE;
	}
	//设备句柄
	return m_hDevice;
}
 
//通过磁盘的句柄,给定读取的位置,获取到扇区512字节数据返回
//readpos:扇区的逻辑地址
//lpOutBuffer512:用于返回读取的数据
BOOL ReadSectorData( HANDLE& hDevice,UINT64 redpos,unsigned char * lpOutBuffer512 )
{
	memset(lpOutBuffer512,0,512);
	LARGE_INTEGER li;
	li.QuadPart = redpos*0x200;//0x200 = 512,求出扇区的 字节地址,通过设置读取的地址和长度进行read
	SetFilePointer(hDevice,li.LowPart,&li.HighPart,FILE_BEGIN);
	DWORD DCount=0; //计数
	BOOL bResult=ReadFile(hDevice, lpOutBuffer512,512, &DCount, NULL);
	return bResult;
}
//当然了,其实简单的fopen也是可以的,反正本质都一样,上面的是真繁琐。
void test()
{
	FILE* fp = fopen("\\\\.\\PhysicalDrive0","rb");
	if(!fp)
	{
		cout<<"cannot open"<<endl;
		return;
	}
	char buff[512];
	memset(buff,0,512);
	fread(buff,1,512,fp);
	for(int i=0;i<16;i++)
	{
		printf("%X ",buff[i]);
	}
	fclose(fp);
	MessageBox(NULL,"tt","tt",MB_OK);
}
int main()
{
	HANDLE handle = GetDiskHandle(0);
	cout<<handle<<endl;
	unsigned char buff[512];
	ReadSectorData(handle,0,buff);
	FILE* fp = fopen("MBR","wb");
	fwrite(buff,1,512,fp);
	fclose(fp);
	CloseHandle(handle);
}

image-20220605124608305

image-20220605124552002

image-20220605124517618

image-20220605124445328

image-20220605124429399

没怎么分析,IDA已经给出很多注释了,只是大致看了看确实是0:7C00h;

分析后面硬盘分区表,发现第一个竟然不是0x80。查了查,才发现,win10用的UEFI加载。

之所以能读取到类似与MBR的东西,只是因为兼容性罢了,称作protect MBR.
不过还是可以在虚拟机里面运行程序,就可以发现硬盘分区表的第一个字节确实是0x80,也就是属于活动状态了。

image-20220605124816926

image-20220605124902174

关于系统启动其他一些相关概念,可参考博客:https://blog.csdn.net/weixin_44966641/article/details/120374312

posted @ 2022-06-05 13:01  念秋  阅读(399)  评论(0编辑  收藏  举报