MFC锁定桌面,屏蔽任务管理器

来源:互联网 发布:雕刻大师软件 编辑:程序博客网 时间:2024/05/29 12:32

        前段时间做了一个整蛊的程序,让别人输密码,确定后将桌面其他任务、图标什么的全部隐藏,屏蔽掉任务管理器,显示摧毁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 关掉这个窗口那还谈什么高端。

关于屏蔽消息,可参考 虚拟键值表。




0 0