吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 13437|回复: 36
收起左侧

[PC样本分析] 用volatility框架分析熊猫烧香病毒

[复制链接]
buzhifou01 发表于 2019-11-19 21:49
使用论坛附件上传样本压缩包时必须使用压缩密码保护,压缩密码:52pojie,否则会导致论坛被杀毒软件等误报,论坛有权随时删除相关附件和帖子!
病毒分析分区附件样本、网址谨慎下载点击,可能对计算机产生破坏,仅供安全人员在法律允许范围内研究,禁止非法用途!
禁止求非法渗透测试、非法网络攻击、获取隐私等违法内容,即使对方是非法内容,也应向警方求助!
本帖最后由 buzhifou01 于 2019-11-20 21:30 编辑

1.熊猫烧香病毒介绍
2345截图20191119192735.png 熊猫烧香病毒其实是一种蠕虫病毒的变种,而且是经过多次变种而来的,由于中毒电脑的可执行文件会出现“熊猫烧香”图案,所以也被称为 “熊猫烧香”病毒。该病毒是一款拥有自动传播、自动感染硬盘能力和强大的破坏能力的病毒,它不但能感染系统中exe,com,pif,src,html,asp等文件,它还能中止大量的反病毒软件进程并且会删除扩展名为gho的文件。
2.熊猫烧香病毒的行为特征

1.该病毒在路径C:\WINDOWS\system32\drivers创建了一个名为“spoclsv.exe”的进程

2.终止任务管理器和注册表的运行,让c盘打不开

3.在HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run键项中添加svcshare中创建svcshare,用于在开机时启动位于在系统目录下面的创建的spoclsv.exe

4.HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\Hidden\SHOWALL 中的CheckedValue的键值设置为0,进行文件隐藏,防止用户查看释放的病毒

5.创建autorun.inf用于病毒的自启动,该文件属性都为隐藏.

6.创建名为”Desktop_.ini”的隐藏文件
3.病毒文件介绍及样本信息
文件: spo0lsv.exe(熊猫烧香)
大小: 29.30KB
MD5:512301C535C88255C9A252FDF70B7A03
SHA1: CA3A1070CFF311C0BA40AB60A8FE3266CFEFE870
CRC32:E334747C
本人上传的文件为病毒库备份文件,后缀名为.vir,这实质是一个exe的可执行文件,修改后缀名就可以运行。
4.病毒文件脱壳处理
1.  病毒加了fsg壳,接下来,我对它进行脱壳处理。
2345截图20191119193411.png
2.把exe文件拖到OD中,往下拖动鼠标,发现代码不多,使用单步法脱壳。
2345截图20191119193702.png
3.当运行到4001D1时,在按f8跳到OEP处,并按 Ctrl + A 强制分析
2345截图20191119193854.png

2345截图20191119193935.png

4.接着用LordPE和ImportREC工具进行后续的脱壳
2345截图20191119194209.png

2345截图20191119203954.png
5.获取内存转储文件
     当病毒运行时,任务管理器会立马退出,注册表编辑器运行不久也会退出并且在电脑中会产生Desktop_.ini文件和autorun.inf文件,在路径C:\WINDOWS\system32\drivers创建了一个名为“spoclsv.exe”的进程。当病毒程序运行一段时间之后,使用DumpIt工具转储内存,获得内存镜像文件,随后我把它改名为virus.exe。
image.png

image.png

6.用volatility框架分析熊猫烧香病毒行为痕迹
1.使用pstree插件分析出系统中存在spo0lsv.exe病毒进程
image.png
2.使用printkey插件发现CheckedValue键值为0,意味着进行文件隐藏,防止用户查看释放的病毒
image.png

3.接下来使用filescan插件来分析病毒创建的Desktop_.ini文件,我这里使用了一个正常的转储文件WIN-93QJSQFSAIP-20190110-022750.raw进行对比,发现被熊猫烧香病毒感染的系统转储文件中存在Desktop_.ini文件,而正常的没有,因此该病毒创建了该文件。

image.png
4.使用filescan插件来分析病毒创建的autorun.inf文件,同样使用对比的方法,正常的转储文件没有该文件,而被熊猫烧香病毒感染的系统转储文件中存在着该文件

image.png

image.png
7.专杀熊猫烧香病毒代码分析
1.在内存中查找病毒是否存在的函数FindTargetProcrss,该函数的思路是首先遍历转储文件中所有的进程,并且判断这些进程中是否有名为spoclsv.exe,有则判断内存中存在熊猫烧香病毒

bool C专杀工具Dlg::FindTargetProcrss(char *pszProcessName, DWORD *dwpid)
{
    bool bFind = false;
    HANDLE hprocessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//进程快照

    if (hprocessSnap ==INVALID_HANDLE_VALUE)
    {
        return bFind;
    }
    PROCESSENTRY32 pe = {0};
    pe.dwSize = sizeof(pe);
    BOOL bRet = Process32First(hprocessSnap,&pe); //循环初始化值
    while (bRet)
    {
        if (lstrcmp(pe.szExeFile,(LPCWSTR)pszProcessName)==0)
        {
            *dwpid = pe.th32ProcessID;
            bFind = true;
            break;
        }
        bRet = Process32Next(hprocessSnap,&pe);
    }
    CloseHandle(hprocessSnap);
    return bFind;
}

2.提升权限函数EnableDebugPrivilege,该函数使用了三个提升权限的函数OpenProcessToken,LookupPrivilegeValue,AdjustTokenPrivileges。EnableDebugPrivilege函数帮助杀毒程序提升了自己的权限

bool C专杀工具Dlg::EnableDebugPrivilege(char * pszPrivilege)
{
    HANDLE hToken = INVALID_HANDLE_VALUE;
    LUID luid;
    TOKEN_PRIVILEGES tp;


    BOOL bRet = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)
    if (bRet == FALSE)
    {
        return bRet;
    }


    bRet = LookupPrivilegeValue(NULL, (LPCWSTR)pszPrivilege, &luid);//这里需要进行类型转换,将pszPrivilege转换成LPCWSTR类型
    if (bRet == FALSE)
    {
        return bRet;
    }


    tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = luid;
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;


    bRet = AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);


    return bRet;
}
3.寻址磁盘文件函数FindFiles,该函数遍历磁盘中所有的文件,并判断内存是否存在病毒创建的Desktop_.ini文件和autorun.inf文件,如果存在则去除文件的隐藏、系统以及只读属性

DWORD WINAPI FindFiles(LPVOID lpszPath)
{
        WIN32_FIND_DATA stFindFile;
        HANDLE hFindFile;
        // 扫描路径
        char szPath[MAX_PATH];   
        char szFindFile[MAX_PATH];
        char szSearch[MAX_PATH];
        char *szFilter;
        int len;
        int ret = 0;

        szFilter = "*.*";
        lstrcpy(szPath, (char *)lpszPath);

        len = lstrlen(szPath);
        if(szPath[len-1] != '\\')
        {
                szPath[len] = '\\';
                szPath[len+1] = '\0';
        }

        lstrcpy(szSearch, szPath);
        lstrcat(szSearch,szFilter);

        hFindFile = FindFirstFile(szSearch, &stFindFile);
        if(hFindFile != INVALID_HANDLE_VALUE)
        {
            do
                {
                    lstrcpy(szFindFile, szPath);
                    lstrcat(szFindFile, stFindFile.cFileName);

                        if(stFindFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)//is null
                        {
                            if(stFindFile.cFileName[0] != '.')
                                {
                                    FindFiles(szFindFile);
                                }
                        }
                        else
                        {
                                if(!lstrcmp(stFindFile.cFileName,"Desktop_.ini"))
                                {
                                    // 去除文件的隐藏、系统以及只读属性
                                    DWORD dwFileAttributes = GetFileAttributes(szFindFile);
                                    dwFileAttributes &= ~FILE_ATTRIBUTE_HIDDEN;  //非
                                    dwFileAttributes &= ~FILE_ATTRIBUTE_SYSTEM;
                                    dwFileAttributes &= ~FILE_ATTRIBUTE_READONLY;
                                    SetFileAttributes(szFindFile, dwFileAttributes);
                                    // 删除Desktop_.ini
                                    BOOL bRet = DeleteFile(szFindFile);        
                                    csTxt += szFindFile;
                                    if (bRet)
                                    {
                                        csTxt += _T("被删除!\r\n");
                                    }
                                    else
                                    {
                                        csTxt += _T("无法删除\r\n");
                                    }
                                }
                        }
                        ret = FindNextFile(hFindFile, &stFindFile);
                }while(ret != 0);
        }

        FindClose(hFindFile);
        
        return 0;
}
4.散列值匹配函数CRC32,该函数计算了病毒的散列值,并返回。
DWORD CRC32(BYTE* ptr, DWORD Size)//buffer ptr len
{
    DWORD crcTable[256], crcTmp1;
    //动态生成CRC-32表
    for (int i = 0; i < 256; i++)
    {
        crcTmp1 = i;
        for (int j = 8; j > 0; j--)
        {
            if (crcTmp1 & 1) crcTmp1 = (crcTmp1 >> 1) ^ 0xEDB88320L;
            else crcTmp1 >>= 1;
        }

        crcTable = crcTmp1;
    }
    //计算CRC32值
    DWORD crcTmp2 = 0xFFFFFFFF;
    while (Size--)
    {
        crcTmp2 = ((crcTmp2 >> 8) & 0x00FFFFFF) ^ crcTable[(crcTmp2 ^ (*ptr)) & 0xFF];
        ptr++;
    }
    return (crcTmp2 ^ 0xFFFFFFFF);
}
5.专杀熊猫烧香病毒程序的主函数,首先判断内存是否存在要找的熊猫烧香病毒,如果存在结束该病毒进程。随后计算病毒文件的散列值并与已知的散列值进行比较,如若相同,则删除该文件。接着查找autorun.inf,以及Desktop_.ini文件并去除这两个文件的隐藏、系统以及只读属性
void C专杀工具Dlg::OnBnClickedButton1()
{
    // TODO: 在此添加控件通知处理程序代码

    //char * pszProcessName;
    DWORD dwpid = 0;
    bool bRet = false;
    CString csTxt;
    //1.在内存中查找病毒是否存在,如果找到spoclsv.exe进程,则结束掉它,并删除病毒程序本身
    bRet= FindTargetProcrss("spoclsv.exe", &dwpid);
    if (bRet == true)
    {
        CString csTXT = _T("检查系统内存...\r\n");
        csTXT += _T("系统中存在病毒内存:spoclsv.exe\r\n");
        csTXT += _T("准备进行查杀...\r\n");
        SetDlgItemText(IDC_LIST1,csTXT);//IDC_LIST1要与对应的控件IDC对应
        //提升权限
        bRet = EnableDebugPrivilege((char *)SE_DEBUG_NAME);//这里也要进行类型转换

        //
        if (bRet == FALSE)
        {
             csTxt += _T("提升权限失败\r\n");
        }
        else
        {
                csTxt += _T("提升权限成功!\r\n");
        }
        SetDlgItemText(IDC_LIST1, csTxt);
        // 打开并尝试结束病毒进程
        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwpid);
        if (hProcess == INVALID_HANDLE_VALUE)
        {
            csTxt += _T("无法结束病毒进程\r\n");
            return;
        }
        bRet = TerminateProcess(hProcess, 0); //单个进程
        if (bRet == FALSE)
        {
            csTxt += _T("无法结束病毒进程\r\n");
            return;
        }
        csTxt += _T("病毒进程已经结束\r\n");
        SetDlgItemText(IDC_LIST1, csTxt);
        CloseHandle(hProcess);
    }
    else
    {
         csTxt += _T("系统中不存在spoclsv.exe病毒进程\r\n");
    }

    Sleep(10);
    // 查杀磁盘中是否存在名为spoclsv.exe的病毒文件
    char szSysPath[MAX_PATH] = { 0 };
    GetSystemDirectory((LPWSTR)szSysPath, MAX_PATH);

    lstrcat((LPWSTR)szSysPath, (LPCWSTR)"\\drivers\\spoclsv.exe");

     csTxt += _T("检查硬盘中是否存在spoclsv.exe文件...\r\n");

    if (GetFileAttributes((LPCWSTR)szSysPath) == (DWORD)0xFFFFFFFF)
    {
        csTxt += _T("spoclsv.exe病毒文件不存在\r\n");
    }
    else
    {
        csTxt += _T("spoclsv.exe病毒文件存在,正在计算散列值\r\n");

        HANDLE hFile = CreateFile((LPWSTR)szSysPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        if (hFile == INVALID_HANDLE_VALUE)
        {
            AfxMessageBox(_T("Create Error"));
            return;
        }
        DWORD dwSize = GetFileSize(hFile, NULL);
        if (dwSize == 0xFFFFFFFF)
        {
            AfxMessageBox(_T("GetFileSize Error"));
            return;
        }
        BYTE *pFile = (BYTE*)malloc(dwSize);
        if (pFile == NULL)
        {
            AfxMessageBox(_T("malloc Error"));
            return;
        }

        DWORD dwNum = 0;
        ReadFile(hFile, pFile, dwSize, &dwNum, NULL);
        // 计算spoclsv.exe的散列值,散列值判断严谨
        DWORD dwCrc32 = CRC32(pFile, dwSize);

        if (pFile != NULL)
        {
            free(pFile);
            pFile = NULL;
        }

        CloseHandle(hFile);
        // 0x89240FCD是“熊猫烧香”病毒的散列值
        if (dwCrc32 != 0x89240FCD)
        {
            csTxt += _T("spoclsv.exe校验和验证失败\r\n");
        }
        else
        {
            csTxt += _T("spoclsv.exe校验和验证成功,正在删除...\r\n");
            // 去除文件的隐藏、系统以及只读属性
            DWORD dwFileAttributes = GetFileAttributes((LPCWSTR)szSysPath);
            dwFileAttributes &= ~FILE_ATTRIBUTE_HIDDEN;
            dwFileAttributes &= ~FILE_ATTRIBUTE_SYSTEM;
            dwFileAttributes &= ~FILE_ATTRIBUTE_READONLY;
            SetFileAttributes((LPCWSTR)szSysPath, dwFileAttributes);
            // 删除spoclsv.exe
            bRet = DeleteFile((LPCWSTR)szSysPath);
            if (bRet)
            {
                csTxt += _T("spoclsv.exe病毒被删除!\r\n");
            }
            else
            {
                csTxt += _T("spoclsv.exe病毒无法删除\r\n");
            }
        }
    }
    SetDlgItemText(IDC_LIST1, csTxt);
    Sleep(10);
    ///////////////////////////////////////////////////////////////////
    //  删除每个盘符下的熊猫烧香.exe与autorun.inf,以及Desktop_.ini
    ///////////////////////////////////////////////////////////////////
    char szDriverString[MAXBYTE] = { 0 };
    char *pTmp = NULL;
    //获取字符串类型的驱动器列表  
    GetLogicalDriveStrings(MAXBYTE, (LPWSTR)szDriverString);

    pTmp = szDriverString;

    while (*pTmp)
    {
        char szAutorunPath[MAX_PATH] = { 0 };
        char szSetupPath[MAX_PATH] = { 0 };
        //get路径
        lstrcat((LPWSTR)szAutorunPath, (LPCWSTR)pTmp);
        lstrcat((LPWSTR)szAutorunPath, (LPCWSTR)"autorun.inf");
        lstrcat((LPWSTR)szSetupPath,(LPCWSTR)pTmp);
        lstrcat((LPWSTR)szSetupPath, (LPCWSTR)"setup.exe");

        if (GetFileAttributes((LPCWSTR)szSetupPath) == 0xFFFFFFFF)
        {
            csTxt += pTmp;
            csTxt += _T("熊猫烧香.exe病毒文件不存在\r\n");
        }
        else
        {
            csTxt += pTmp;
            csTxt += _T("熊猫烧香.exe病毒文件存在,正在进行计算校验和...\r\n");
            HANDLE hFile = CreateFile((LPCWSTR)szSetupPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
            if (hFile == INVALID_HANDLE_VALUE)
            {
                AfxMessageBox(_T("Create Error"));
                return;
            }
            DWORD dwSize = GetFileSize(hFile, NULL);
            if (dwSize == 0xFFFFFFFF)
            {
                AfxMessageBox(_T("GetFileSize Error"));
                return;
            }
            BYTE *pFile = (BYTE*)malloc(dwSize);
            if (pFile == NULL)
            {
                AfxMessageBox(_T("malloc Error"));
                return;
            }

            DWORD dwNum = 0;
            ReadFile(hFile, pFile, dwSize, &dwNum, NULL);

            DWORD dwCrc32 = CRC32(pFile, dwSize);
            if (pFile != NULL)
            {
                free(pFile);
                pFile = NULL;
            }
            CloseHandle(hFile);
            if (dwCrc32 != 0x89240FCD)
            {
                csTxt += _T("校验和验证失败\r\n");
            }
            else
            {
                csTxt += _T("校验和验证成功,正在删除...\r\n");
                // 去除文件的隐藏、系统以及只读属性
                DWORD dwFileAttributes = GetFileAttributes((LPCWSTR)szSetupPath);
                dwFileAttributes &= ~FILE_ATTRIBUTE_HIDDEN;
                dwFileAttributes &= ~FILE_ATTRIBUTE_SYSTEM;
                dwFileAttributes &= ~FILE_ATTRIBUTE_READONLY;
                SetFileAttributes((LPCWSTR)szSetupPath, dwFileAttributes);
                // 删除熊猫烧香.exe
                bRet = DeleteFile((LPCWSTR)szSetupPath);
                if (bRet)
                {
                    csTxt += pTmp;
                    csTxt += _T("熊猫烧香.exe病毒被删除!\r\n");
                }
                else
                {
                    csTxt += pTmp;
                    csTxt += _T("熊猫烧香.exe病毒无法删除\r\n");
                }
            }
        }
        // 去除文件的隐藏、系统以及只读属性
        DWORD dwFileAttributes = GetFileAttributes((LPCWSTR)szAutorunPath);
}


image.png

熊猫烧香.rar

27.82 KB, 下载次数: 110, 下载积分: 吾爱币 -1 CB

病毒文件

免费评分

参与人数 9吾爱币 +14 热心值 +8 收起 理由
floweylyu + 1 + 1 用心讨论,共获提升!
heywell + 1 + 1 我很赞同!
mcwindy + 1 + 1 我很赞同!
Hmily + 6 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
撸冰花 + 1 + 1 我很赞同!
huangyutong + 1 + 1 谢谢@Thanks!
wangtian666 + 1 热心回复!
ehdhs + 1 + 1 谢谢@Thanks!
yzzq-qaz + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

涛之雨 发表于 2019-11-20 07:09
本帖最后由 涛之雨 于 2019-11-20 07:13 编辑

来晚了。前来报道
PS:只是icon一样。。。其他没有任何关系。。。
此外 可以用bbs的代码块让代码看起来舒服一些
像这样
[C] 纯文本查看 复制代码
//这里是C语言代码
#include "studio.h"
//xxxx代码

图片也要处理一下。。。看着好麻烦
看好作者哦
BalaIa7845 发表于 2019-11-28 09:43
BalaIa7845 发表于 2019-11-28 09:41
dump出来之后用importREC修复之后运行异常退出,正常不?

啊我错了不正常的,对不起打扰了
小统子 发表于 2019-11-19 22:09
blackhook 发表于 2019-11-19 22:15
当年可是够牛的病毒了;李俊也是蛮厉害的,用现在的话说应该是草根出生吧
委员长_ 发表于 2019-11-19 22:30
好文,谢谢分享
Hmily 发表于 2019-11-19 22:30
看这个文章把图片处理一下https://www.52pojie.cn/misc.php? ... 29&messageid=36
yzzq-qaz 发表于 2019-11-19 22:31
学习了 楼主厉害
zz1111 发表于 2019-11-19 22:39
感谢答主,学习一下
sijia7816 发表于 2019-11-19 22:44
感谢,楼主厉害
ehdhs 发表于 2019-11-19 22:56
感谢楼主,高手
wanghongbin 发表于 2019-11-19 23:06
谢谢楼主
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 09:42

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表