基于Volatility的图形化用户界面的实现和应用

2021-04-01 14:04李嘉鑫张国荣梁成辉唐远新翟继强
计算机与网络 2021年1期

李嘉鑫 张国荣 梁成辉 唐远新 翟继强

摘要:Volatility是一个基于Python语言的开源内存取证框架,因功能强大而广泛应用在计算机内存取证和分析领域。针对Volatility基于命令行用户界面(CLI)参数繁多和使用不便的问题,使用Visual Studio 2016 C++集成开发环境,在详细分析Volatility命令数据结构的基础上,利用匿名管道和进程执行技术设计,实现了一个通用的Windows图形用户界面的Volatility操作程序,中文界面、交互性强,方便用户对内存转储文件进行解析和研究。

关键词:取证;Volatility;命令行用户界面;图形用户界面

中图分类号:TP393文献标志码:A文章编号:1008-1739(2021)01-60-4

0引言

内存取证作为计算机取证科学的重要分支,是指从计算机物理内存和页面交换文件中查找、提取、分析易失性证据,是对传统基于文件系统取证的重要补充,是对抗网络攻击或网络犯罪的有力武器[1]。Volatility是一个使用Python语言编写的内存取证工具的框架[2],可以对现有绝大多数操作系统进行内存取证分析,并且支持多种内存镜像格式。

但是Volatility作为一款基于CLI的命令行工具[3],只能通过手动输入命令来使用各种功能,并且命令种类繁杂,每种命令还包含多个参数,对于非专业人士来说难于使用。

因此本文提出使用Visual Studio 2016 C++集成开发环境[4]设计和实现一个Windows平台上运行的Volatility图形化界面操作程序,用户可以利用本程序方便快速地进行内存分析和取证。

1系统设计

Volatility图形化界面操作程序采用Windows的窗口消息机制进行构建,免去了多余的第三方依赖。同时,为了能够让非专业人士方便快速地进行内存分析和取证,设计了一套简单且高效的操作模式替代原本繁杂的手工指令输入操作。

界面全部采用图形化操作,为了以线性方式更为直观地进行操作,系统将操作步骤划分为打开镜像文件、选择镜像信息、选择操作命令和设置命令参数。系统整体的运行流程是接收用户输入、构建命令文本、执行命令及取回执行结果,主要分为构建模块和控制模块,其中构建模块负责处理用户输入以及构建对应的操作命令,控制模块负责使用操作命令对Volatility进行控制并取回运行结果。

1.1操作命令的构建

Volatility作为一个功能强大的内存取证框架,支持多种命令,不同的命令对应的参数字段又各有不同。为了实现可视化的命令构建并且减少重复的样板代码,必须提高代码的抽象程度。这就要求程序对于不同的命令应该采取统一的数据结构进行抽象,并且能够根据该数据结构绘制出对应的配置面板。

本模块包括三部分:

(1)数据结构的设计

Volatility操作命令包含命令名、命令描述和多个命令参数,操作命令的数据结构如下:

分别定义了该参数在窗后标签上提示的文本、构成实际命令的参数文本、该参数是单选参数或多选参数(如指定进程标识符和指定进程名称都是单选参数,在构成命令时只能取其中的一个;而显示详细信息就是多选参数,可以附加在单选参数后)、负责选定参数的控件、参数是否默认选定、参数值的提供类型(如使用下拉框或文本框提供)、负责参数值的控件、下拉框的默认内容以及值的检查类型(如整数、十六进制数、字符串等)。

通过以上数据结构,可以把Volatility支持的命令统一且完整地录入至程序中。

(2)配置面板的绘制

选择不同命令后应该根据命令本身的使用方法繪制出对应的配置面板。首先清空当前面板,重新初始化上一次选择命令后的现场,然后根据该命令参数的个数来调整整个面板的布局,最后根据每个命令参数调出对应的选择控件和输入控件。

(3)构建命令文本

通过上一节的操作,用户在设置完成参数后,点击运行会生成对应的命令文本,构建命令时会使用参数数据结构中的pszParam字段以及用户在面板中输入或选定的值进行拼接,还要使用参数数据结构中的ValidationType字段进行对应的输入检查(如整数或十六进制数格式的检查)。

1.2使用操作命令对Volatility的控制

Volatility是一款基于命令行操作的内存取证框架,使用给定参数启动后会把相应结果输出至标准输出,为了让图形界面得到结果需要将Volatility的结果输出重定向。

(1)创建子进程用于运行Volatility

主进程本身已经负责图形界面的运行,不能用于实际运行Volatility,否则在等待Volatility运行时图形界面会失去响应,必须使Volatility运行在新建的子进程中。

创建进程需要使用CreateProcess函数,其函数定义如下:

下面只介绍程序中用到的参数,其余参数均为默认值NULL。

参数lpCommandLine指定子进程运行程序的命令行文本,在参数lpApplicationName为NULL时必须包含要运行的应用程序文件名;参数bInheritHandles指定创建的子进程是否可以继承父进程拥有的句柄;参数dwCreationFlags指定创建的子进程的创建标志,如CREATE_NEW_CONSOLE和CREATE_NO_WINDOW分别表示子进程需要新的控制台和子进程无需启动窗口;参数lpStartupInfo指定预设置启动信息结构体的指针,启动信息结构体标识进程启动时的初始信息,如标准输入句柄、标准输出句柄、标准错误句柄等;参数lpProcessInformation指定接受进程信息结构体指针。

(2)创建匿名管道传递Volatility运行结果

在创建进程时设置的启动信息结构体包含关于标准输出句柄和标准错误句柄的设置,为了重定向Volatility的运行结果,需要创建匿名管道用于子进程向父进程传递结果。

创建管道需要使用CreatePipe函数[5],其函数定义如下:

参数hReadPipe和hWritePipe分别指定接收管道读写句柄的指针;参数lpPipeAttributes指定安全参数结构体指针,该结构体标识了管道句柄是否可以被新进程继承。

父进程使用CreatePipe函数创建匿名管道后使用CreateProcess函数创建子进程,并在启动信息结构体中指明输出重定向至匿名管道的写入句柄,父进程就可以使用ReadFile函数读取匿名管道中Volatility的运行结果。

2应用测试

应用测试中,程序运行于Windows 10 64位主机上,测试镜像为Windows 7 32位的系统内存镜像[6],目标是提取系统镜像中的敏感资产,如图1所示。

使用pslist命令获取当前系统镜像中的所有进程信息,可以看到,存在iexplore.exe,notepad.exe,mspaint.exe,TrueCrypt.exe等進程,如图2所示。

使用netscan命令查看系统镜像的网络连接情况和套接字信息,分析后没有异常,如图3所示。

在分析网络连接无异常之后,可以对cmd历史命令进行提取,如图4所示。

最为关键的是,可以使用memdump命令来提取以上可疑进程的dmp数据。

在notepad.exe进程数据中成功获取一个非伪加密的zip压缩包文件,尝试爆破密码无果,使用strings命令对原始数据敏感信息进行过滤分析操作,strings -e l ./3524.dmp| grep "pan"-B 5 -A 5>notepad.txt,如图5所示。

在对加密磁盘软件TrueCrypt.exe程序提取之后,将其挂载至主机磁盘,可以获取key,如图6所示。

至此,通过内存取证软件对目标系统镜像完成了敏感资产的搜集与提取测试工作。

3结束语

针对Volatility只能进行输入繁琐命令的问题,使用Visual Studio C++语言设计和实现了一个通用的Windows图形化界面操作程序,测试结果表明,可以方便实现Windows平台下Volatility内存取证框架的快速使用,更好地发挥Volatility内存取证框架强大的取证分析能力。

参考文献

[1]张瑜,刘庆中,李涛,等.内存取证研究与进展[J].软件学报, 2015,26(5):1151-1172.

[2] LIGH M H,CASE A,LEVY J,et al..The Art of Memory Forensics [M].Indianapolis:Wiley,2014.

[3] MICHALAS A,MURRAY R.MemTri: A Memory Forensics Triage Tool Using Bayesian Network and Volatility[C]//The 9th ACM CCS International Workshop on Managing Insider Security Threats.Dallas:ACM,2017:57-66.

[4]孙鑫.VC++深入详解:第3版[M].北京:清华大学出版社, 2019.

[5]王耀辉.Windows匿名管道技术及DOS命令重定向技术在可视化系统集成中的应用[J].长春工业大学学报(自然科学版),2012,33(3):274-277.

[6]翟继强,肖亚军,杨海陆,等.基于内存池标记快速扫描技术的Windows内核驱动对象扫描[J].西北工业大学学报,2019,37(5):1044-1052.