MFC鎖定桌面,屏蔽任務管理器

        前段時間做了一個整蠱的程序,讓別人輸密碼,確定後將桌面其他任務、圖標什麼的全部隱藏,屏蔽掉任務管理器,顯示摧毀F、D、E、C盤,摧毀Windows什麼的,嚇死一大片小白。想起來就開心。

      接下來貼關鍵代碼:

      當進入整蠱模式後,首先換一個恐怖的界面,這段代碼不用貼。然後屏蔽Windows任務管理器,代碼如下:

void CVirusDlg::ResistTaskManger()
{
	HKEY hKEY;
	HKEY  hKeyRoot = HKEY_LOCAL_MACHINE;
	long ret = ::RegOpenKeyEx(hKeyRoot,
		_T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\taskmgr.exe"),
		0, KEY_READ, &hKEY);

	if(ret != ERROR_SUCCESS)//如果無法打開hKEY,則中止程序的執行
	{
		//AfxMessageBox(_T("taskmgr.exe not found"));
	}
	_TCHAR getValue[255] = {0};
	DWORD keyType = REG_SZ;//定義數據類型
	DWORD DataLen = 80;//定義數據長度
	CString strUser = _T("Debugger");//要查詢的鍵名稱

	long ret1=::RegQueryValueEx(hKEY, strUser, NULL, &keyType, (LPBYTE)getValue, &DataLen);

	if(ret1!=ERROR_SUCCESS)
	{
		//	AfxMessageBox(_T("錯誤:無法查詢有關的註冊表信息"));
		hookTaskmgr.Open(_T("C:\\Windows\\system32\\taskmgr.exe"),CFile::shareDenyRead|CFile::shareDenyWrite, NULL); 
		return;
	}

	CString taskmgpath;
	taskmgpath.Format(_T("%s"), getValue);
	hookTaskmgr.Open(taskmgpath,CFile::shareDenyRead|CFile::shareDenyWrite, NULL); 
}

接下來,隱藏Windows桌面圖標及其它任務,代碼如下:

void CVirusDlg::DesktopHide()
{
	CWnd *taskBar;
	taskBar=FindWindow(_T("Shell_TrayWnd"),NULL);//獲得任務欄窗口對象指針
	taskBar->GetWindowRect(&taskBarRECT);//保存原任務欄窗口的大小
	//改變大小
	taskBar->SetWindowPos(NULL,0,600,0,0,SWP_HIDEWINDOW);


	HDESK hDesk=OpenDesktop(_T(""),0,FALSE,DESKTOP_ENUMERATE);
	EnumDesktopWindows(hDesk,(WNDENUMPROC)EnumWindowsProc,NULL);

	CWnd* Desktop = FindWindow(_T("ProgMan"),NULL);
	Desktop->ShowWindow(SW_HIDE);
}

其中有個回調函數,要說明一下:

聲明部分:static BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam);

實現部分:

BOOL CALLBACK CVirusDlg::EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
	char Exepath[128];   
	::GetWindowText(hwnd,Exepath,sizeof(Exepath));
	CString Title=_T("");   
	Title=(CString)Exepath;   
	if(!Title.IsEmpty())
	{
		long ld=::GetWindowLong(hwnd,GWL_STYLE);
		if(((ld & WS_MINIMIZEBOX)==WS_MINIMIZEBOX)&&(ld & WS_VISIBLE))
		{
			CWnd *p=FindWindow(NULL,Title);
			p->ShowWindow(SW_MINIMIZE);
		}
	}
	return   TRUE;
}


下面是捉弄人的代碼部分:

	CString thrdName;
	thrdName = "摧毀 F盤···";
	ProcessThrdRun( thrdName, 6000);
	thrdName = "摧毀 E盤···";
	ProcessThrdRun( thrdName, 4000);
	thrdName = "摧毀 D盤···";
	ProcessThrdRun( thrdName, 2000);
	thrdName = "摧毀windows···";
	ProcessThrdRun( thrdName, 8000);
	thrdName = "摧毀 C盤···";
	ProcessThrdRun( thrdName, 1000);
	GetDlgItem(IDC_TEXTOUTCMD)->SetWindowText(_T("摧毀完畢!"));
	Sleep(5000);
	StartThrdExplorer();
	DesktopShow();
	GetDlgItem(IDC_TEXTOUTCMD)->SetWindowText(_T("開個玩笑而已!"));
	GetDlgItem(IDC_TEXTOUTPRO)->SetWindowText(_T("哈哈哈哈哈哈!"));
函數 ProcessThrdRun() 是進度條,

函數 StartThrdExplorer() 要特別注意,該函數是啓動windows桌面顯示進程,代碼如下:

void CVirusDlg::StartThrdExplorer()
{
	SHELLEXECUTEINFO  ShExecInfoOpen  =  {0}; 
	ShExecInfoOpen.cbSize  =  sizeof(SHELLEXECUTEINFO); 
	ShExecInfoOpen.fMask  =  SEE_MASK_NOCLOSEPROCESS; 
	ShExecInfoOpen.hwnd  =  NULL; 
	ShExecInfoOpen.lpVerb  =  _T("open"); 
	ShExecInfoOpen.lpFile  =  _T("explorer.exe");                         
	ShExecInfoOpen.lpParameters  =  _T("");             
	ShExecInfoOpen.lpDirectory  =  NULL; 
	ShExecInfoOpen.nShow  =  SW_HIDE; 
	ShExecInfoOpen.hInstApp  =  NULL;             
	ShellExecuteEx(&ShExecInfoOpen);
}
這段代碼要說明一下,這個是啓動 exe 程序的代碼,可以移植到其他地方。要啓動哪個 exe 程序直接在 
ShExecInfoOpen.lpFile  =  _T("explorer.exe");  

中更改應用程序名稱。

其實這個函數在本例中用處不大,作用大的代碼是下一個函數。
函數 DesktopShow() 要特別注意,該函數是顯示桌面被隱藏的圖標及任務,代碼如下:

void CVirusDlg::DesktopShow()
{
	CWnd *taskBar;
	taskBar=FindWindow(_T("Shell_TrayWnd"),NULL);
	//恢復原任務欄窗口的大小
	taskBar->SetWindowPos(NULL,taskBarRECT.left,taskBarRECT.top,taskBarRECT.right,taskBarRECT.bottom,SWP_SHOWWINDOW);

	CWnd* Desktop = FindWindow(_T("ProgMan"),NULL);
	Desktop->ShowWindow(SW_SHOW);
}

最後一點,在整個過程需要屏蔽一些 Windows 消息,在 MFC 函數 BOOL CVirusDlg::PreTranslateMessage(MSG* pMsg) 中,代碼如下:

BOOL CVirusDlg::PreTranslateMessage(MSG* pMsg)
{
	if ( pMsg->message == WM_KEYDOWN )
	{
		if ( (pMsg->wParam == VK_ESCAPE) || ( pMsg->wParam == VK_RETURN))
		{
			return TRUE;
		}
	}
	if ( DestroyProcsRun)
	{
		if (pMsg->wParam == WM_LBUTTONDOWN)
		{
			return TRUE;
		}
		if ( (pMsg->message == WM_SYSKEYDOWN ) && ( pMsg->wParam == VK_F4))
		{
			return TRUE;
		}
	}
	return CDialog::PreTranslateMessage(pMsg);
}

第一個 if 語句是屏蔽 Enter 鍵和 Esc 鍵,第二個 if 是在摧毀任務執行過程中屏蔽  Alt+F4 鍵,萬一有個不怎麼小白的用戶直接 ALT+F4 關掉這個窗口那還談什麼高端。

關於屏蔽消息,可參考 虛擬鍵值表。




發佈了34 篇原創文章 · 獲贊 6 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章