1. 样本概况
1.1 样本信息
样本名称:熊猫烧香
MD5: 19DBEC50735B5F2A72D4199C4E184960
SHA1: CA3A1070CFF311C0BA40AB60A8FE3266CFEFE870
实验平台:Windows 7 Ultimate With Service Pack 1
分析工具:PEiD v0.95、StudyPE x64 v1.11、IDA x32 v7.4、Bochs v2.6.9、VMWare WorkStation v15.56、x32dbg
初步行为观察:
文件行为:
自复制到系统目录并运行,复制到其他盘符根目录隐藏,并且加入autorun.ini文件。感染exe文件,修改图标,感染后的文件体积增大。
注册表行为:
创建启动项,删除系统程序,关闭安全中心
网络行为:访问IP地址192.168.232.1
字符串提取后,发现可能存在安全软件对抗,有可能会破坏安全软件的注册表项
存在一些特殊目录
疑似弱口令字典,可能存在弱口令猜解行为
导入表分析:
文件操作
WriteFile
UnhandledExceptionFilter
SetFilePointer
SetEndOfFile
ReadFile
GetFileSize
GetFileType
CreateFile
GetWindowsDirectoryA
SetFileAttributesA
CopyFileA
文件、窗口遍历
FindNextFileA
FindFirstFileA
FindClose
FindWindowA
注册表操作
RegQueryValueExA
RegOpenKeyExA
RegCloseKey
RegSetValueExA
RegOpenKeyExA
RegDeleteValueA
RegCreateKeyExA
提升权限类
OpenProcessToken
LookupPrivilegeValueA
AdjustTokenPrivileges
网络连接
WSACleanup
WSAStartup
gethostname
gethostbyname
socket
inet_ntoa
inet_addr
htons
connect
closesocket
InternetGetConnectedState
InternetReadFile
InternetOpenUrlA
InternetOpenA
InternetCloseHandle
服务类
OpenServiceA
OpenSCManagerA
DeleteService
ControlService
CloseServiceHandle
添加计划任务,远程下载
NetScheduleJobAdd
URLDownloadToFileA
2.具体行为分析
2.1 主要行为
程序开头有两次条件判断:
用两个字符串进行运算,得到的结果与固定字符串“武汉男生感染下载者”进行比对,一致则继续,否则将退出程序。之后再次用两个字符串运算后判断,与” uup2..uxe
tm/vhjnx.fdu/”一致则继续,否则将退出程序。
该程序首次执行流程为:
判断恶意程序运行目录下是否存在”Desktop_.ini”文件,如果存在则删除。读取自身到内存,判断是否为已经感染的文件,如果是则附带运行原文件。判断当前运行目录是否为system32,不是则自复制到system\drivers目录下,文件名为spo0lsv.exe,并且执行该文件,然后结束自身。
第二次执行流程:
当程序在drivers目录下执行且文件名为spo0lsv.exe时,则会执行感染传播部分(sub_40D18C)
感染传播部分流程:
分为三个功能函数:
感染传播部分第一个功能函数是建立一个线程,这个线程会遍历所有盘符下的文件夹
值得注意的是,程序会避开一些目录(如WINDOWS,WINNT),如果出现这些目录将会进入下一轮搜索。否则会在该目录下创建Desktop_.ini文件,内容为当前的系统时间。
而当检测到GHO文件时(GHOST备份文件),则会删除该文件。推测这样做是为了避免用户恢复系统
当搜索到EXE,SCR,PIF等可执行文件后缀时,会进入感染流程
感染流程为:读取搜索到的文件,读取检查是否出现WhBoy字符串,如果有则说明该文件已经被感染,将不会继续感染流程。如果不存在,则会把恶意程序自身复制后覆盖该文件。接着把读取的原文件写入到该文件的末尾。
而当搜索到的文件为setup.exe或者NTDETECT.COM时,不会执行感染流程,因为这两个文件可能为恶意程序自己释放的文件。
感染传播部分第二个功能函数为建立一个定时器,每6秒触发一次,定时器功能如下
遍历盘符(跳过ab盘),寻找盘符根目录是否有autorun.inf文件,如果存在,则搜索是否有setup.exe文件,对比是否为恶意程序本身,如果不是就删除该文件。最终会在每个盘符根目录留下一个隐藏属性的setup.exe(恶意程序本身),还有一个隐藏属性的autorun.inf(自动播放)文件。文件内容为“[AutoRun]\r\nOPEN=setup.exe\r\nshellexe”
值得注意的是,该功能为计时器定时触发,当用户插入U盘时,也会受到感染。
感染传播部分第三个功能函数为网络传播,将会创建10个线程,对139,445端口进行漏洞利用,功能如下:
得到本机网段地址,对网段内主机139端口和445端口依次尝试连接
一旦连接成功,则会尝试使用默认账号和内置的弱口令字典进行漏洞利用,如果成功连接,将会拷贝恶意代码到远程主机,名为“GameSteup.exe”,并且使用添加计划任务的方式远程执行。
第三部分:
第三部分共有六个计时器事件
第一个计时器:
查找窗口信息,找到疑似杀毒软件或者安全辅助工具,将会使用postmessage发送WM_QUIT消息来使进程退出。
而后对杀毒软件进程进行遍历并且结束。
接着会注册为开机启动项(名为svcshare),并且修改注册表使得用户无法通过修改文件夹设置来查看隐藏文件
CheckedValue(1→0)
第二个计时器:
从http://www.ac86.cn/66/up.txt 读取内容,如果读取到的内容为“QQ”,则会进行文件下载并且执行
第三个计时器:
会创建一个线程用于和上个功能一样的下载,还会创建一个线程删除用户共享
第四个定时器:
主要操作是关闭杀毒软件的服务项、计划任务项等
第五个计时器:
功能为读取内置的一些网页
第六个计时器:
功能同样为读取网页,根据结果决定是否要下载并执行文件
2. 解决方案(或总结)
最后附上我写的专杀工具(暂时只对EXE做了修复):
/
/
using namespace std;
const char Features[
5
]
=
{
'W'
,
'h'
,
'B'
,
'o'
,
'y'
};
/
/
检查是否为whboy病毒文件
bool
checkVirus(LPCWCHAR Filename) {
FILE
*
F1
=
NULL;
if
(
0
=
=
_wfopen_s(&F1, Filename, L
"rb"
))
{
/
/
病毒本体大小
BYTE
File
[
0x7531
]
=
{
0
};
fread_s(
File
,
0x7531
,
0x7531
,
1
, F1);
/
/
比较特征
if
(memcmp(
File
+
0x4920
, Features,
5
))
{
fclose(F1);
return
false;
}
else
{
fclose(F1);
return
true;
}
}
return
false;
}
void RepairFile(LPCWCHAR Filename) {
FILE
*
F1
=
NULL;
if
(
0
=
=
_wfopen_s(&F1, Filename, L
"rb"
))
{
/
/
获取大小
fseek(F1,
0
, SEEK_END);
DWORD FileSize
=
ftell(F1);
/
/
筛选
if
(FileSize>
0x7531
)
{
rewind(F1);
BYTE
*
File
=
new BYTE[FileSize];
fread_s(
File
, FileSize, FileSize,
1
, F1);
rewind(F1);
/
/
如果特征符合
if
(!memcmp(
File
+
0x4920
, Features,
5
))
{
fclose(F1);
FILE
*
F2
=
NULL;
if
(
0
=
=
_wfopen_s(&F2, Filename, L
"wb"
))
{
fwrite(
File
+
0x7531
, FileSize
-
0x7531
-
0x1F
,
1
, F2);
fclose(F2);
wprintf(L
"已修复%s\n"
, Filename);
}
}
else
{
fclose(F1);
}
delete[]
File
;
}
else
{
fclose(F1);
}
}
}
void SearchInfected(LPCWSTR Path) {
WIN32_FIND_DATA FileInfo
=
{
0
};
wstring FindPath
=
wstring(Path)
+
L
"\\*"
;
HANDLE FindHnandle
=
FindFirstFile(FindPath.c_str(), &FileInfo);
if
(INVALID_HANDLE_VALUE!
=
FindHnandle)
{
do
{
if
(FileInfo.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
{
if
(_wcsicmp(FileInfo.cFileName, L
"."
) && _wcsicmp(FileInfo.cFileName, L
".."
)&& _wcsicmp(FileInfo.cFileName, L
"WINDOWS"
)&&
_wcsicmp(FileInfo.cFileName, L
"system32"
))
{
wstring NextPath
=
wstring(Path)
+
L
"\\"
+
FileInfo.cFileName;
SearchInfected(NextPath.c_str());
}
else
{
continue
;
}
}
else
{
if
(!_wcsicmp(PathFindExtension(FileInfo.cFileName), L
".exe"
))
{
wstring FilePath
=
wstring(Path)
+
L
"\\"
+
FileInfo.cFileName;
RepairFile(FilePath.c_str());
}
}
}
while
(FindNextFile(FindHnandle, &FileInfo));
}
}
int
main() {
setlocale(LC_ALL, "");
wprintf(L
"熊猫烧香专杀工具 v0.1\n"
);
wprintf(L
"即将开始,在结束前请不要做其他操作\n"
);
system(
"pause"
);
/
/
开始专杀部分
system(
"taskkill /F /IM spo0lsv.exe"
);
WCHAR Buf[
50
]
=
{
0
};
GetLogicalDriveStrings(
50
, Buf);
WCHAR
*
Drive
=
Buf;
printf(
"正在全盘扫描并修复文件\n"
);
/
/
遍历盘符
while
(
*
Drive!
=
NULL)
{
WCHAR FilePath[MAX_PATH]
=
{
0
};
wcscpy_s(FilePath, MAX_PATH, (WCHAR
*
)Drive);
wcscat_s(FilePath, MAX_PATH, L
"autorun.inf"
);
wprintf(L
"%s\n"
, FilePath);
/
/
删除autorun.inf
SetFileAttributes(FilePath, FILE_ATTRIBUTE_NORMAL);
DeleteFile(FilePath);
/
/
删除setup.exe
wcscpy_s(FilePath, MAX_PATH, (WCHAR
*
)Drive);
wcscat_s(FilePath, MAX_PATH, L
"setup.exe"
);
if
(checkVirus(FilePath))
{
SetFileAttributes(FilePath, FILE_ATTRIBUTE_NORMAL);
DeleteFile(FilePath);
}
/
/
扫描并修复文件
SearchInfected(Drive);
Drive
+
=
4
;
}
system(
"reg add \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\Folder\\Hidden\\SHOWALL\" /v CheckedValue /t reg_dword /d 1 /f"
);
system(
"reg delete \"HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run \" /v svcshare /f"
);
system(
"pause"
);
}
/
/
using namespace std;
const char Features[
5
]
=
{
'W'
,
'h'
,
'B'
,
'o'
,
'y'
};
/
/
检查是否为whboy病毒文件
bool
checkVirus(LPCWCHAR Filename) {
FILE
*
F1
=
NULL;
if
(
0
=
=
_wfopen_s(&F1, Filename, L
"rb"
))
{
/
/
病毒本体大小
BYTE
File
[
0x7531
]
=
{
0
};
fread_s(
File
,
0x7531
,
0x7531
,
1
, F1);
/
/
比较特征
if
(memcmp(
File
+
0x4920
, Features,
5
))
{
fclose(F1);
return
false;
}
else
{
fclose(F1);
return
true;
}
}
return
false;
}
void RepairFile(LPCWCHAR Filename) {
FILE
*
F1
=
NULL;
if
(
0
=
=
_wfopen_s(&F1, Filename, L
"rb"
))
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2021-3-25 14:42
被Endali编辑
,原因: