首先向感谢各位读者能够浏览我这篇分析笔记,但也先读者说声抱歉,此次分析是使用三四天的闲暇时间进行分析记录。当中肯定是出现一些逻辑不紧密。希望各位读者不吝指出。
此次分析原始笔记为报告类型表格版(自行排版,没有参照来源,仍在完善中),看起来更简洁明了。
[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属于内核函数)。
技术热点总结: 注入,钩子。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!