如何杀掉指定进程,或指定类型进程(LPK病毒防护)

背景: 当下,计算机病毒种类繁多,数不胜数,正常PC机上运行有杀毒软件防护,会很大程度上防止计算机感染。 但是当软件运行在资源比较紧凑的环境下,不能安装现有主流杀毒软件时,往往会感到无可奈何。软件自带查杀病毒功能扯了,那将非常耗资源,可能连本软件进程的资源都抢占了。 由于工作关系,一直苦恼于LPK木马问题,木马病毒会在电脑开机时自动启动,生成几个hrl*.tmp的镜像程序并运行,时间长了就会非常耗资源,使得本公司软件申请不到资源而不能正常运行,工控机又不能安装主流杀毒软件,甚是头疼。 今天查看进程详细信息时,突然灵光一现,既然我不能去查杀病毒(也非常难以查杀干净),那为什么不在软件启动时或定时去查询一遍现有进程列表中是否有hrl*.tmp的进程在运行,如果在运行则杀掉它呢就能保证本次开机后运行的程序免收其影响。 于是亲自测试之,挺好使,现总结操作过程如下: 操作步骤: 1、首先确定病毒运行后的进程名,lpk病毒开机启动后,在进程列表中的名称是hrl*.tmp,其中*代表随机的数字和字母,如144、123、1ED、4EF等; 2、编写查杀进程函数: /************************************************************************/ /* 名称: DealFindVirusesAndKillIt 功能: 检测指定病毒进程并杀掉进程入口函数 参数: 无 返回: 无 创建时间: 2016-12-07 作者: **攀*/ /************************************************************************/ void CViruses_Protection:: DealFindVirusesAndKillIt() { //提升本程序进程的权限,以获取结束其他进程的句柄 AdjustProcessTokenPrivilege(); //杀掉csc.exe进程 int nPid = FindProcess(_T(“csc.exe”)); if (0 != nPid) { KillProcess(nPid); } //杀掉lpk类病毒进程 int i=0; int nCountFind=0; int nCountKill=0; CString strLpkName; for (i=0; i//查找需要杀掉的进程是否有在运行 nPid = FindProcess(strLpkName); if (0 != nPid) { nCountFind++; //有在运行,则杀掉进程 if ( KillProcess(nPid)) { nCountKill++; } } } CString strXx; strXx.Format( _T(“检测到%d个病毒进程,杀掉%d个hr*.tmp病毒进程”),nCountFind,nCountKill); WRITE_LOG(strXx); } /************************************************************************/ /* 名称: AdjustProcessTokenPrivilege 功能: 提升本程序进程的权限,以获取结束其他进程的句柄 参数 无 返回: TRUE OR FALSE 时间: 2016-12-08 作者: **攀*/ /************************************************************************/ BOOL CViruses_Protection:: AdjustProcessTokenPrivilege() { LUID luidTmp; HANDLE hToken; TOKEN_PRIVILEGES tkp; if(! OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,& hToken)) { return FALSE; }
if(! LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &luidTmp)) { return FALSE; }
tkp.PrivilegeCount = 1; tkp.Privileges[0].Luid = luidTmp; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if(! AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL)) { return FALSE; } CloseHandle(hToken); return TRUE; } /************************************************************************/ /* 函数名称: FindProcess 功能: 查找参数进程是否在运行 参数: strProcess 需要查找的进程名称 返回: 0 : 系统中没有此进程在运行 else: 进程ID 创建时间: 2016-12-07 作者:**攀*/ /************************************************************************/ int CViruses_Protection:: FindProcess(const CString &strProcess) { int nPid = 0; //获取当前进程的快照 HANDLE hsnap=:: CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS,0); if( INVALID_HANDLE_VALUE==hsnap) { return FALSE; } else { PROCESSENTRY32 pe; pe.dwSize=sizeof(PROCESSENTRY32); //遍历进程快照,查找指定进程是否存在 int b=:: Process32First(hsnap,&pe); CString strProcessTemp = CString(pe.szExeFile); while(b) { strProcessTemp = CString(pe.szExeFile); if (strProcessTemp.Find(strProcess) >= 0) { //此进程在运行中 nPid = pe.th32ProcessID; break; } b=::Process32Next(hsnap,&pe); } } :: CloseHandle(hsnap); return nPid; } /************************************************************************/ /* 名称: KillProcess 功能: 结束指定ID的进程 参数: nProcessId 需要结束的进程ID 返回: 成功 TRUE 失败 FALSE 创建时间:2016-12-07 **攀*/ /************************************************************************/ BOOL CViruses_Protection:: KillProcess(const int &nProcessId) { BOOL bRet = FALSE; //获取进程句柄 HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, nProcessId ); if (hProcess != NULL) { //结束进程 if (0 != :: TerminateProcess(hProcess,0)) { bRet = TRUE; } CloseHandle(hProcess); } return bRet; }

来源:daliang126

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2016年11月7日
下一篇 2016年11月8日

相关推荐