概述
记事本是Windows用户快速记录重要笔记或信息的常用工具。除了文本文件,记事本还能打开各种已知和未知格式的文件。然而,多年来,敌对方利用记事本作为其恶意策略的一部分,有时甚至将恶意进程伪装成记事本来掩盖其活动。
基于这种趋势,了解记事本进程内存区域中的内容就显得非常重要。CozyBear、Double Dragon和Lazarus等高级持续性威胁(APT)已利用记事本进行进程注入、DLL侧载、shellcode或有效载荷注入以及进程掏空等活动。
本文研究从记事本进程内存中提取用户数据并分析其恶意行为迹象的方法。
为进行测试,将使用Windows10虚拟机作为测试环境。启动记事本并键入“Abdelrhman and Azr43LKn1ght"。
如有必要,可以关闭记事本,因为它的进程会在内存中保留一小段时间。第一步是使用FTK Imager 的Memory Capture、DumpIt 或Magnet的RAM Capture等工具获取虚拟机的内存。
如果内存转储不是 .dmp 格式,则必须进行转换,以便与WinDbg兼容。Volatility和MemProcFS等工具可协助进行转换。内存转储(如<file>.dmp)准备就绪后,我们就可以使用WinDbg进行调试,分析获取的记事本进程,查找恶意行为的迹象。
内存结构
深入分析之前,我们先来看看Windows中的内存结构。操作系统使用_EPROCESS结构来表示进程。每个进程都有自己的线性地址空间,称为虚拟内存空间(Virtual Memory Space)或虚拟地址空间(Virtual Address Space),与其他进程完全隔离。
- 该地址空间包括几个关键组件:
- 核心进程可执行文件:进程的主二进制文件。
- 加载模块:所有相关动态链接库(DLL)和共享库的列表。
- 进程堆栈:用于函数调用和局部变量的内存。
- 进程堆:用于动态内存分配的内存区域。
- 虚拟地址描述符(VAD):进程分配的内存区域。
_EPROCESS的结构如下
nt!_EPROCESS
+0x000 Pcb : _KPROCESS
+0x438 ProcessLock : _EX_PUSH_LOCK
+0x440 UniqueProcessId : Ptr64 Void
+0x448 ActiveProcessLinks : _LIST_ENTRY
+0x458 RundownProtect : _EX_RUNDOWN_REF
+0x460 Flags2 : Uint4B
+0x460 JobNotReallyActive : Pos 0, 1 Bit
[SNIP]
+0x510 Job : Ptr64 _EJOB
+0x518 SectionObject : Ptr64 Void
+0x520 SectionBaseAddress : Ptr64 Void
+0x528 Cookie : Uint4B
+0x530 WorkingSetWatch : Ptr64 _PAGEFAULT_HISTORY
+0x538 Win32WindowStation : Ptr64 Void
+0x540 InheritedFromUniqueProcessId : Ptr64 Void
+0x548 OwnerProcessId : Uint8B
+0x550 Peb : Ptr64 _PEB
+0x558 Session : Ptr64 _MM_SESSION_SPACE
[SNIP]
+0x7d8 VadRoot : _RTL_AVL_TREE
+0x7e0 VadHint : Ptr64 Void
+0x7e8 VadCount : Uint8B
+0x7f0 VadPhysicalPages : Uint8B
+0x7f8 VadPhysicalPagesLimit : Uint8B
[SNIP]
+0xa00 DynamicEHContinuationTargetsTree : _RTL_AVL_TREE
+0xa08 DynamicEHContinuationTargetsLock : _EX_PUSH_LOCK
Process Control Block
流程控制块PCB(Process Control Block)由_KPROCESS结构表示,位于_EPROCESS 结构的底部。PCB 包含以下重要字段
- 目录表数据库:用于地址转换。
- 在内核模式和用户模式下花费的总时间:跟踪进程的CPU使用情况。
- 进程状态:表示进程正在运行、等待或暂停。
ActiveProcessLinks
_EPROCESS中的另一个关键字段是ActiveProcessLinks,它是一个双链表,用于链接机器上的所有活动进程。该列表是系统进程管理的基础,能让任务管理器和系统API等工具有效地导航、访问和管理运行中的进程。
这种结构对操作系统进程管理至关重要,因为它有利于进程信息检索和调度等高效操作。
2010年,一款名为Prolaco的臭名昭著的恶意软件利用了这一系统。它可以从用户模式直接操纵内核对象,而无需任何内核空间驱动程序或rootkit。Prolaco通过以下方式实现了这一点
- 使用ZwSystemDebugControl函数启用SeDebugPrivilege。
- 访问NT内核模块中PsInitialSystemProcess的第一个_EPROCESS对象。
- 遍历_EPROCESS对象的双链路列表,找到自己的恶意软件进程。
- 通过覆盖下一个进程的flink(前向链接)和上一个进程的blink(后向链接)从ActiveProcessLinks列表中解除进程链接。
PsActiveProcessHead
PsActiveProcessHead是一个全局内核变量,用于保存活动进程列表中第一个进程的地址。
Process Environment Block
进程环境块(PEB)是内核模式下的一个指针,在用户模式下引用一个地址。它保存有关进程的关键信息,包括