熊猫烧香概述
熊猫烧香,是一款拥有自动传播、自动感染硬盘能力和强大的破坏能力的病毒,它不但能感染系统中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;
}