• 病毒木马查杀实战第011篇:QQ盗号木马之专杀工具的编写


    前言

            由于我已经在《病毒木马查杀第004篇:熊猫烧香之专杀工具的编写》中编写了一个比较通用的专杀工具的框架,而这个框架对于本病毒来说,经过简单修改也是基本适用的,所以本文就不讨论那些重叠的知识,只针对这个病毒特有的方面来讨论专杀工具的编写,然后将其进行组合,就是完整的针对于本病毒的专杀工具了。

     

    原理讨论

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

     

    代码编写

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

    #include "windows.h"
    #include "stdio.h"
    #include "tlhelp32.h"
    
    int main()
    {
    /////////////////////////////////////////////////////////////////////
    // 程序首先要暂停病毒进程
    /////////////////////////////////////////////////////////////////////
    	printf("开始查杀病毒进程...
    ");
    	// 给系统内所有的进程拍个快照  
        HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
        if ( hSnap == INVALID_HANDLE_VALUE )  
    	{  
            printf("进程快照创建失败!
    ");  
            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线程快照创建失败!
    ",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进程暂停成功!
    ",Pe32.szExeFile);
    			CloseHandle(thSnap);
    		}
    		bRet = Process32Next(hSnap, &Pe32); 
    	}
    /////////////////////////////////////////////////////////////////////
    // 程序接下来要结束病毒进程
    /////////////////////////////////////////////////////////////////////	
        hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
        if ( hSnap == INVALID_HANDLE_VALUE )  
    	{  
            printf("进程快照创建失败!
    ");  
            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成功结束!
    ",Pe32.szExeFile);
                CloseHandle(hProcess); 
    		}
    		bRet = Process32Next(hSnap, &Pe32); 
    	}
    
    	printf("病毒进程清理完毕!
    ");	
        CloseHandle(hSnap);
    	getchar();
    	return 0;
    }

            上述程序可以编译成功。

    程序测试

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


    图1 专杀工具的测试

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

    小结

            利用进程守护技术确实可以令病毒更加顽固且难以对付,需要进行特别处理才能够将其消灭。本文所讨论的方法也可以运用于其他方面,有待各位读者的发掘。

  • 相关阅读:
    配置Log4j(非常具体)
    RapeLay(电车之狼R)的结局介绍 (隐藏结局攻略)
    普林斯顿公开课 算法1-11:并查集的应用
    检查Oracle 中死事务的语句
    app被Rejected 的各种原因翻译
    经典语录和思考总结
    Java实现夺冠概率模拟
    Java实现夺冠概率模拟
    Java实现打印回型嵌套
    Java实现打印回型嵌套
  • 原文地址:https://www.cnblogs.com/csnd/p/11785777.html
Copyright © 2020-2023  润新知