恶意代码分析入门(二)动态分析

任务一:实验环境准备与基线建立

确认虚拟机网络为仅主机模式,断绝除了本机和本机上其它虚拟机外一切网络连接

使用Regshot拍摄注册表快照,之后会拍摄第二次进行对比

Seabreg/Regshot: Regshot is a small, free and open-source registry compare utility that allows you to quickly take a snapshot of your registry and then compare it with a second one – done after doing system changes or installing a new software product

记录运行前的进程列表

关键目录(C:\Windows\System32、%TEMP%)文件列

运行样本,等三分钟后,点击2nd shot,然后进行对比:

几乎所有新增的注册表项都是 驱动程序数据库 (HKLM\DRIVERS\DriverDatabase\DeviceIds) 和 IdentityCRL 相关条目,这些都是Windows 正常启动/运行过程中的行为,与样本程序无关。

未发现开机自启动、未发现在Temp、Roaming、System32目录下释放文件,但是发现创建了 Application Insights .trn 文件(可能尝试外联上报遥测),可能是一个远控木马。

任务二:Process Monitor进程监控

进程监视器 – Sysinternals | Microsoft Learn

启动Procmon64.exe

我们先清空旧日志,因为Procmon 默认会一直捕获系统事件,噪声很多

先暂停捕获 Ctrl+E

然后清空当前事件 Ctrl+X

样本路径为该目录下的压缩包,解压后名字改成Malware.exe

然后我们可以在Procmon中来设置基础的过滤器

Ctrl+L添加规则,第一条规则:

Process Name is 样本文件名.exe then Include

如果是通过双击运行样本,那么父进程通常是explorer.exe 。
可以额外加一条:

Process Name is explorer.exe then Include

回到主界面Ctrl+E 让 Procmon 开始捕获,并双击开始运行样本,至少两分钟,两分钟后Ctrl+E停止捕获

开始分析之前,保存一份完整日志,防止误操作

这是原始的日志,之后就算过滤错了,也可以重新打开分析

1.先看进程树

点击:

Tools -> Process Tree

或者快捷键 CTRL+T

在弹出来的样本Process Tree里找到我们的样本Malware.exe。主要两件事:1.父进程是谁 2.有没有创建子进程 ,有的话 子进程名字是什么

常见情况是:

explorer.exe
└── sample.exe

如果看到这种,说明是双击运行样本的

直观上没看到父进程和子进程

发现父进程的PID是5596,5596正是Explorer.EXE

2.看文件操作

Procmon 顶部有一排小图标,分别控制不同类型事件
先只保留:Show File System Activity,也就是文件系统事件图标
可以暂时关闭:

Show Registry Activity
Show Network Activity
Show Process and Thread Activity
Show Profiling Events

这样界面里就主要是文件读写行为

找Temp目录行为

Ctrl + F 搜索 Temp
重点看 Operation 这一列有没有这些操作:

CreateFile
WriteFile
SetRenameInformationFile
SetDispositionInformationFile

如果看到类似:

Malware.exe          CreateFile              C:\Users\test\AppData\Local\Temp\abc.exe
Malware.exe          WriteFile                C:\Users\test\AppData\Local\Temp\abc.exe

这就说明样本可能在 Temp 下释放了文件

说明Malware.exe并没有对Temp目录进行操作

找 ProgramData 行为

继续按Ctrl + F,搜索:ProgramData,重点看有没有:

CreateFile
WriteFile
CreateDirectory
SetBasicInformationFile

如果看到:

Malware.exe          CreateFile              C:\ProgramData\xxx\update.exe
Malware.exe          WriteFile               C:\ProgramData\xxx\update.exe

这就说明样本可能在 ProgramData 下释放了文件。ProgramData 经常被恶意样本用来放置持久化文件,因为这个目录比较隐蔽,不像桌面那么明显。

只搜索到Explorer.EXE对该目录有操作,这个样本并没有对该目录进行操作

找 System32 / SysWOW64 行为

分别搜索:System32和SysWOW64,重点看有没有写入行为。

注意:很多程序会读取 System32 里的 DLL,这不一定可疑,比如下面这种一般只是正常加载:

CreateFile                  C:\Windows\System32\kernel32.dll
Load Image                  C:\Windows\System32\kernel32.dll

但是如果看到:

WriteFile                   C:\Windows\System32\xxx.dll
CreateFile                  C:\Windows\System32\xxx.exe

那就很可疑,因为普通程序一般不应该往 System32 写文件

这个样本并没有很可疑的行为

3.看注册表行为

顶部图标里,现在打开: Show Registry Activity

然后搜索 CurrentVersion\Run 看有没有这些路径:

HKCU\Software\Microsoft\Windows\CurrentVersion\Run
HKLM\Software\Microsoft\Windows\CurrentVersion\Run
HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce

重点操作是:

RegCreateKey
RegSetValue
RegDeleteValue

尤其是:RegSetValue ,如果看到类似:

Malware.exe       RegSetValue
HKCU\Software\Microsoft\Windows\CurrentVersion\Run\Updater

这基本就是自启动持久化行为。

没有发现

4.看进程创建行为

顶部图标里打开:Show Process and Thread Activity

搜索Process Create,或者直接看Operation列里有没有:

Process Create
Process Start
Process Exit
Load Image

重点是 Process Create,如果看到

Malware.exe         Process Create         C:\Windows\System32\cmd.exe

或者:

Malware.exe         Process Create     C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

说明样本创建了子进程

这个样本没有创建子进程,这也符合我们一开始看进程树的结果

5.导出CSV

点击File->Save:

任务三:Process Explorer行为分析

Process Explorer – Sysinternals | Microsoft Learn

Procmon 是看样本做了什么事件;Process Explorer 是看样本运行时这个进程本身的状态、线程、网络
连接和句柄对象
最好是以管理员身份运行不然有些线程、句柄、TCP/IP 信息可能看不完整
可以ctrl+f 直接搜索 样本名称 我这里是Malware.exe

右键 Malware.exe -> Propertie,接下来重点看这些标签页:

Image
Performance
Threads
TCP/IP

Image

path是我原来运行的路径,这点没错,说明这个样本并没有复制自身到别的位置后再运行
且Command line 中未发现明显异常参数

Performance

CPU 很低,说明它只是在后台等待命令,或者已经进入休眠
如果说CPU很高CPU 长时间很高,比如,30% 以上持续不下降可能说明样本在加密,扫描,挖矿之类

内存稳定,未见明显异常增长,如果内存持续增长,可能是,内存泄露,加载大量数据等等

在 Performance 标签页中观察 Malware.exe 的运行状态,样本运行期间 CPU 占用较低,内存占用未出
现持续增长,线程数量和句柄数量保持相对稳定,未观察到明显高资源占用行为

Threads

线程数量较少,Start Address主要位于Malware.exe、kernel32.dll、ntdll.dll模块中

未发现来自 Temp 或 ProgramData 等可疑路径模块的线程入口

TCP/IP

在 TCP/IP 标签页中未观察到 Malware.exe 建立 TCP 或 UDP 网络连接。不一定是没有联网的能力,只能说是本次观察期间没有看到网络连接

Handles

先在主界面选中,Malware.exe,然后点击,View -> Show Lower Pane 或者快捷键 Ctrl+L,下面就会显示Malware.exe打开的句柄

Type这一列,点击Type表头排序,然后找Mutant,找到了的话看对应的Name

记录下名字

SM0:4900:304:WilStaging_02
SM0:4900:120:WilError_03
ZonesCacheCounterMutex
ZonesLockedCacheCounterMutex

不能只运行一次就说它是随机还是固定,最好运行两到三次比较。关闭样本,重新运行再次记录名字:

SM0:1608:304:WilStaging_02
SM0:1608:120:WilError_03
ZonesCacheCounterMutex
ZonesLockedCacheCounterMutex

样本进程持有的 Mutant 对象中,部分名称为固定字符串,例如 ZonesLockedCacheCounterMutex
ZonesCacheCounterMutex

另一部分名称包含当前进程 PID,例如 SM0::304:WilStaging_02 和 SM0::120:WilError_03

多次运行后可以看到,SM0 后面的数字会随着 Malware.exe 的 PID 改变而改变,而后面的 304、120、
WilStaging_02、WilError_03 保持不变,因此该类 Mutant 的命名规律不是完全随机,而是“固定前缀 + 当前进程 PID + 固定编号 + 固定后缀”的形式

任务四:Wireshark网络流量分析

Wireshark • Go Deep

选择Ethernet0,或者类似 Intel(R) PRO/1000 MT Desktop Adapter 这样的网卡,双击开始抓包

运行Malware.exe之后,等待三分钟,尽量不去做其它操作

三分钟后点左上角红色方块停止抓包,然后保存,之后可以反复打开分析

网络行为

点击,Statistics -> Protocol Hierarchy,看里面有没有这些协议:

DNS
HTTP
TLS
TCP
UDP
ICMP

如果只有很少的 ARP、NBNS、MDNS、LLMNR,通常说明没有明显外联

可以看到本次共捕获 123 个分组,总字节数为 9958 字节

从协议分布来看,IPv4 流量占 67.5%,TCP 流量占 45.5%,ARP 流量占 26%,说明本次抓包中主要
流量为TCP类型
此外,还观察到少量 ARP、IPv6、ICMPv6、MDNS、LLMNR、SSDP、NBNS 和 DHCP 流量
这些多属于局域网发现、名称解析或系统网络环境中的常见背景流量
在协议分级结果中未观察到 HTTP、明显TLS通信协议,因此暂未发现样本通过 HTTP/HTTPS 建
立外部通信的证据
后续需要结合 dns、http、tls 过滤器以及“统计 -> 会话”进一步确认是否存在可疑域名、可疑 IP、C2 通
信或数据外传行为

看IP

统计->会话

然后看上面的标签页:

IPv4
TCP
UDP

重点看

本机 IP 跟谁通信
远程 IP 是什么
端口是什么
包数量多少
字节数多少

样本主机IP为192.168.30.132 从IPv4/TCP会话看,发现了一些可疑IP,比如

52.123.128.14
122.155.236.19
43.159.94.126
121.204.230.177
4.213.25.240

发现是世界各地不同的ip,并且字节数和持续时间都很少,猜测可能是虚拟机主动发起的连接被拒绝或者超时后,服务器发来的重传包。

在过滤器里执行规则ip.addr == 122.155.236.19,对这个ip字节流最多的ip进行探查

发现出现频率最高的是[TCP Keep-Alive],这是TCP协议中的一个机制,用来检测连接是否依然存活,分析这些数据包发现这个链接已建立但无数据交换,应该是一个普通的客户端程序。探查其它ip发现也是如此,暂时看不出这个样本的可疑网络行为

心跳包一般表现为:

同一个源 IP 和目的 IP
同一个端口
周期性发送小数据包
间隔比较固定

比如:

10:00:01 VM -> 1.2.3.4 TCP len 48
10:00:31 VM -> 1.2.3.4 TCP len 48
10:01:01 VM -> 1.2.3.4 TCP len 48
10:01:31 VM -> 1.2.3.4 TCP len 48

分析 DNS

在过滤器输入dns

重点看这几列:

Source
Destination
Protocol
Info

尤其是 Info 里面的:

Standard query A xxx.com
Standard query AAAA xxx.com
Standard query TXT xxx.com

发现了一个奇怪的域名serv1.ec2-102-95-13-2-ubuntu.local,查询后发现该域名被一些安全社区明确识别为一个远程访问木马的C2域名!结合前面的几个主动的心跳连接,可能是这个样本文件在进行请求C2服务器地址

分析 HTTP 请求

过滤器输入:

http

如果要只看虚拟机相关 HTTP:

http && ip.addr == 虚拟机IP

点开一个 HTTP 包,看:

Hypertext Transfer Protocol

重点记录:

Request Method:GET / POST
Host
Request URI
User-Agent
Content-Type
Response Code

比如看到:

GET /gate.php?id=123 HTTP/1.1
Host: test.example.com
User-Agent: Mozilla/4.0

就要记录:

域名:test.example.com
URL:/gate.php?id=123
方法:GET
User-Agent:Mozilla/4.0

使用 http 过滤器查看样本运行期间的明文 HTTP 流量,未观察到 GET、POST 等 HTTP 请求

分析 HTTPS / TLS

有些样本不会用明文 HTTP,而是 HTTPS。过滤器输入:tls 重点看有没有:

Client Hello
Server Hello
Application Data

如果看到Client Hello,点开:

Transport Layer Security
-> TLSv1.2 Record Layer
-> Handshake Protocol: Client Hello

找Extension: server_name也就是 SNI。SNI 可能显示域名,比如说update.example.com
也可以用过滤器直接找 SNI:tls.handshake.extensions_server_name
如果要找某个域名:tls.handshake.extensions_server_name contains “example”

发现有跟74.226.64.245这个ip建立连接,但是没有应用层数据,只是一个纯ACK,可能是样本程序尝试连接C2地址。

判断是否存在 C2 域名 / IP

1. 样本运行后主动连接某个固定 IP 或域名
2. 多次周期性访问同一个 IP
3. 出现固定间隔的小包
4. HTTP 请求路径像 /gate.php、/panel、/checkin、/task
5. User-Agent 很奇怪或很旧
6. 使用非标准端口,例如 4444、5555、8080、9001
7. DNS 查询的域名随机性强

任务五:行为综合分析

结合上面的分析还有在社区的一些搜索,发现我运行的这个样本是一个远控木马,木马会尝试连接hxxp://serv1[.]ec2-102-95-13-2-ubuntu[.]local,从该域名试图下载一个第二阶段的有效载荷,假如无法访问上述C2域名时,会弹出一个内容"NO SOUP FOR YOU"的消息。这个域名我查了一些DNS解析的历史记录,并没有发现这个域名被绑定过,可能这正是让其作为样本的原因,用一个不存在的域名来演示C2的操作。

任务六:反动态分析技术识别

上述样本虽然观察到存在一些恶意行为的操作,但是活动频率低,并且并没有真正执行到恶意的行为,猜测会不会是它检测到调试器或是虚拟机或沙箱环境,让自己隐藏或降低了行为。所以我们要对其进行一个反动态分析

1.静态检查

主要是看样本里有没有反分析相关的字符串/API

用strings查关键词

strings64.exe C:\Users\27906\Desktop\analyze_lab\PMAT-labs-main\labs\1-2.BasicDynamicAnalysis\RAT.Unknown.exe.malz\Malware.exe > MalwareStrings.txt

然后查反调试关键词

findstr /i "IsDebuggerPresent CheckRemoteDebuggerPresent
NtQueryInformationProcess BeingDebugged NtGlobalFlag OutputDebugString x64dbg
ollydbg ida windbg" MalwareStrings.txt

发现存在反调试操作

没有发现反虚拟机的操作,查看反沙箱的操作:

findstr /i "sandbox cuckoo anyrun joe anubis GetCursorPos GetLastInputInfo
GetAsyncKeyState Sleep NtDelayExecution QueryPerformanceCounter GetTickCount"
strings.txt

发现有反沙箱操作

2.Detect It Easy 看导入表

打开Malware.exe ,重点看 Imports 里有没有这些 API:

反调试 API

IsDebuggerPresent
CheckRemoteDebuggerPresent
NtQueryInformationProcess
OutputDebugStringA/W
GetThreadContext
SetUnhandledExceptionFilter

反虚拟机 / 反沙箱 API

CreateToolhelp32Snapshot
Process32FirstW
Process32NextW
RegOpenKeyExW
RegQueryValueExW
CreateFileW
GetComputerNameW
GetUserNameW
GetTickCount
QueryPerformanceCounter
Sleep
GetCursorPos
GetLastInputInfo
GetAsyncKeyState

有这些 API 不等于一定用了反分析,但它们是重点怀疑对象

该样本中发现一些导入函数是与反调试和反沙箱有关的

3.动态验证

主要看正常运行和调试器运行,行为是否不同

用 x64dbg 运行样本

运行样本F9,观察:

样本是否立即退出
是否弹异常
是否卡住
是否行为比正常运行更少

如果正常运行时还能驻留,但 x64dbg 下直接退出那就很像反调试

样本能够稳定在x64dbg中运行

在 x64dbg 里设置反调试 API 断点

在 x64dbg 命令栏里依次输入:

bp kernel32.IsDebuggerPresent
bp kernel32.CheckRemoteDebuggerPresent
bp ntdll.NtQueryInformationProcess
bp kernel32.OutputDebugStringA
bp kernel32.OutputDebugStringW

存在相关反调试函数

尝试绕过

用 x64dbg 隐藏调试器后,再看行为是否恢复。推荐用 x64dbg 的隐藏插件,比如 ScyllaHide

Release v1.4 · x64dbg/ScyllaHide

选择Basic

启用后重新打开样本,再运行,对比:

未隐藏调试器时:样本是否退出 / 无行为
隐藏调试器后:样本是否继续运行 / 行为是否变多

就这个样本而言,两者行为无明显差异,本次实验未观察到明确反调试触发行为

检查反虚拟机

查是否检测 VMware / VirtualBox 痕迹

虚拟机里大概率有这些进程或服务:

vmtoolsd.exe
vmwaretray.exe
vmwareuser.exe
VBoxService.exe
VBoxTray.exe

用 Process Explorer 看当前系统有没有,然后在 Procmon 里设置过滤器:

Process Name is Malware.exe then Include

再加 Highlight 或搜索这些关键词

vmtoolsd
vmware
vbox
virtualbox
VBoxService
VBoxTray
CurrentControlSet\Services

重点看样本是否访问了这些路径:

HKLM\SYSTEM\CurrentControlSet\Services\VMTools
HKLM\SYSTEM\CurrentControlSet\Services\VBoxGuest
C:\Program Files\VMware\VMware Tools\
C:\Windows\System32\drivers\vmmouse.sys
C:\Windows\System32\drivers\vmhgfs.sys
C:\Windows\System32\drivers\VBoxMouse.sys
C:\Windows\System32\drivers\VBoxGuest.sys

如果 Procmon 里出现这些访问,就说明样本可能在探测虚拟机环境

但是我们这个样本基本上没有探测虚拟机环境

检查反沙箱 / 用户活动检测

反沙箱常见思路是:样本发现没有人操作电脑,就不触发真实恶意行为

做两轮对比实验:

第一轮:不进行任何用户活动

  1. 打开 Procmon / Wireshark
  2. 运行 Malware.exe
  3. 不动鼠标键盘
  4. 等 3 分钟
  5. 保存日志

第二轮:模拟真实用户活动

  1. 打开 Procmon / Wireshark
  2. 运行 Malware.exe
  3. 移动鼠标
  4. 打开记事本
  5. 输入几行文字
  6. 打开资源管理器随便浏览目录
  7. 等 3 分钟
  8. 保存日志

然后对比:

第二轮是否出现更多文件操作?
第二轮是否出现网络连接?
第二轮是否出现子进程?
第二轮是否出现注册表写入?

如果第二轮行为明显变多,说明可能有用户活动检测
我们这个样本无论有没有人去操作电脑,运行的内容和显示的东西都是一样的

任务六结果显示,Malware.exe 在静态层面存在部分反调试和反沙箱相关线索,例如反调试 API、
Sleep、GetTickCount、QueryPerformanceCounter 等
但动态测试中,样本能够在 x64dbg 中稳定运行,启用 ScyllaHide Basic 隐藏模式前后行为无明显差
异,未观察到样本因检测到调试器而退出或隐藏行为
同时,Procmon 中未发现其查询 VMware / VirtualBox 相关特征,用户活动对比实验中样本行为也未发
生明显变化
因此,本次实验未确认样本存在有效的反调试、反虚拟机或反沙箱触发行为,只能认为有一定的嫌疑

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇