首页
社区
课程
招聘
[原创]新人第一次病毒分析(附专杀工具源码)
发表于: 2021-3-20 17:37 13413

[原创]新人第一次病毒分析(附专杀工具源码)

2021-3-20 17:37
13413

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..uxetm/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做了修复):

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
#include<stdio.h>
#include<string>
//#include <afx.h>
#include <Shlwapi.h>
#pragma comment(lib,"shlwapi.lib")
#include<Windows.h>
#include <locale.h>
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");
}
#include<stdio.h>
#include<string>
//#include <afx.h>
#include <Shlwapi.h>
#pragma comment(lib,"shlwapi.lib")
#include<Windows.h>
#include <locale.h>
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编辑 ,原因:
收藏
免费 7
支持
分享
最新回复 (5)
雪    币: 3903
活跃值: (3564)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
不错哦,支持一下
2021-3-20 18:11
0
雪    币: 339
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
比楼上强太多了
2021-5-29 11:05
0
雪    币: 1223
活跃值: (46)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
学习一下病毒
2021-6-2 06:29
0
雪    币: 250
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
楼主能分享下大头贴吗?
2021-6-14 20:09
0
游客
登录 | 注册 方可回帖
返回
//