查杀QQ木马程序工具的编写

手册/FAQ (515) 2016-04-27 09:37:05

 

原理讨论

        对于本病毒而言,其最大的特色就在于使用了进程守护技术。病毒运行后,同时有三个病毒进程存在,关闭其中的任何一个,由于还有两个病毒进程的存在,那么被关闭的又会被重新开启。要解决这个问题,不能靠“手速”来将三个病毒进程同时关闭,而是应当将那几个进程先暂停再关闭。一般来说,进程是不能够直接暂停的,当定位到了想要暂停的进程后,应当将该进程下的所有线程暂停,那么该进程也就停止了。而经过实际测试,利用那篇文章中所编写的进程管理器,是能够成功关闭那三个进程的。弄清楚了原理,那么接下来就是需要编程实现了。

 

代码编写

        我们需要将三个病毒进程一一暂停,之后再结束。为简单起见,这里创建的是Win32控制台应用程序。代码如下:

  • #include "windows.h"  
  • #include "stdio.h"  
  • #include "tlhelp32.h"  
  •   
  • int main()  
  • {  
  • /////////////////////////////////////////////////////////////////////  
  • // 程序首先要暂停病毒进程  
  • /////////////////////////////////////////////////////////////////////  
  •     printf("开始查杀病毒进程...\n");  
  •     // 给系统内所有的进程拍个快照    
  •     HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);   
  •     if ( hSnap == INVALID_HANDLE_VALUE )    
  •     {    
  •         printf("进程快照创建失败!\n");    
  •         return 0;    
  •     }  
  •    
  •     PROCESSENTRY32 Pe32 = { 0 };    
  •     // 在使用这个结构前,先设置它的大小    
  •     Pe32.dwSize = sizeof(PROCESSENTRY32);    
  •     // 遍历进程快照    
  •     BOOL bRet = Process32First(hSnap, &Pe32);   
  •     // 通过循环来暂停病毒进程  
  •     while ( bRet )  
  •     {  
  •         // 三个进程名称进行匹配  
  •         if ( strcmp(Pe32.szExeFile, "severe.exe")==0 || strcmp(Pe32.szExeFile, "conime.exe")==0 || strcmp(Pe32.szExeFile, "tfidma.exe")==0)  
  •         {  
  •             // 创建线程快照  
  •             HANDLE thSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, Pe32.th32ProcessID);    
  •             if ( thSnap == INVALID_HANDLE_VALUE )    
  •             {    
  •                 printf("%s线程快照创建失败!\n",Pe32.szExeFile);    
  •                 return 0;    
  •             }  
  •     
  •             THREADENTRY32 Te32 = { 0 };    
  •             // 在使用这个结构前,先设置它的大小  
  •             Te32.dwSize = sizeof(THREADENTRY32);    
  •             // 遍历线程快照  
  •             BOOL tbRet = Thread32First(thSnap, &Te32);    
  •             // 通过循环来暂停病毒进程中的所有线程  
  •             while ( tbRet )    
  •             {    
  •                 //判断线程所属    
  •                 if ( Te32.th32OwnerProcessID == Pe32.th32ProcessID )    
  •                 {                           
  •                     // 打开线程  
  •                     HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, Te32.th32ThreadID);    
  •                     // 暂停线程      
  •                     SuspendThread(hThread);    
  •                     // 关闭线程句柄  
  •                     CloseHandle(hThread);    
  •                 }     
  •                 tbRet = Thread32Next(thSnap, &Te32);    
  •             }  
  •             printf("%s进程暂停成功!\n",Pe32.szExeFile);  
  •             CloseHandle(thSnap);  
  •         }  
  •         bRet = Process32Next(hSnap, &Pe32);   
  •     }  
  • /////////////////////////////////////////////////////////////////////  
  • // 程序接下来要结束病毒进程  
  • /////////////////////////////////////////////////////////////////////     
  •     hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);   
  •     if ( hSnap == INVALID_HANDLE_VALUE )    
  •     {    
  •         printf("进程快照创建失败!\n");    
  •         return 0;    
  •     }  
  •    
  •     // 在使用这个结构前,先设置它的大小    
  •     Pe32.dwSize = sizeof(PROCESSENTRY32);    
  •     // 遍历进程快照    
  •     bRet = Process32First(hSnap, &Pe32);   
  •     // 通过循环来结束病毒进程  
  •     while ( bRet )  
  •     {  
  •         // 三个进程名称进行匹配  
  •         if ( strcmp(Pe32.szExeFile, "severe.exe")==0 || strcmp(Pe32.szExeFile, "conime.exe")==0 || strcmp(Pe32.szExeFile, "tfidma.exe")==0)  
  •         {  
  •             HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, Pe32.th32ProcessID);         
  •             TerminateProcess(hProcess, 0);   
  •             printf("病毒进程%s成功结束!\n",Pe32.szExeFile);  
  •             CloseHandle(hProcess);   
  •         }  
  •         bRet = Process32Next(hSnap, &Pe32);   
  •     }  
  •   
  •     printf("病毒进程清理完毕!\n");    
  •     CloseHandle(hSnap);  
  •     getchar();  
  •     return 0;  
  • }  

        上述程序可以编译成功。

 

程序测试

        为了测试这次只针对于病毒进程的专杀工具,我将病毒样本和本程序均拷贝到虚拟机中,然后执行病毒程序,最后执行本专杀工具:

 

        经测试可知,本专杀工具是有效的,便不再赘述。

 

THE END