社区应用 最新帖子 精华区 社区服务 会员列表 统计排行
  • 947阅读
  • 2回复

[分享]用volatility框架分析熊猫烧香病毒

楼层直达
z3960 
级别: 茶馆馆主
发帖
770867
飞翔币
207694
威望
215657
飞扬币
2511641
信誉值
8

1.熊猫烧香病毒介绍 熊猫烧香病毒其实是一种蠕虫病毒的变种,而且是经过多次变种而来的,由于中毒电脑的可执行文件会出现“熊猫烧香”图案,所以也被称为 “熊猫烧香”病毒。该病毒是一款拥有自动传播、自动感染硬盘能力和强大的破坏能力的病毒,它不但能感染系统中exe,com,pif,src,html,asp等文件,它还能中止大量的反病毒软件进程并且会删除扩展名为gho的文件。2.熊猫烧香病毒的行为特征1.该病毒在路径C:WINDOWSsystem32drivers创建了一个名为“spoclsv.exe”的进程2.终止任务管理器和注册表的运行,让c盘打不开3.在HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRun键项中添加svcshare中创建svcshare,用于在开机时启动位于在系统目录下面的创建的spoclsv.exe4.HKLMSOFTWAREMicrosoftWindowsCurrentVersionExplorerAdvancedFolderHiddenSHOWALL 中的CheckedValue的键值设置为0,进行文件隐藏,防止用户查看释放的病毒5.创建autorun.inf用于病毒的自启动,该文件属性都为隐藏.6.创建名为”Desktop_.ini”的隐藏文件3.病毒文件介绍及样本信息文件: spo0lsv.exe(熊猫烧香)大小: 29.30KBMD5:512301C535C88255C9A252FDF70B7A03SHA1: CA3A1070CFF311C0BA40AB60A8FE3266CFEFE870CRC32:E334747C本人上传的文件为病毒库备份文件,后缀名为.vir,这实质是一个exe的可执行文件,修改后缀名就可以运行。4.病毒文件脱壳处理1.  病毒加了fsg壳,接下来,我对它进行脱壳处理。 2.把exe文件拖到OD中,往下拖动鼠标,发现代码不多,使用单步法脱壳。 3.当运行到4001D1时,在按f8跳到OEP处,并按 Ctrl + A 强制分析 4.接着用LordPE和ImportREC工具进行后续的脱壳 5.获取内存转储文件     当病毒运行时,任务管理器会立马退出,注册表编辑器运行不久也会退出并且在电脑中会产生Desktop_.ini文件和autorun.inf文件,在路径C:WINDOWSsystem32drivers创建了一个名为“spoclsv.exe”的进程。当病毒程序运行一段时间之后,使用DumpIt工具转储内存,获得内存镜像文件,随后我把它改名为virus.exe。 6.用volatility框架分析熊猫烧香病毒行为痕迹1.使用pstree插件分析出系统中存在spo0lsv.exe病毒进程 2.使用printkey插件发现CheckedValue键值为0,意味着进行文件隐藏,防止用户查看释放的病毒 3.接下来使用filescan插件来分析病毒创建的Desktop_.ini文件,我这里使用了一个正常的转储文件WIN-93QJSQFSAIP-20190110-022750.raw进行对比,发现被熊猫烧香病毒感染的系统转储文件中存在Desktop_.ini文件,而正常的没有,因此该病毒创建了该文件。 4.使用filescan插件来分析病毒创建的autorun.inf文件,同样使用对比的方法,正常的转储文件没有该文件,而被熊猫烧香病毒感染的系统转储文件中存在着该文件 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] = '';        }        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("被删除!rn");                                    }                                     else                                    {                                        csTxt += _T("无法删除rn");                                    }                                }                        }                        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("检查系统内存...rn");        csTXT += _T("系统中存在病毒内存:spoclsv.exern");        csTXT += _T("准备进行查杀...rn");        SetDlgItemText(IDC_LIST1,csTXT);//IDC_LIST1要与对应的控件IDC对应        //提升权限        bRet = EnableDebugPrivilege((char *)SE_DEBUG_NAME);//这里也要进行类型转换         //        if (bRet == FALSE)        {             csTxt += _T("提升权限失败rn");        }        else        {                csTxt += _T("提升权限成功!rn");        }        SetDlgItemText(IDC_LIST1, csTxt);        // 打开并尝试结束病毒进程        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwpid);        if (hProcess == INVALID_HANDLE_VALUE)        {            csTxt += _T("无法结束病毒进程rn");            return;        }        bRet = TerminateProcess(hProcess, 0); //单个进程        if (bRet == FALSE)        {            csTxt += _T("无法结束病毒进程rn");            return;        }        csTxt += _T("病毒进程已经结束rn");        SetDlgItemText(IDC_LIST1, csTxt);        CloseHandle(hProcess);    }    else     {         csTxt += _T("系统中不存在spoclsv.exe病毒进程rn");    }    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文件...rn");    if (GetFileAttributes((LPCWSTR)szSysPath) == (DWORD)0xFFFFFFFF)    {        csTxt += _T("spoclsv.exe病毒文件不存在rn");    }    else    {        csTxt += _T("spoclsv.exe病毒文件存在,正在计算散列值rn");        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校验和验证失败rn");        }        else        {            csTxt += _T("spoclsv.exe校验和验证成功,正在删除...rn");            // 去除文件的隐藏、系统以及只读属性            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病毒被删除!rn");            }            else            {                csTxt += _T("spoclsv.exe病毒无法删除rn");            }        }    }    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病毒文件不存在rn");        }        else        {            csTxt += pTmp;            csTxt += _T("熊猫烧香.exe病毒文件存在,正在进行计算校验和...rn");            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("校验和验证失败rn");            }            else            {                csTxt += _T("校验和验证成功,正在删除...rn");                // 去除文件的隐藏、系统以及只读属性                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病毒被删除!rn");                }                else                {                    csTxt += pTmp;                    csTxt += _T("熊猫烧香.exe病毒无法删除rn");                }            }        }        // 去除文件的隐藏、系统以及只读属性        DWORD dwFileAttributes = GetFileAttributes((LPCWSTR)szAutorunPath);
我不喜欢说话却每天说最多的话,我不喜欢笑却总笑个不停,身边的每个人都说我的生活好快乐,于是我也就认为自己真的快乐。可是为什么我会在一大群朋友中突然地就沉默,为什么在人群中看到个相似的背影就难过,看见秋天树木疯狂地掉叶子我就忘记了说话,看见天色渐晚路上暖黄色的灯火就忘记了自己原来的方向。
级别: 超级版主
发帖
833785
飞翔币
226630
威望
224648
飞扬币
2443439
信誉值
0

只看该作者 1 发表于: 2019-11-22
来看一下
级别: 超级版主
发帖
833785
飞翔币
226630
威望
224648
飞扬币
2443439
信誉值
0

只看该作者 2 发表于: 2019-11-22
不错,了解了