码迷,mamicode.com
首页 > 其他好文 > 详细

hook007

时间:2015-09-09 16:50:06      阅读:296      评论:0      收藏:0      [点我收藏+]

标签:

前言

   该样本存在很多年了,一直在杀,但是一直都没有彻底的死掉,还在不断的更新版本,不多的采取各种免杀手段去避开360安全卫士的查杀,该样本对用户的诱惑性也特别的强,该样本主要利用了用户的安全意识薄弱,诱导用户点击一些看似不会造成危害的快捷方式,在用户点击后,同时也会出现用户预期的效果,以蒙蔽用户,所以,希望广大用户在下载软件程序的时候,需要特别的注意,定期查杀是必不可少的,你不可能保证你没有中招,为了你自身隐私的安全以及你的财产安全养成良好的上网习惯以及定期扫描的习惯

一般用户的文件选项都没有显示隐藏的文件和文件夹这个选项,所以用户看到的往往是只有那一个快捷键方式,当我们选择了这个选项呢?你会看到一个被隐藏了的文件夹,这个文件夹里面就是用户噩梦的开始了

样本分析

快捷方式:

指向样本的主体程序,被命名为图片,以诱导用户点击该快捷方式,当你点击这个快捷方式的时候,的确会打开一个图片,让用户以为自己是打开了一个图片,其实不然,在用户以为这是打开了一个图片的时候,一些东西开始潜伏在用户电脑中了,接下来我们就来看是如何潜伏的

C:\WINDOWS\system32\cmd.exe /c 1\Inst.exe

 

inst.exe分析

0x01加载恶意dll

该样本在程序执行的时候,会首先获取到DBCsp_ABC.dll中的一些函数(这里贴出部分),为后面的做铺垫

00401002  |.  68 4CE34000   push Inst.0040E34C                       ; /FileName = "DBCsp_ABC.dll"
00401007  |.  8BF1          mov esi,ecx                              ; |
00401009  |.  FF15 64E14000 call dword ptr ds:[<&KERNEL32.LoadLibrar>; \LoadLibraryA
0040100F  |.  8B3D 68E14000 mov edi,dword ptr ds:[<&KERNEL32.GetProc>;  kernel32.GetProcAddress
00401015  |.  68 38E34000   push Inst.0040E338                       ; /ProcNameOrOrdinal = "CPAcquireContext"
0040101A  |.  50            push eax                                 ; |hModule
0040101B  |.  8946 24       mov dword ptr ds:[esi+0x24],eax          ; |
0040101E  |.  FFD7          call edi                                 ; \GetProcAddress
00401020  |.  8946 28       mov dword ptr ds:[esi+0x28],eax
00401023  |.  8B46 24       mov eax,dword ptr ds:[esi+0x24]
00401026  |.  68 28E34000   push Inst.0040E328                       ; /ProcNameOrOrdinal = "CPGetProvParam"
0040102B  |.  50            push eax                                 ; |hModule
0040102C  |.  FFD7          call edi                                 ; \GetProcAddress
0040102E  |.  8B4E 24       mov ecx,dword ptr ds:[esi+0x24]
00401031  |.  68 18E34000   push Inst.0040E318                       ; /ProcNameOrOrdinal = "CPSetProvParam"
00401036  |.  51            push ecx                                 ; |hModule
00401037  |.  8906          mov dword ptr ds:[esi],eax               ; |
00401039  |.  FFD7          call edi                                 ; \GetProcAddress
0040103B  |.  8B56 24       mov edx,dword ptr ds:[esi+0x24]
0040103E  |.  68 04E34000   push Inst.0040E304                       ; /ProcNameOrOrdinal = "CPReleaseContext"
00401043  |.  52            push edx                                 ; |hModule
00401044  |.  8946 04       mov dword ptr ds:[esi+0x4],eax           ; |
00401047  |.  FFD7          call edi                                 ; \GetProcAddress

 

0x02解密config.dat

通过调用GetModuleFileName函数获取到当前加载的模块的目录,然后通过字符串拼接的方式获取到文件路径,获取文件中的内容,经过简单减法和异或解密出config.dat文件

10001043    57              push edi
10001044    68 04010000     push 0x104
10001049    8D85 F8FEFFFF   lea eax,dword ptr ss:[ebp-0x108]
1000104F    50              push eax
10001050    6A 00           push 0x0
10001052    FF15 18700010   call dword ptr ds:[<&KERNEL32.GetModuleF>; kernel32.GetModuleFileNameA
10001058    8D8D F8FEFFFF   lea ecx,dword ptr ss:[ebp-0x108]
1000105E    51              push ecx
1000105F    FF15 18710010   call dword ptr ds:[<&SHLWAPI.PathRemoveF>; SHLWAPI.PathRemoveFileSpecA
10001065    68 D0880010     push DBToken_.100088D0                   ; ASCII "\config.dat"
1000106A    8D95 F8FEFFFF   lea edx,dword ptr ss:[ebp-0x108]
10001070    52              push edx
10001071    FF15 14700010   call dword ptr ds:[<&KERNEL32.lstrcatA>] ; kernel32.lstrcatA

解密代码

10001100    8A10            mov dl,byte ptr ds:[eax]
10001102    80F2 F1         xor dl,0xF1
10001105    80EA 0F         sub dl,0xF
10001108    8810            mov byte ptr ds:[eax],dl
1000110A    40              inc eax
1000110B    4E              dec esi
1000110C  ^ 75 F2           jnz XDBToken_.10001100

技术分享

技术分享

 

0x03写入大量注册表、

写入的注册表和值,这些全是和中国农业一行相关的一些注册表,这些都是一些老版本留下来的一些信息,所以从这里可以知道,该样本活跃在很多方向,不仅仅是

技术分享

 

0x04创建线程运行解密后的config.dat

首先判读当前运行的程序的名字是否已被重新命名为load.exe在被运行,如果是就执行dllhost.exe,然后退出进程

if ( StrStrA(&Filename, Srch) )
  {
    SHGetSpecialFolderPathA(0, &pszPath, 36, 0);
    lstrcatA(&pszPath, aLimitDllhost_e);
    WinExec(&pszPath, 0);
    ExitProcess(0);
  }

如果没有退出,继续向下的时候,会先判断当前的进程是否含有baidu.exe,如果有就会通过创建线程的形式,让dllhost.exe运行起来,并且通过调用ShellExecuteA函数打开http://www.baidu.com,然后会创建快照遍历进程看是否存在一个名叫360Tray.exe的进程(360Tray.exe是360安全卫士实时监控程序)


v1 = CreateToolhelp32Snapshot(2u, 0);
v2 = operator new(0x128u);
*(_DWORD *)v2 = 296;
if ( Process32First(v1, (LPPROCESSENTRY32)v2) )
{
  if ( !strcmpi((const char *)v2 + 36, Str2) )
    return *((_DWORD *)v2 + 2);
  if ( Process32Next(v1, (LPPROCESSENTRY32)v2) )
  {
    while ( lstrcmpiA((LPCSTR)v2 + 36, Str2) )
    {
      if ( !Process32Next(v1, (LPPROCESSENTRY32)v2) )
        return 0;
    }
    return *((_DWORD *)v2 + 2);
  }
}

如果不存在这个进程样本就开始写注册表,指向load程序,使Load开机时能够自己启动,然后就会退出程序

00ABF010   80000001  |hKey = HKEY_CURRENT_USER
00ABF014   009503F0  |Subkey = "Software\Microsoft\Windows NT\CurrentVersion\Windows"
00ABF018   00000000  |Reserved = 0
00ABF01C   00000000  |Class = NULL
00ABF020   00000000  |Options = REG_OPTION_NON_VOLATILE
00ABF024   000F003F  |Access = KEY_ALL_ACCESS
00ABF028   00000000  |pSecurity = NULL
00ABF02C   00ABF044  |pHandle = 00ABF044
00ABF030   00ABF04C  \pDisposition = 00ABF04C

RegCreateKeyExA(HKEY_CURRENT_USER, SubKey, 0, 0, 0, 0xF003Fu, 0, &phkResult, &dwDisposition);
RegSetValueExA(phkResult, ValueName, 0, 1u, (const BYTE *)&String1, strlen(&String1) + 1);
RegCloseKey(phkResult);

接下来,样本都会通过查找config.dat解密后的PE文件中的资源文件,将找到的资源文件重名crossfire.exe保存在C:\Program Files\limit\crossfire.exe,然后创建进程crossfire.exe

result = FindResourceA(hModule, (LPCSTR)(unsigned __int16)a2, lpType);
  v5 = result;
  if ( result )
  {
    result = (HRSRC)LoadResource(hModule, result);
    v6 = result;
    if ( result )
    {
      result = (HRSRC)CreateFileA(lpFileName, 0x40000000u, 2u, 0, 2u, 0x80u, 0);
      v7 = result;
      if ( result )
      {
        v8 = SizeofResource(hModule, v5);
        WriteFile(v7, v6, v8, &NumberOfBytesWritten, 0);
        CloseHandle(v7);
        result = (HRSRC)1;
      }
    }
  }

技术分享

 

然后判断当前进程的字符串中是否含有setup.exe字样,如果有,就解密io.dat,解密后的数据一卡就是一个图片格式

技术分享

解密后,创建一个图片文件,并将刚刚的图片数据写入到新创建的图片中

技术分享

 

然后调用ShellExecuteA函数将图片打开,以

0093ABD4    6A 01           push 0x1
0093ABD6    6A 00           push 0x0
0093ABD8    8D8424 80010000 lea eax,dword ptr ss:[esp+0x180]
0093ABDF    6A 00           push 0x0
0093ABE1    50              push eax
0093ABE2    68 44049500     push 0x950444                            ; ASCII "open"
0093ABE7    6A 00           push 0x0
0093ABE9    FF15 C4529400   call dword ptr ds:[0x9452C4]             ; SHELL32.ShellExecuteA

然后将BFGupdateM.dll重命名复制到1.jpg中,然后判断是否存在360Tray.exe程序

hook007

标签:

原文地址:http://www.cnblogs.com/kangxiaopao/p/4794836.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!