首页
社区
课程
招聘
[原创]text.exe恶意软件分析。
发表于: 2015-8-25 21:03 8481

[原创]text.exe恶意软件分析。

2015-8-25 21:03
8481
首先向感谢各位读者能够浏览我这篇分析笔记,但也先读者说声抱歉,此次分析是使用三四天的闲暇时间进行分析记录。当中肯定是出现一些逻辑不紧密。希望各位读者不吝指出。

此次分析原始笔记为报告类型表格版(自行排版,没有参照来源,仍在完善中),看起来更简洁明了。

[ATTACH]原始笔记[/ATTACH] [ATTACH]目标程序[/ATTACH]

病毒报告名称:  恶意代码分析笔记5
目标分析文件名称:  text.exe文件
作者:  淘气鬼(放牛娃)
报告更新日期:  8.22
样本发行日期:  8.22
样本类型:  .exe
被感染文件变化大小:  
样本的MD5校验值:  DB9AC7A11C635D00E7A1E80A7E4D7CCB
样本的hash校验值:  C994B5B92867448694FADE6C9C4AAA797468B0AC
壳信息:  PEID深入扫描:UPX 0.89.6 - 1.02 / 1.05 - 2.90 -> Markus & Laszlo
但用UPX shell 解压显示不存在UPX壳
所以定义为:not found*
可能受威胁的系统:  XP,win7
相关漏洞:  
已知检测名称:  瑞星:Malware.1608462恶意软件类型病毒;

简介:  未加壳的可.exe执行文件
被感染的网络症状:  未知
系统文件变化:  系统目录中增加PlusCtrl.dll,xgqlgk.exe 
注册文件变化:  增加注册表项:SYSTEM\CurrentControlSet\Services\Description

网络症状:  

详细分析/功能介绍:  IDA静态验证分析:  导入表分析

详细分析:  API分类:
1.创建互斥

OpenMutexA  KERNEL32
CreateMutexA  KERNEL32

2.创建文件
CopyFileA  KERNEL32
ReadFile  KERNEL32
CreateFileA  KERNEL32

3.创建注册表
RegSetValueExA  ADVAPI32
RegOpenKeyExA  ADVAPI32
RegQueryValueExA  ADVAPI32

4.创建服务
CreateServiceA  ADVAPI32
StartServiceA  ADVAPI32
OpenServiceA  ADVAPI32

5.进程钩子注入

VirtualAlloc  KERNEL32
ReadProcessMemory  KERNEL32
WriteProcessMemory  KERNEL32
SetThreadContext  KERNEL32

6.创建网络
socket  WS2_32
WSAStartup  WS2_32
WSASocketA  WS2_32
send  WS2_32
sendto  WS2_32
setsockopt  WS2_32

7.其他类型函数

FindResourceA  KERNEL32

GetSystemDirectoryA  KERNEL32

1.互斥类型分析
CreateMutexA:
push    offset ServiceName ; "Distribumkq"
push    ebx             ; bInitialOwner
push    ebx             ; lpMutexAttributes
call    ds:CreateMutexA
创建 名为:Distribumkq互斥量,确保只有一个Distribumkq服务。
OpenMutexA:
打开:
push    offset ServiceName
push    0               ; bInheritHandle
push    1F0001h         ; dwDesiredAccess
call     ds:OpenMutexA
由第三个参数为ServiceName可知,要打开的互斥量是目标服务Distribumkq,这是为确保不会出现相同的两个服务,在服务创建中是常见的。

2.创建文件:

CopyFileA:
add     esp, 20h
push    offset asc_4093EC ; "\\"
lea     eax, [ebp+Buffer]
push    eax             ; lpString1
mov     ebx, ds:lstrcatA
call    ebx ; lstrcatA
lea     ecx, [ebp+String2]
push    ecx             ; lpString2
lea     edx, [ebp+Buffer]
push    edx             ; lpString1
call    ebx ; lstrcatA
push    esi             ; bFailIfExists
lea     eax, [ebp+Buffer]
push    eax             ; lpNewFileName
lea     ecx, [ebp+Str2]
push    ecx             ; lpExistingFileName
call    ds:CopyFileA
源文件名,新文件名需要动态调试才能获取。

CreateFileA :
①add     esp, 0Ch
lea     ecx, [ebp+FileName]
push    0               ; hTemplateFile
push    0               ; dwFlagsAndAttributes
push    2               ; dwCreationDisposition
push    0               ; lpSecurityAttributes
push    1               ; dwShareMode
push    40000000h       ; dwDesiredAccess
push    ecx             ; lpFileName
call    ds:CreateFileA
文件名指针指向的是从动态内存中获取的字符串地址;但是目标文件只有一个,要创建什么文件?结合下面的注册表创建,可知道这是要创建一个.dll文件,所以不存在将目标文件本身复制并创建另一个.dll文件。那么后面创建文件的文件源就很有可能是存放在目标文件的资源段里面。对此在后有PEView工具查看进行验证。

②push    0
push    0               ; dwFlagsAndAttributes
push    2               ; dwCreationDisposition
push    0               ; lpSecurityAttributes
push    1               ; dwShareMode
push    40000000h       ; dwDesiredAccess
push    offset FileName ; "PlusCtrl.dll"
call    ds:CreateFileA

ReadFile :
mov     eax, [ebp+nNumberOfBytesToRead]
lea     edx, [ebp+nNumberOfBytesToRead]
push    0               ; lpOverlapped
push    edx             ; lpNumberOfBytesRead
push    eax             ; nNumberOfBytesToRead
push    ebx             ; lpBuffer
push    esi             ; hFile
call    ds:ReadFile

文件类型小结:
初步判断是将目标文件中存放的PE文件作为源文件,将其复制为"PlusCtrl.dll",还有另外一个文件需要动态调试才能获取(经过DO动态验证生成的文件名为随机)

3.创建注册表:
RegOpenKeyExA  ADVAPI32
push    offset aSystemCurrentc ; "SYSTEM\\CurrentControlSet\\Services\\"
lea     ecx, [ebp+String1]
push    ecx             ; lpString1
call    ds:lstrcpyA
push    edi             ; lpString2
lea     edx, [ebp+String1]
push    edx             ; lpString1
call    ebx ; lstrcatA
lea     eax, [ebp+phkResult]
push    eax             ; phkResult
lea     ecx, [ebp+String1]
push    ecx             ; lpSubKey
push    80000002h       ; hKey
call    RegOpenKeyA
在"SYSTEM\\CurrentControlSet\\Services\\"路径中打开注册表。

RegSetValueExA  ADVAPI32
mov     edi, [ebp+lpString]
push    edi             ; lpString
call    ds:lstrlenA
push    eax             ; cbData
push    edi             ; lpData
push    1               ; dwType
push    0               ; Reserved
push    offset aDescription ; "Description"
mov     edx, [ebp+phkResult]
push    edx             ; hKey
call    RegSetValueExA
在"SYSTEM\\CurrentControlSet\\Services\\"路径中设置一个“Description”服务类型的注册表键值。

RegQueryValueExA  :
lea     eax, [ebp+String1]
push    offset aSystemCurrentc ; "SYSTEM\\CurrentControlSet\\Services\\"
push    eax             ; lpString1
call    ds:lstrcpyA
lea     ecx, [ebp+String1]
push    offset ServiceName ; "Distribumkq"
push    ecx             ; lpString1
call    ds:lstrcatA
lea     edx, [ebp+phkResult]
lea     eax, [ebp+String1]
push    edx             ; phkResult
push    0F003Fh         ; samDesired
push    0               ; ulOptions
push    eax             ; lpSubKey
push    80000002h       ; hKey
call    RegOpenKeyExA
mov     ecx, 41h
xor     eax, eax
lea     edi, [ebp+String1]
lea     edx, [ebp+String1]
rep stosd
lea     ecx, [ebp+cbData]
mov     [ebp+cbData], 104h
push    ecx             ; lpcbData
push    edx             ; lpData
push    eax             ; lpType
push    eax             ; lpReserved
mov     eax, [ebp+phkResult]
push    offset ValueName ; "ImagePath"
push    eax             ; hKey
call    RegQueryValueExA
首先是先打开目标注册表键值
"SYSTEM\\CurrentControlSet\\Services\\"然后在进行查询目标键值Distribumkq。

注册表类小结:
在注册表项"SYSTEM\\CurrentControlSet\\Services\\"中创建一个服务类型的注册表项”Distribumkq”实现自启动功能,以达到长期潜伏。

4.创建服务
CreateServiceA  ADVAPI32
push    edi             ; lpPassword
push    edi             ; lpServiceStartName
push    edi             ; lpDependencies
push    edi             ; lpdwTagId
push    edi             ; lpLoadOrderGroup
lea     ecx, [ebp+Str2]
push    ecx             ; lpBinaryPathName
push    edi             ; dwErrorControl
push    2               ; dwStartType
push    10h             ; dwServiceType
push    0F01FFh         ; dwDesiredAccess
mov     edx, [ebp+lpDisplayName]
push    edx             ; lpDisplayName
mov     edi, [ebp+lpServiceName]
push    edi             ; lpServiceName
push    eax             ; hSCManager
call    CreateServiceA
暂时未知创建的服务名是什么,但在后面的打开服务中得知,打开的服务名是:"Distribumkq",这个服务名也正符合目标文件创建的注册表键值。

StartServiceA  ADVAPI32
push    0               ; lpServiceArgVectors
push    0               ; dwNumServiceArgs
push    esi             ; hService
call    StartServiceA
在开启服务后面就调用到相关的注册表操作。
push    offset aSystemCurrentc ; "SYSTEM\\CurrentControlSet\\Services\\"
lea     ecx, [ebp+String1]
push    ecx             ; lpString1
call    ds:lstrcpyA
push    edi             ; lpString2
lea     edx, [ebp+String1]
push    edx             ; lpString1
call    ebx ; lstrcatA
lea     eax, [ebp+phkResult]
push    eax             ; phkResult
lea     ecx, [ebp+String1]
push    ecx             ; lpSubKey
push    80000002h       ; hKey
call    RegOpenKeyA
mov     edi, [ebp+lpString]
push    edi             ; lpString
call    ds:lstrlenA
push    eax             ; cbData
push    edi             ; lpData
push    1               ; dwType
push    0               ; Reserved
push    offset aDescription ; "Description"
mov     edx, [ebp+phkResult]
push    edx             ; hKey
call    RegSetValueExA
也进一步说明,在开启服务的时候就创建一个注册表项,是的该服务能够长期自启动运行。也符合服务持久性特点的正常操作。

OpenServiceA  ADVAPI32
次函数被两次调用,但都是打开同一个服务。
push    0F01FFh         ; dwDesiredAccess
push    offset ServiceName ; "Distribumkq"
push    eax             ; hSCManager
call    OpenServiceA
打开名为Distribumkq的服务。

服务类型小结:首先创建一个Distribumkq服务,然后在注册表中创建服务类型的注册表键值Distribumkq,以达到开启自启动效果。

5.进程钩子注入

VirtualAllocEx  KERNEL32
这是拓展虚拟内存函数。
mov     ebp, [esp+2FCh+arg_8]
mov     eax, [esp+2FCh+lpAddress]
mov     esi, ds:VirtualAllocEx
mov     ebx, [esp+2FCh+nSize]
mov     ecx, [ebp+1Ch]
mov     [esp+2FCh+Buffer], 0
cmp     ecx, eax
jnz     short loc_405E22
在次函数后面出现了获取内核模块函数地址。获取Ntdll!ZwUnmapViewOfSection函数地址。
loc_405E22:             ; "ZwUnmapViewOfSection"
push    offset aZwunmapviewofs
push    offset ModuleName ; "ntdll.dll"
call    ds:GetModuleHandleA
push    eax             ; hModule
call    ds:GetProcAddress
mov     ecx, [esp+2FCh+lpAddress]
mov     edx, [esp+2FCh+hProcess]
push    ecx
push    edx
call    eax
test    eax, eax
jnz     short loc_405E60

ReadProcessMemory  KERNEL32
首先先看调用ReadProcessMemory函数上面的调用 。
sub     esp, 60h
push    edi
mov     ecx, 10h
xor     eax, eax
lea     edi, [esp+64h+StartupInfo.lpReserved]
mov     [esp+64h+StartupInfo.cb], 0
rep stosd
mov     edi, [esp+64h+lpProcessInformation]
lea     eax, [esp+64h+StartupInfo]
push    edi             ; lpProcessInformation
push    eax             ; lpStartupInfo
push    0               ; lpCurrentDirectory
push    0               ; lpEnvironment
push    4               ; dwCreationFlags
push    0               ; bInheritHandles
push    0               ; lpThreadAttributes
push    0               ; lpProcessAttributes
push    offset CommandLine ; "svchost.exe"
push    0               ; lpApplicationName
call    ds:CreateProcessA
push    ebx
push    ebp
push    esi
mov     esi, [esp+70h+lpContext]
push    esi             ; lpContext
mov     dword ptr [esi], 10007h
mov     ecx, [edi+4]
push    ecx             ; hThread
call    ds:GetThreadContext
mov     eax, [esi+0A4h]
mov     ebp, [esp+70h+lpBuffer]
mov     ecx, [edi]
lea     edx, [esp+70h+lpProcessInformation]
push    edx             ; lpNumberOfBytesRead
push    4               ; nSize
add     eax, 8
push    ebp             ; lpBuffer
push    eax             ; lpBaseAddress
push    ecx             ; hProcess
call    ds:ReadProcessMemory

首先是创建一个进程svchost.exe,这也就解释了WriteProcessMemory  使用到的目标进程句柄是svchost.exe;然后在调用获取线程上下文的API,保存当前线程上下文,用于后面的WriteProcessMemory使用。  

WriteProcessMemory  KERNEL32
mov     edx, [esp+2FCh+Context._Ebx]
mov     esi, ds:WriteProcessMemory
lea     eax, [esp+2FCh+flOldProtect]
lea     ecx, [esp+2FCh+Buffer]
push    eax             ; lpNumberOfBytesWritten
mov     eax, [esp+300h+hProcess]
push    4               ; nSize
add     edx, 8
push    ecx             ; lpBuffer
push    edx             ; lpBaseAddress
push    eax             ; hProcess
call    esi ; WriteProcessMemory
mov     ecx, [esp+2FCh+arg_0]
mov     eax, [esp+2FCh+Buffer]
push    0               ; lpNumberOfBytesWritten
push    ebx             ; nSize
mov     edx, [ecx+3Ch]
push    edi             ; lpBuffer
mov     [edx+edi+34h], eax
mov     ecx, [esp+308h+Buffer]
mov     edx, [esp+308h+hProcess]
push    ecx             ; lpBaseAddress
push    edx             ; hProcess
call    esi ; WriteProcessMemory
请注意到一个细节mov     edx, [esp+2FCh+Context._Ebx],这条指令是将线程上下文内保存的ebx寄存其的值复制给edx。再往下看到目标调试进程中(目标就是上面的ReadProcessMemory调用前创建的svchost.exe进程句柄)写入内容,这是常见的钩子。

SetThreadContext  KERNEL32
push    ebx
push    ebp
push    esi
mov     esi, [esp+70h+lpContext]
push    esi             ; lpContext
mov     dword ptr [esi], 10007h
mov     ecx, [edi+4]
push    ecx             ; hThread
call    ds:GetThreadContext
此段汇编代码已经在ReadProcessMemory解析是已经展示过。他的做用就是获取svchost.exe的主线程上下文。

6.创建网络
socket  WS2_32
lea     edx, [esp+8E8h+Dest]
mov     word ptr [esp+8E8h+name.sa_data], ax
push    edx             ; cp
call    sub_4039C0
add     esp, 4
mov     dword ptr [esp+8E8h+name.sa_data+2], eax
push    0               ; protocol
push    1               ; type
push    2               ; af
call    socket
mov     esi, eax
lea     eax, [esp+8E8h+name]
push    10h             ; namelen
push    eax             ; name
push    esi             ; s
call    connect
这是一个信槽函数,在联通网络发送信息时需要使用socket  申请一个通信槽。

WSAStartup  WS2_32
mov     edi, offset szUrl ; "uu863939P3344P弔>6>6"
or      ecx, 0FFFFFFFFh
xor     eax, eax
push    12h
repne scasb
not     ecx
dec     ecx
push    ecx
push    offset szUrl    ; "uu863939P3344P弔>6>6"
call    sub_402690
add     esp, 1Ch
lea     eax, [ebp+WSAData]
push    eax             ; lpWSAData
push    202h            ; wVersionRequested
call    WSAStartup
mov     edi, ds:WaitForSingleObject
mov     ebx, ds:CloseHandle
loc_402C09:             ; lpParameter
push    0
push    offset sub_401B50 ; lpStartAddress
call    sub_401000
push    0FFFFFFFFh      ; dwMilliseconds
push    eax             ; hHandle
mov     hObject, eax
call    edi ; WaitForSingleObject
    为了在应用程序当中调用任何一个Winsock API函数,首先第一件事情就是必须通过WSAStartup函数完成对Winsock服务的初始化,因此需要调用WSAStartup函数。

WSASocketA  WS2_32
sub     esp, 2ECh
push    ebx
push    ebp
push    esi
mov     esi, [esp+2F8h+arg_0]
push    edi
lea     eax, [esp+2FCh+WSAData]
mov     ecx, 24h
lea     edi, [esp+2FCh+var_220]
push    eax             ; lpWSAData
push    202h            ; wVersionRequested
rep movsd
mov     edx, dword_409C40
mov     ecx, dword_409C3C
mov     eax, dword_409C44
mov     edi, 1
xor     ebx, ebx
push    edi             ; dwFlags
mov     [esp+300h+var_2B0], edx
push    ebx             ; g
xor     edx, edx
push    ebx             ; lpProtocolInfo
mov     dword ptr [esp+308h+cp], ecx
mov     cx, word_409C48
push    0FFh            ; protocol
mov     [esp+30Ch+var_2A6], edx
push    3               ; type
push    2               ; af
mov     [esp+314h+var_2AC], eax
mov     [esp+314h+var_2A8], cx
mov     [esp+314h+var_2A2], dx
call    WSASocketA
创建一个绑定特定的传输服务信槽(套接字)。

send  WS2_32
loc_401CBE:
mov     eax, fd
push    0               ; flags
lea     edx, [ebp+buf]
mov     ecx, 59h
lea     esi, [ebp+var_1BC]
lea     edi, [ebp+Parameters]
push    16Ch            ; len
mov     dword ptr [ebp+buf], 164h
mov     [ebp+var_5B8], 77h
push    edx             ; buf
rep movsd
push    eax             ; s
call    send

sendto  WS2_32
loc_403B99:
lea     eax, [esp+8B4h+to]
push    10h             ; tolen
push    eax             ; to
push    0               ; flags
lea     ecx, [esp+8C0h+buf]
push    ebx             ; len
push    ecx             ; buf
push    edi             ; s
call    ebp ; sendto

setsockopt  WS2_32
push    ebp
mov     ebp, esp
sub     esp, 0Ch
push    esi
mov     esi, [ebp+s]
lea     eax, [ebp+optval]
push    4               ; optlen
push    eax             ; optval
push    8               ; optname
push    0FFFFh          ; level
push    esi             ; s
call    setsockopt

inet_addr
push    100h
mov     [esp+300h+var_2EA], ax
mov     [esp+300h+var_2E8], di
mov     [esp+300h+var_2E6], 40h
call    sub_4039A0
add     esp, 4
lea     ecx, [esp+2FCh+cp]
mov     [esp+2FCh+var_2E4], al
mov     [esp+2FCh+var_2E3], 6
push    ecx             ; cp
mov     [esp+300h+var_2E2], bx
call    inet_addr
将包含IPv4点分十进制的地址转换成适合的地址IN_ADDR结构结构字符串。但是没有得到确切的目标通讯地址。需要进行动态分析才能获取。

通信类型小结:有上面的网络通信类型的API可知,目标文件会创建网络,然后进行通讯。但具体的通讯目标是什么现在还尚未清楚。

7.其他类型函数

FindResourceA  KERNEL32
这是一个枚举资源API
mov     ecx, [ebp+lpName]
push    ebx
push    esi
push    edi
mov     edi, [ebp+hModule]
push    eax             ; lpType
push    ecx             ; lpName
push    edi             ; hModule
call    ds:FindResourceA
push    esi             ; hResInfo
push    edi             ; hModule
call    ds:SizeofResource
push    esi             ; hResInfo
push    edi             ; hModule
mov     ebx, eax
call    ds:LoadResource
上面调用的API,是实现资源查找,并载入目标资源,再根据其后面调用的是文件创建,文件写入得出再入的资源正是创建文件的文件源。在根据在目标文件的资源段找到的PE文件,很快就得出,源文件就是目标文件资源段的PE文件。

GetSystemDirectoryA  KERNEL32
sub     esp, 104h
lea     eax, [esp+104h+Buffer]
push    104h            ; uSize
push    eax             ; lpBuffer
call    ds:GetSystemDirectoryA
lea     ecx, [esp+104h+Buffer]
push    offset aProgramFilesIn ; "\\Program Files\\Internet Explorer\\iex"...
push    ecx             ; lpString1
mov     [esp+10Ch+var_102], 0
call    ds:lstrcatA
获取的是C:\Program Files\Internet Explorer\iexplore.exe路径。这是IE浏览器的路径,也就是说目标进程需要使用到IE浏览器。

API相关联性总结:
1.循环遍历查找目标资源文件
2.将目标资源文件复制并生成一个PlusCtrl.dll动态链接库文件和另一个文件。
3.对“svchost.exe”进程进行进程注入。
4.创建一个互斥对象”Distribumkq”,确保系统只存在一个”Distribumkq”服务。
5.创建一个服务为”Distribumkq ”,创建一个注册表项为SYSTEM\CurrentControlSet\Services\Description
6.创建网络通信。

    导出表分析  由于此目标函数是.exe文件,所以不存在什么到处文件。
    main函数分析  
  动态验证分析  OD
验证:  1.打开注册表:UNICODE "Software\Microsoft\Windows NT\CurrentVersion\Windo"

2.获取注册表键:"LoadAppInit_DLLs"

3.打开注册表:
|hKey = HKEY_LOCAL_MACHINE
|Subkey = "SYSTEM\CurrentControlSet\Services\Distribumkq"
|Reserved = 0x0
|Access = KEY_ALL_ACCESS
\pHandle = 0018FDD0
|NewFileName = "C:\Windows\system32\xgqlgk.exe"

4.将目标文件text.exe文件复制并创建为xgqlgk.exe 存放在系统目录中( "C:\Windows\system32\xgqlgk.exe")。创建的文件名是
add esp,0x20
push text.004093EC                      ; /StringToAdd = "\"
lea eax,[local.136]                     ; |
push eax                                ; |ConcatString = "C:\Windows\system32\xgqlgk.exe"
mov ebx,dword ptr ds:[<&KERNEL32.lstrca>; |kernel32.lstrcatA
call ebx                                ; \lstrcatA
lea ecx,[local.230]
push ecx                                ; /StringToAdd = "C:\Users\Smallboy\Desktop\调试\text.exe"
lea edx,[local.136]                     ; |
push edx                                ; |ConcatString = 0000000B ???
call ebx                                ; \lstrcatA
push esi                                ; /FailIfExists = FALSE
lea eax,[local.136]                     ; |
push eax                                ; |NewFileName = "C:\Windows\system32\xgqlgk.exe"
lea ecx,[local.202]                     ; |
push ecx                                ; |ExistingFileName = "C:\Users\Smallboy\Desktop\调试\text.exe"
call dword ptr ds:[<&KERNEL32.CopyFileA>; \CopyFileA
   但是在执行完文件创建之后,在相关的目录中并没有找到xgqlgk.exe,这就很合值得怀疑这个文件已经被隐藏起来。

5.开启Distribumkq服务,并且设置服务类型为自启动类型。
|hKey = HKEY_LOCAL_MACHINE
|Subkey = "SYSTEM\CurrentControlSet\Services\Distribumkq"
打开注册表,来到目标注册表项,查看相关的注册表键值。如同下图所示:

再根据他的对外显示服务名称

查看计算机服务,找到Distribuqre Transaction Coordinator Service查看他相关服务内容属性,如下图所示。

6.

    RegShop验证:  增加的键:
----------------------------------
Keys added: 16
----------------------------------
HKLM\SYSTEM\ControlSet001\services\Distribumkq
HKLM\SYSTEM\CurrentControlSet\services\Distribumkq

增加的键值:
HKLM\SYSTEM\ControlSet001\Control\Session Manager\PendingFileRenameOperations: 
HKLM\SYSTEM\ControlSet001\services\Distribumkq\Type: 0x00000010
HKLM\SYSTEM\ControlSet001\services\Distribumkq\Start: 0x00000002
HKLM\SYSTEM\ControlSet001\services\Distribumkq\ErrorControl: 0x00000000
HKLM\SYSTEM\ControlSet001\services\Distribumkq\ImagePath: "C:\Windows\system32\xgqlgk.exe"
HKLM\SYSTEM\ControlSet001\services\Distribumkq\DisplayName: "Distribuqre Transaction Coordinator Service"
HKLM\SYSTEM\ControlSet001\services\Distribumkq\WOW64: 0x00000001
HKLM\SYSTEM\ControlSet001\services\Distribumkq\ObjectName: "LocalSystem"
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations:
HKLM\SYSTEM\CurrentControlSet\services\Distribumkq\Type: 0x00000010
HKLM\SYSTEM\CurrentControlSet\services\Distribumkq\Start: 0x00000002
HKLM\SYSTEM\CurrentControlSet\services\Distribumkq\ErrorControl: 0x00000000
HKLM\SYSTEM\CurrentControlSet\services\Distribumkq\ImagePath: "C:\Windows\system32\xgqlgk.exe"
HKLM\SYSTEM\CurrentControlSet\services\Distribumkq\DisplayName: "Distribuqre Transaction Coordinator Service"
HKLM\SYSTEM\CurrentControlSet\services\Distribumkq\WOW64: 0x00000001

    Autoruns 
验证:  启动Autoruns 再使用OD调试目标程序时,Autoruns 出现异常崩溃。
    Process Explorer
验证:  
    Process Monitir 
验证:  启动Process Monitir 再使用OD调试目标程序时,Process Monitir出现异常崩溃。
    PCHunter
验证:  
  其他工具验证分析  PEView  
查看到资源段里面存放着一个PE文件。
总结:  1.从静态分析中,获知目标文件创建PlusCtrl.dll,但是在动态分析是却没有发现该目标文件创建,也没有发现释放目标文件资源中PE文件。
2.创建服务:Distribumkq 
3.创举注册表:SYSTEM\CurrentControlSet\Services\Description
由于此文件并没有完全执行,所以在动态运行分析时,并没有监测到PlusCtrl.dll的创建。在也没有对目标进程”svchost.exe”的内核函数ZwUnmapViewOfSection进行挂钩
再结合GetSystemDirectoryA获取的C:\Program Files\Internet Explorer\iexplore.exe路径,以及互斥量的创建;可以猜测这是将生成的PlusCtrl.dll注入到iexplore.exe中。那么现在就可以判断PlusCtrl.dll可能存在的两个目的:1.对iexplore.exe进行注入,实现某些特定的恶意功能;2.里面存放第三方函数,然后用于对iexplore.exe中的某些函数进行挂钩,从而隐秘实现某系恶意功能。但从对svchost.exe的ZwUnmapViewOfSection来讲PlusCtrl.dll更倾向于dll注入动态挂钩。

思考:  首先重缕一遍整个静态分析流程。
1.创建文件;(将恶意软件长期主流在系统磁盘,为长期实现恶意软件被赋予的使命)
2.创建注册表;(创建一个持久的服务注册表项,并设置为自启动项,使得恶意软件(服务)能长期存活)
3.对权限高长调用的svchost.exe进程进行注入,将他调用的ZwUnmapViewOfSection进行挂钩。
4.创建网络套接字,首先网络通讯。

结合上面几点,可以实现一个长期类型的信息恶意软件,而且隐秘性比较强作用范围更广(ZwUnmapViewOfSection属于内核函数)。
技术热点总结:  注入,钩子。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 716
活跃值: (158)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
勘误:
ZwUnmapViewOfSection ,ReadProcessMemory,WriteProcessMemory  三者结合更符合进程互换注入。ZwUnmapViewOfSection负责对目标进程内容卸载然后ReadProcessMemory,WriteProcessMemory  对第三方挂起进程内存注入的到目标进程中。但是具体是什么由于目标文件不能正常执行,所以无法动态分析清楚,还望见谅!(^_^)
2015-8-26 08:14
0
雪    币: 401
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
点个赞先
2015-9-3 20:28
0
雪    币: 68
活跃值: (30)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
厉害 板凳先
2015-10-9 17:00
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
2018-7-3 09:16
0
游客
登录 | 注册 方可回帖
返回
//