熊猫烧香病毒分析

熊猫烧香概述

熊猫烧香,是一款拥有自动传播、自动感染硬盘能力和强大的破坏能力的病毒,它不但能感染系统中exe,com(DOS可执行命令文件),pif(程序信息文件,), scr(屏幕保护程序),html,asp等文件,它还能中止大量的反病毒软件进程并且会删除扩展名为gho的文件。该文件是一系统备份工具GHOST的备份文件,使用户的系统备份文件丢失。被感染的用户系统中所有.exe可执行文件全部被改成熊猫举着三根香的模样。

分析病毒四部曲

真实场景中,一般都是先中了病毒,才会去杀病毒,而在工作中,病毒分析师的任务就是从中毒的机器中提取样本,第一时间手工清理或是修复机器现场,之后再做分析。

分析病毒可以细分为四部曲:

1.提取样本,手工清理机器

2.行为分折,获取病毒行为

3.   详细分折,找到行为的恶意代码

4.   提出解决方案,提取特征给公司产品,完成查杀,编写文档报告,有条件编写专杀工具

样本的提取

在虚拟机中,运行样本。待病毒执行之后,删除样本,开始提取样本。

使用PCHunter观察样本:

1.   使用ARK工具查看可疑进程

2.使用ARK工具查看启动项(注册表、计划任务等)

3.使用ARK工具查看驱动、服务等可疑项

        没发现异常

4.   使用ARK工具查看其他杂项,网络连接

5.   使用抓包工具(WSExplorer)查看可疑流量

提取样本:

行为分析

获取样本之后,在虚拟机中,使用监控工具监控样本的运行。待病毒执行差不多之后,查看病毒的行为。

使用火绒剑,将样本拖到火绒剑,对样本进行监控:

1. 文件操作,主要看文件创建、修改、删除等操作

发现有文件创建、修改、删除的操作,一些创建的文件和样本文件大小一样,应该是复制的样本,感染了很多exe的文件

2. 注册表操作,主要看注册表设置、创建等操作

发现创建注册表、设置注册表值、设置启动项、隐藏文件等操作

3.   进程操作,主要看创建进程、写入内存等操作

4.网络操作,主要看网络连接地址、IP等信息

5.   其他行为,以及人肉看样本运行后的反应

发现创建了很多Deslktop_.ini文件,感染覆盖了很多exe文件,exe的图标变成了熊猫烧香,运行之后,自动启动熊猫烧香软件。

查看执行监控,发现其创建了CMD的进程,使用命令,删除了网络共享:

分析样本的行为之后,发现的恶意行为:

1、自我复制样本到C盘,C:/Windows/driver/目录下启动  C:/Windows/driver/sp001sv.exe(即样本)

2、在每一个目录下创建了Desktop_.ini,里面是当前日期

3、在C盘根目录下创建了autorun.inf文件,里面指定了自动启动的文件为根目录下的setup.exe

4、对程序目录下的exe进行了感染,图标变成了熊猫烧香,打开exe时,自动打开病毒

5、设置注册表启动项为:C:/Windows/driver/spo0lsv.exe

6、设置注册表键值,隐藏文件不显示

HKEY LOCAL MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ExpIorer\

Advanced\FoTder\Hidden\SHOWALL 中的CheckedVaIue 值

7、自己创建一个注册表的项,在其中写入了很多信息

HKEY LOCAL MACHINE\SOFTWARE\Microsoft\Tracing\spoOIsv RASAP132

8、修改注册表的项IE浏览器的代理和连接设置

9、枚举进程、创建进程、跨进程写入内存、打开设备、查找窗口

10、连接局域网的一些地址,访问一些外面的网址(可能在做试探,看是否能成功)

11、使用cmd命令关闭网络共享

cmd.exe /c net share C$ /del /y

cmd.exe /c net share D$ /del /y

cmd.exe /c net share admin$ /del /y

详细分析

详细分析技巧:

1、先使用PEID或exeinfo查壳,如果有壳先尽量脱壳

2、使用IDA的签名工可以更好的识别库代码

shitf+F5,添加合适的库签名

3、使用IDA的F5可以将反汇编代码转为伪C代码

配合修改参数、变量类型,更易阅读

4、使用OD动态调试样本,验证在IDA静态分析的猜测

5、IDA分析后可以创建map文件,导入到OD中使用

导入map文件后,OD中名称与IDA同步

详细分析方法:

1、使用IDA和OD结合分析

2、IDA无法F5,OD单步跟踪

3、CC分析法(逐层分析法)

IDA可以F5,但F5的代码是病毒专门为IDA准备的,一层一层单步跟踪。

详细分析过程:

使用PEID或exeinfope查看是否有壳:

发现其是FSG 2.0的壳,使用OD对齐进行脱壳,因为是FSG的壳,单步跟踪,运行到关键跳转位置:

单步跟踪进去:

0x0040D278就是程序的OEP,在该地址处,右键dump程序:

dump之后,使用exeinfope对其进行查看,发现其是Delphi v3.0-7.0,PEID查看,其是6.0-7.0

使用ImportRCE对dump的文件进行IAT修复,发现不能完整识别所有的导入函数,观察IAT,IAT起点是:0x0041012C

发现模块之间被7FFFFFFF填充了,需要将其修改为00000000,再对其进行修复:

将dump修复后的文件使用IDA打开,F5快捷键,让其转为伪C代码:

因为程序是Delphi写的,为了便于分析,使用IDA中的签名,shift+F5打开签名窗口,选中,右键:Apply new signature

使用Ctrl+F搜索Delphi:

改变编译器,卸载库,识别出233个库函数

前面一大堆函数,是Delphi的库函数,有初始化操作,有大量LStrAsg函数对字符串进行赋值操作,应该是在初始化一些东西。

后面有两处调用了sub_405250,参数一个有:xboy, 一个有:whboy,函数调用之后,有LStrCmp字符串比较的函数,比较完进行了判断,如果某个值为0,就退出进程。然后有几个函数的调用,后面还有一个消息循环。先用OD对CALL 405250的函数进行分析:

因为Delphi是fastcall的调用约定,默认第一个参数用EAX传递,第二个参数用EDX传递,第三个参数用ECX传递,超过三个参数部分,用堆栈传递,所以在CALL 00405250之前,传进去了三个参数,一个是地址,一个是xboy,一个是字符串,需要进去对这个函数进行分析:

进入函数后分析发现,有一个循环是用传入的xboy对传入的乱码”++戊...“进行解密,解密后的字符串为:“武汉男生感染下载者"。解密之后,使用LStrCmp函数,将解密后的字符串与全局变量字符串进行比较,如果不想等就退出进程,相等进行跳转:

跳转之后,又调用了sub_00405250函数,传入的参数:地址、whboy字符串,乱码字符串,也是对传入进去的乱码字符串进行解密,解密之后将解密的字符串与全局变量字符串进行比较,如果不想等就退出,相等就跳转:

下面有三个关键函数,需要分别进入每个函数进行分析,首先进入40819C这个函数进行分析:

先是获取当前程序的路径,然后判断该路径下是否存在Desktop_.ini文件,如果存在就继续执行,然后删除文件;如果不存在就跳转到下面:

如果文件不存在,就读取当前病毒程序到内存,获取文件的大小,然后跳转:

跳转到这里之后,会判断程序是否是第一次运行,如果不是第一次执行,说明已经自我复制过了就跳转走;如果是第一次运行就继续往下执行,获取系统驱动目录,将当前运行程序的路径和系统驱动的路径进行比较:

如果不想等就继续往下执行,先结束到名为spo0lsv.exe的进程,然后获取系统驱动目录,自我复制当前程序,拷贝到系统驱动目录下,伪装成spo0lsv.exe程序,然后创建进程,启动系统驱动目录下的spo0lsv.exe程序,结束正在运行的病毒程序。

如果相等,说明当前运行的就是系统驱动目录下已经存在的spo0lsv.exe程序,就会跳转到下面:

指令获取了病毒在内存中的首地址,获取了病毒程序的大小,删除了,然后跳到下面退出了该函数

下面对第二个关键函数sub_40D18C进行分析,进入这个函数,里面又有三个函数

分别进入三个函数进行分析,进入第一个函数,有一个创建线程的函数:

对线程回调函数进行分析:

先获取盘符,然后拼接路径,调用了一个函数,进入函数进行分析:

进来之后先判断路径的最后一个字节是否是:\,然后判断是否是文件夹,如果是就继续执行,又判断第一个字节是否是.不是就继续执行:

后面判断当前文件夹名是否是WINDOWS、WINNT、system32...这些文件夹,如果是就跳转到后面,不创建Desktop_.ini文件。如果不是这些文件夹,继续往下执行:

然后又会判断当前文件夹内是否存在Desktop_.ini文件,如果存在,就继续执行,读取文件的内容到内存,然后获取本地时间,再判断文件内的日期和当前日期是否一样,不一样就跳到下面,一样就继续执行,进入一个递归函数:

如果不存在就跳转:

跳转之后,获取了本地时间,然后创建了文件,并且设置文件的属性为只读、隐藏、系统,然后开始遍历文件夹内的文件,获取文件的后缀,如果文件的后缀是: GHO,就删除该文件,不让其通过备份还原:

然后判断文件是不是setup.exe文件和NTDETECT.COM文件,如果是就跳到最后,不处理,如果不是就继续执行:

下面就是对获取的文件名后缀进行判断,如果文件后缀是:EXE、SCR、PIF、COM这几个类型,那么文件就会被感染,感染函数是:sub_407F00,进入函数分析感染过程:

先判断文件是否是病毒文件,如果是正在运行的病毒文件,就跳到最后面不处理,如果不是病毒文件,就对其进行处理,先读取文件到内存:

读取原文件到内存后,然后在这段内存中找WhBoy字符串,找到了就最后不做处理,没找到就跳转往下继续执行:

然后设置文件属性为Normal,将病毒文件拷贝到文件中:

此时原来的正常文件已经变成了病毒文件,其大小和病毒大小一模一样,说明是病毒文件覆盖了原文件:

拷贝成功后,继续往下执行:

先是获取了未被感染的文件大小,然后转成十进制的大小,又将WhBoy、文件名、.exe、文件十进制大小拼接到了一起。

然后以追加的方式打开刚才被感染的文件,将内存中保存的原文件追加到被感染文件的后面,再在后面加上刚才拼接好的字符串。

整个过程就是遍历目录,创建Desktop.ini文件,然后对后缀是exe、scr、pif、com的文件进行感染,先将原文件读取到内存,然后复制自身病毒文件到原文件,再把原文件追加到感染的文件后面,再追加一个字符串标识。

下面分析第二个关键函数的第二个函数,里面有一个计时器的回调函数:

对回调函数进行分析:

先是获取盘符,然后判断盘符是不是A、B,如果是就跳到最后不做处理,如果不是就继续往下执行,判断setup.exe文件是否存在:

如果存在,就将当前运行的病毒文件和setup.exe文件读取到内存,然后比较是否相等,如果相等就跳转到下面检测autorun.inf文件是否存在,如果不想等就删除setup.exe文件,然后将当前运行的病毒文件拷贝到setup.exe文件:

如果不存在就跳转:

跳转之后,在该盘符下面创建setup.exe文件,创建之后又判断该路径下是否存在autorun.inf文件:

如果存在,就将autorun.inf文件读取到内存,然后判断是否等于[AutoRun]\r\nOPEN=setup.exe\r\nshellexecute=setup.exe\r\nshell\Auto\command=setup.exe\r\n,如果相等就跳转,如果不想等就删除文件,然后创建文件,并在文件中写入:[AutoRun]\r\nOPEN=setup.exe\r\nshellexecute=setup.exe\r\nshell\Auto\command=setup.exe\r\n

如果不存在就跳转,然后创建了autorun.inf文件,并在文件中写入了:[AutoRun]\r\nOPEN=setup.exe\r\nshellexecute=setup.exe\r\nshell\Auto\command=setup.exe\r\n,这是让setup.exe开机自启的命令:

文件创建完之后,会将setup.exe和autorun.inf文件设置成只读、隐藏、系统文件,然后盘符个数减一,跳到上面继续在下一个盘符创建这两个文件:

下面分析第二个关键函数的第三个函数,这个函数里面有创建线程的函数,创建了10个线程:

对线程回调函数sub_40BA8C进行分析,找到网络连接的关键函数:sub_40B864:

该函数,创建socket,然后连接局域网:192.168.150.1 中的0x8B(139)、0x1BD(445)端口:

连接失败就继续循环进行连接,如果连接成功:

进入一个函数,获取了模块基址,获取了文件名,获取了主机版本信息,创建了同一个网络资源的永久性连接:

又进入一个函数sub_40A928,遍历了目标机的共享目录:

然后将本地的病毒文件拷贝到了共享文件夹中:

下面分析第三个关键函数,里面有6个计时器,分别对每个计时器的回调函数进行分析。第一个计时器:

使用OD分析,先创建了线程:

对其回调函数进行分析,先获取并提升了权限,然后遍历桌面窗口,获取窗口名,如果是防火墙、进程、VirusScan、毒霸、江民等这些杀毒软件,就发送消息关闭杀毒软件,又遍历进程,关闭这些杀毒软件:

然后获取了系统目录,拼接了病毒spo0slv.exe的路径,然后将其添加为了启动项,并且修改注册表键值,隐藏文件:

第二个计时器,创建了进程,分析其回调函数,找到关键函数:40C9B0,先获取了网址:

然后打开网址,读取了数据到内存中:

然后获取系统盘的Windows目录,将读取到内存中的数据截断,拼接到Windows目录下,然后从指定的URL中下载数据到文件,然后创建进程,隐藏启动:

第三个计时器,里面有两个创建线程的函数:

第一个创建的回调函数和上一个计时器一样,从网址上下载恶意代码并隐藏启动,分析第二个回调函数sub_40CDEC:

先获取盘符个数,然后拼接字符串构成命令,使用WinExec创建进程,并隐藏执行删除网络共享的命令,循环每个盘符,将网络共享共享命令删除。然后删除admin网络共享:

第四个计时器,里面有一个创建线程的函数:

分析其回调函数sub_406E44:

40

经过分析,该回调函数是关掉了一些服务,删除了一些服务,让后修改了一些键值,关闭了杀软启动项。

第五个计时器,先是解密一些网址:

然后打开这些网址,读取网页中的数据:

第六个计时器,先解密获取网址,然后读取网址的数据到内存中,然后判断数据中是否有\r\n:

然后获得Windows目录,将内存中的数据截断,构造路径,将指定URL中的数据下载到该路径下的文件中,然后使用WinExec创建进程,隐藏启动该文件:

至此,第三个关键函数分析完了,整个程序的三个关键函数也都分析完了。

病毒程序流程:

解决方案

1、提取病毒的特征,利用杀毒软件查杀

病毒特征:Whboy、xBoy、spo0lsv.exe

2、手工查杀   

1、删除可疑进程spo0lsv.exe等

2、删除可疑启动项

3、删除或修改注册表

4、被感染的exe变成熊猫烧香的图标,手工无法清除,需要专杀工具查杀

3、编写专杀工具,完成对恶意代码的清理和修复。

    感染后的文件内容是:病毒文件 + 原文件 + WhBoy、文件名、.exe、文件十进制大小拼成的字符串。病毒大小是确定的,修复文件只需将原文件抽离出来,然后再写回去即可

//提权

void GetPrivileges()

{

    HANDLE hToken = NULL;

    HANDLE hProcess = GetCurrentProcess();

    OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);

    TOKEN_PRIVILEGES tp = { 0 };

    LookupPrivilegeValue(0, SE_SHUTDOWN_NAME, &tp.Privileges[0].Luid);

    tp.PrivilegeCount = 1;

    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

    //调用函数提升权限

    AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);

}

 

//遍历删除Desktop_.ini 文件、遍历修复.exe文件

BOOL GetFileInfo(const TCHAR* path)

{

    //1.构造代表子目录和文件夹路径的字符串,使用通配符  *

    WCHAR szFilePath[MAX_PATH];

    StringCbCopy(szFilePath, MAX_PATH, path);

    StringCbCat(szFilePath, MAX_PATH, L"\\*");

    //2.获取第一个文/目录,并获得查找句柄

    WIN32_FIND_DATA FindFileData;

    HANDLE hListFile = FindFirstFile(szFilePath, &FindFileData);

    if (INVALID_HANDLE_VALUE == hListFile)

    {

        return FALSE;

    }

    //3.循环遍历获取文件名

    do

    {

        //判断是否是本级目录或上级目录的名称,如果是结束本次循环

        if (!lstrcmp(FindFileData.cFileName, L".") || !lstrcmp(FindFileData.cFileName, L".."))

        {

            continue;

        }

        // 获取完整路径名

        WCHAR szFullPath[MAX_PATH];

        StringCbPrintf(szFullPath, MAX_PATH, L"%s\\%s", path, FindFileData.cFileName);

        // 如果是目录,再调用函数进去

        if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)

        {

            CString Path;

            Path.Format(_T("%s"), szFullPath);

            GetFileInfo(Path);

        }

        // 如果不是目录,判断文件类型,修复文件

        else

        {

            //删除 Desktop_.ini文件

            if (lstrcmp(FindFileData.cFileName,L"Desktop_.ini")==0)

            {

                // 去除文件的隐藏、系统以及只读属性

                DWORD dwDesktopiniAttributes = GetFileAttributes(szFullPath);

                dwDesktopiniAttributes &= ~FILE_ATTRIBUTE_HIDDEN;

                dwDesktopiniAttributes &= ~FILE_ATTRIBUTE_SYSTEM;

                dwDesktopiniAttributes &= ~FILE_ATTRIBUTE_READONLY;

                SetFileAttributes(szFullPath, dwDesktopiniAttributes);

                DeleteFile(szFullPath);

            }

            //恢复被感染的 .exe文件

            else

            {

                //文件名

                CString name;

                name.Format(_T("%s"), FindFileData.cFileName);

                if (name.Find(_T(".exe")) != -1)

                {

                    // 打开文件

                    HANDLE hFile = CreateFile(szFullPath//路径

                        GENERIC_READ//打开文件,要做什么

                        0,             //共享模式

                        NULL,          //安全属性

                        OPEN_EXISTING,   //如果存在就打开,不存在就创建

                        FILE_ATTRIBUTE_NORMAL//普通文件属性

                        NULL

                    );

                    // 获取文件最后一个字节,判断是否是 0x01,如果是说明被感染了

                    SetFilePointer(hFile, -1, 0, FILE_END);

                    BYTE* temp1 = new BYTE[1]{ 0 };

                    DWORD RealSize1 = 0;

                    ReadFile(hFile, temp1, 1, &RealSize1, NULL);

 

                    if (temp1[0] == 0x01)

                    {

                        printf("被感染了,需要修复\n");

                        SetFilePointer(hFile, -15, 0, FILE_END);

                        BYTE* temp3 = new BYTE[15]{ 0 };

                        DWORD RealSize1 = 0;

                        int nCount = 0;

                        int nCount1 = 0;

                        ReadFile(hFile, temp3, 15, &RealSize1, NULL);

                        //获取 02-文件大小十进制-01 长度

                        for (int i = 0; i < 15; i++)

                        {

                            if (temp3[i] == 0x02)

                            {

                                break;

                            }

                            nCount++;

                        }

                        nCount1 = 15 - nCount;

 

                        SetFilePointer(hFile, 0, 0, FILE_BEGIN);

                        // 获取文件大小

                        DWORD dwSize = GetFileSize(hFile, 0);

                        // 获取文件名长度

                        int FileNameLength = name.GetLength();

                        //原文件大小 = 感染后文件大小 - 病毒大小 126976 - 字符串大小(whboy + 文件名 + .exe + 02 + 文件大小 + 01

                        DWORD OrgionalFileSize = dwSize - 11 - 5 - FileNameLength - 4 - nCount1;

                        DWORD dwRealSize = 0;

                        char* p = new char[OrgionalFileSize + 1] {0};

                        //读取文件到内存

                        SetFilePointer(hFile, 11, 0, FILE_BEGIN)//略过前面的病毒文件

                        ReadFile(hFile, p, OrgionalFileSize, &dwRealSize, NULL);

                        CloseHandle(hFile);

                        //删除旧文件

                        DeleteFile(szFullPath);

                        //创建新文件

                        HANDLE hFile1 = CreateFile(szFullPath//路径

                            GENERIC_WRITE//打开文件,要做什么

                            0,             //共享模式

                            NULL,          //安全属性

                            CREATE_ALWAYS,   //创建

                            FILE_ATTRIBUTE_NORMAL//普通文件属性

                            NULL

                        );

                        WriteFile(hFile1, p, OrgionalFileSize, &dwRealSize, NULL);

                        CloseHandle(hFile1);

                    }

                }

            }

        }

    } while (FindNextFile(hListFile, &FindFileData));

    return TRUE;

}

// 遍历进程,删除病毒进程

BOOL KillVirusProcess()

{

    PROCESSENTRY32 stcPe32 = { sizeof(PROCESSENTRY32) };

    //1.创建一个快照

    HANDLE hProcessSnap = CreateToolhelp32Snapshot(

        TH32CS_SNAPPROCESS,   //表明创建的什么快照,目前是进程快照

        0                     //只在遍历堆和模块的时候有用

    );

    if (hProcessSnap == INVALID_HANDLE_VALUE)

    {

        return 0;

    }

    //2.根据快照循环遍历进程信息

    if (Process32First(hProcessSnap, &stcPe32) == FALSE)

    {

        return 0;

    }

    do

    {

        if (lstrcmp(stcPe32.szExeFile,L"spo0lsv.exe") == 0)

        {

            //获取病毒进程id

            DWORD dwPId = stcPe32.th32ProcessID;

            //结束病毒进程

            HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPId);

            DWORD Ret = TerminateProcess(hProc, 0);

            if (Ret)

            {

                printf("病毒进程已结束\n");

            }

            CloseHandle(hProc);

            break;

        }

    } while (Process32Next(hProcessSnap, &stcPe32));

}

// 删除 System 目录下的病毒文件

void DeleteVirusFile()

{

    WCHAR szFilePath[MAX_PATH];

    GetSystemDirectory(szFilePath, MAX_PATH);

    StringCbCat(szFilePath, MAX_PATH, L"\\spo0lsv.exe");

    // 修改病毒文件的属性

    DWORD dwVirusFileAttribute = GetFileAttributes(szFilePath);

    dwVirusFileAttribute &= ~FILE_ATTRIBUTE_HIDDEN;

    dwVirusFileAttribute &= ~FILE_ATTRIBUTE_SYSTEM;

    dwVirusFileAttribute &= ~FILE_ATTRIBUTE_READONLY;

    SetFileAttributes(szFilePath, dwVirusFileAttribute);

    // 删除病毒文件

    DWORD n=DeleteFile(szFilePath);

    int m = 0;

}

// 删除病毒释放的文件:Desktop.ini、autorun.inf、setup.exe

void DeleteSomeVirusFiles()

{

    TCHAR buff[MAX_PATH] = {};

    // 获取到所有盘符的 名称字符串

    GetLogicalDriveStrings(MAX_PATH, buff);

    TCHAR* drivers = buff;

    DWORD nCount = 0;

    while (*drivers != 0)

    {

        drivers += _tcslen(drivers) + 1;

        nCount++;

    }

    drivers = buff;

    for (int i=0;i<nCount;i++)

    {

        //删除 autorun.inf 文件

        TCHAR szAutorunFile[MAX_PATH] = { 0 };

        StringCbCat(szAutorunFile, MAX_PATH, drivers);

        StringCbCat(szAutorunFile, MAX_PATH, L"autorun.inf");

        // 去除文件的隐藏、系统以及只读属性

        DWORD dwAutorunAttributes = GetFileAttributes(szAutorunFile);

        dwAutorunAttributes &= ~FILE_ATTRIBUTE_HIDDEN;

        dwAutorunAttributes &= ~FILE_ATTRIBUTE_SYSTEM;

        dwAutorunAttributes &= ~FILE_ATTRIBUTE_READONLY;

        SetFileAttributes(szAutorunFile, dwAutorunAttributes);

        DeleteFile(szAutorunFile);

        //删除 setup.exe 文件

        TCHAR szSetupExe[MAX_PATH] = { 0 };

        StringCbCat(szSetupExe, MAX_PATH, drivers);

        StringCbCat(szSetupExe, MAX_PATH, L"setup.exe");

        // 去除文件的隐藏、系统以及只读属性

        DWORD dwSetupAttributes = GetFileAttributes(szSetupExe);

        dwSetupAttributes &= ~FILE_ATTRIBUTE_HIDDEN;

        dwSetupAttributes &= ~FILE_ATTRIBUTE_SYSTEM;

        dwSetupAttributes &= ~FILE_ATTRIBUTE_READONLY;

        SetFileAttributes(szSetupExe, dwSetupAttributes);

        DeleteFile(szSetupExe);

        //删除 Desktop.ini

        GetFileInfo(drivers);

 

        drivers += _tcslen(drivers) + 1;

    }

}

// 删除、修复注册表

void FixRegedit()

{

    // 删除启动项

    TCHAR RegeditRun[]= L"Software\\Microsoft\\Windows\\CurrentVersion\\Run";

    HKEY hKeyHKCU = NULL;

    LONG lSize = MAXBYTE;

    TCHAR Data[MAXBYTE] = { 0 };

    long Ret = RegOpenKey(HKEY_CURRENT_USER, RegeditRun, &hKeyHKCU);

    if (Ret == ERROR_SUCCESS)

    {

        Ret = RegQueryValueEx(hKeyHKCU, L"svcshare", NULL, NULL, (unsigned char*)Data, (unsigned long*)&lSize);

        if (Ret == ERROR_SUCCESS)

        {

            Ret = RegDeleteValue(hKeyHKCU, L"svcshare");

            if (Ret == ERROR_SUCCESS)

            {

                printf("注册表启动项中的病毒已删除!\n");

            }

            else

            {

                printf("删除失败\n");

            }

        }

        else

        {

            printf("注册表启动项中无病毒信息\n");

        }

        RegCloseKey(hKeyHKCU);

    }

    else

    {

        printf("无法读取注册表启动项\n");

    }

    // 修复文件的隐藏显示,需要将 CheckedValue 的值设置为 1

    TCHAR RegHide[] = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\Folder\\Hidden\\SHOWALL";

    HKEY hKeyHKLM = NULL;

    DWORD dwFlag = 1;

    long lRetHide = RegOpenKey(HKEY_LOCAL_MACHINE, RegHide, &hKeyHKLM);

    if (lRetHide == ERROR_SUCCESS)

    {

        if (ERROR_SUCCESS == RegSetValueEx(hKeyHKLM, L"CheckedValue", 0, REG_DWORD, (CONST BYTE*) & dwFlag, 4))

        {

            printf("注册表文件隐藏修复完成!\n");

        }

        else

        {

            printf("无法恢复注册表的文件隐藏选项\n");

        }

    }

}

 

int main()

{

    //提升权限

    GetPrivileges();

    // 结束病毒进程

    KillVirusProcess();

    // 删除 System 目录下的病毒文件

    DeleteVirusFile();

    // 删除病毒释放文件

    DeleteSomeVirusFiles();

    // 删除或修复注册表

    FixRegedit();

    // 遍历并删除Desktop_ini文件、遍历并修复exe文件

    GetFileInfo(_T("D:\\"));

   

    system("pause");

    return 0;

}

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值