查找了网上的资料,发现无非就是几种:
1、用低级钩子,但是这种方法试下发现根本就是假的,钩子根本拦截不到Ctrl+Alt+Del的消息,只能屏蔽类似于Alt+F4,之类的按键消息。
而且第一次安装安全软件会提示用户。
2、用注册表禁用,即程序向注册表的CurrentVersion\System分支添加EnableTaskmgr的值为0的REG_Z?(是这样写的吗)的键值,但是涉及到注册表操作,只要开启了杀毒软件,防木马等安全工具,就会被提前拦截,而且在按下快捷键时会跳出任务管理器已被管理员禁用的错误提示框。
3、先写好屏蔽Ctrl+Alt+Del的动态链接库,再用程序在Winlogon中动态开辟内存空间并装载,即远程注入。这种方法是最正确的了,但是程序涉及很复杂的代码(网上找的好多都是汇编实现的),对于我这种菜鸟来说简直就是天书。
4、下面这就是我要说的变通实现的方法了。
1)新建一个MFC的程序工程,在类的声明中公有成员中加入
CFile hookTaskmgr;
2)在需要屏蔽的地方加入如下代码:
hookTaskmgr.Open("C:\\Windows\\system32\\taskmgr.exe", //任务管理器的文件地址
CFile::shareDenyRead|CFile::shareDenyWrite, NULL); //不可被其他程序访问
3)在解除屏蔽的地方加入如下代码:
hookTaskmgr.Close();
//代码写地比较简便,其实还应该加入获取系统目录等代码,在屏蔽前还要加入FindWindow和PostMessage来结束任务管理器(如已打开)。
程序完成了。屏蔽后试试吧,是不是什么都不弹出来了?
更新:由于任务管理器的位置具有不确定性,可能存在映像劫持,所以可以加入如下代码预先判断:
HKEY hKEY;
HKEY hKeyRoot = HKEY_LOCAL_MACHINE;
long ret = ::RegOpenKeyEx(hKeyRoot,
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\taskmgr.exe",
0, KEY_READ, &hKEY);
if(ret != ERROR_SUCCESS)//如果无法打开hKEY,则中止程序的执行
{
AfxMessageBox("taskmgr.exe not found");
}
_TCHAR getValue[255] = “”;
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("错误:无法查询有关的注册表信息");
return;
}
CString a;
a.Format("%s", getValue);
AfxMessageBox(a);
//所得到的getValue即为任务管理器地址。如果不存在,则进行获取系统目录的操作,再获取taskmgr.exe的地址,即可屏蔽了。