恶意软件监视器是一组pyrebox脚本,用于在分析恶意软件的时候自动提取有用的信息。
另外,它通过分析恶意软件样本如何部署它的主要操作(即,解包、进程注入、进程挖空、丢弃文件、下载文件等)来帮助分析人员分析恶意软件的第一阶段。
而且,它还会收集各种类型的信息来丰富IDB数据库,这些类型的信息可以导入到IDA中。
它由几个模块组成,可以通过编辑一个json文件来停用、激活和配置这些模块。每个模块以不同的格式生成多个日志文件。
- api tracer模块:该模块允许跟踪Windows API函数调用,并自动提取输入和输出参数。一个IDA Python脚本允许在IDA中导入和可视化此信息。
- dumper模块:该模块允许在虚拟机执行期间转储进程的内存,它可由用户配置,用户可以选择触发内存转储的最佳时刻。即在某种特殊条件下进行dump。
- coverage模块:该模块收集执行轨迹,该轨迹踪可用于为IDA中的基本块上色。此功能为用户提供哪些代码路径执行了以及哪些代码路径没执行的信息。
- memorymonitor模块:该模块在脚本中被称为interproc,它监视与内存相关的不同操作和事件,还允许监视进程交互事件(例如创建新进程、对现有进程的内存注入等)。最后一个模块与其他三个模块正交。由于它监视进程创建操作和打开操作,因此它不仅可以监视初始进程,还可以监视与之相关的所有进程。在追踪注入、droppers、下载器等很有用
- 监控的事件有:
- 内存分配和释放
- 进程创建、打开进程句柄
- 远程内存写入/内存共享
- 文件读取/写入,文件映射
- 内存权限变动
- 监控的事件有:
例如,如果启用了api tracer,并且memorymonitor检测到第一个进程创建了第二个进程,则api tracer将开始监视此新进程并为其生成API调用轨迹。
配置文件
恶意软件监视器有两个不同的配置文件:
mw_monitor.conf
以上四个模块中的每一个都生成多个日志文件。可以在此配置文件中配置这些日志文件的名字,该文件必须可以从PyREBox的启动目录中访问到。常见的做法是将其放在pyrebox.conf文件所在的文件夹中。
此配置文件允许配置由不同模块生成的日志的路径和文件名。它还能够确定结果(bundle)的文件名,即包含所有收集结果的.tar.gz文件。
可以在config_examples目录下找到一个自带详细说明的配置文件。
interproc:
- bin_log_name:此文件是在内存操作监视期间收集的数据的二进制日志(序列化数据)。
- text_log_name:此文件是与执行期间捕获的所有内存监视相关事件的文本日志。
- basic_stats_name:此文件是收集的数据的结构化文本摘要。
dumper:
- path:此选项允许选择存储内存转储的路径,内存转储包括进程、加载的dll以及不与主进程内存或任何DLL重叠的其余的VAD区域。
coverage:
- cov_log_name:此文件是收集的指令跟踪的二进制日志。可以使用相应的脚本将此日志导入IDA。
- cov_text_name:此文件是一个文本日志,汇总了收集的指令跟踪。此日志中的每一行代表从一个VAD区域到另一个VAD区域的转换,其中包括起始地址和目标地址。
api_tracer:
- text_log_name:此文件是包含重新编码的API调用的文本日志,根据配置决定包不包含API的参数。
- bin_log_name:此文件是二进制日志,包含与上面文本日志相同的信息。可以使用相应的脚本将此文件导入IDA。
mw_monitor_run.json
此json文件允许在modules部分下,单独打开/关闭每个模块。它还允许为每个模块配置不同的参数。
恶意软件监视器还提供自动化执行示例,可以在此json文件中进行配置。
general:
- files_bundle:主机系统中包含多个文件(通常是.exe和.dll依赖项)的zip文件的路径。此zip容器中的文件将被复制到files_path路径下的guest虚拟机系统中。
- files_path:客户虚拟机系统中将在启动时复制文件进去的目录。
- main_executable:要执行的文件的名称,在zip文件files_bundle中。
- api_database:API数据库使用Deviare和MSDNcrawler生成的路径。
interproc:
- basic_stats:布尔值,用来打开/关闭basic_stats报告的产生,其中包含观察到的内存操作的摘要。
- bin_log:布尔值,用于打开/关闭此模块的二进制日志的生成。
- text_log:布尔值,用于打开/关闭此模块的文本日志的生成。此日志包含所有受监视的内存操作的跟踪。
dumper:
- dump_on_exit:布尔值,用于确定进程内存是否应在退出时转储
- dump_at:允许配置何时转储进程内存的值。它接受3种格式:地址,符号(symbol)和符号后跟地址。
- 在第一种情况下,当控制流在进程的上下文下到达给定地址时,将转储进程内存。
- 在第二种情况下,当控制流到达指定的符号时(通常是特定的API调用),将转储进程内存。
- 在第三种情况下,当进程调用API函数时,特别是来自给定地址,将转储进程内存。
coverage:
- procs:一个字符串列表,指定进程名称,被指定的进程会被跟踪来生成coverage文件。如果未指定或指定空列表,则将记录所有受监视的进程(初始进程和任何相关进程)。
api_tracer:
- bin_log:允许打开/关闭二进制日志生成的布尔值。
- text_log:允许打开/关闭文本日志生成的布尔值。
- light_mode:允许打开/关闭light模式的布尔值。在light模式下,函数调用参数不会被解引用,从而使得客户系统的执行速度稍快。
- exclude_apis:不被记录日志的API函数列表。
- exclude_modules:要从跟踪中排除的模块名称列表。对该列表中的函数进行调用都不会日志记录。
- exclude_origin_modules:要从跟踪中排除的模块名称列表。从列表中的模块发出的调用都不会被记录。
- include_apis:要进行跟踪的API函数列表,即使它所在的模块位于以上某个排除列表中也是要进行记录。该选项更细粒度,会覆盖任何之前的排除规则。
- procs:一个字符串列表,指定进程名称,被指定的进程会被跟踪来生成coverage文件。如果未指定或指定空列表,则将记录所有受监视的进程(初始进程和任何相关进程)。
IDAPython 脚本
官方在ida_scripts目录下提供IDA Python脚本。有两个主要脚本:
- mw_monitor_coverage.py:允许读取coverage二进制日志并在IDA中为已执行的基本块着色。
- mw_monitor_ida_functions_rename.py:在IDA中打开一个新选项卡,来加载api跟踪器的二进制日志并可视化API调用的轨迹,以及它们的起始和目标地址和参数。
要运行这些脚本,需要将整个mw_monitor目录复制到一定可从IDA设置中访问得到的路径。这些IDA脚本在此项目的mw_monitor/目录下具有多个依赖项。
API tracer数据库
API跟踪器依赖于sqlite数据库,以便自动检查API参数。
该数据库可以由Deviare项目,Zynamics发布的MSDNclawer和自定义脚本组合生成,该自定义脚本要将两个数据源集成到恶意软件监视器使用的sqlite数据库中。
为了生成数据库,首先需要克隆Deviare项目(https://github.com/nektra/deviare2)并修改DbGenerator子项目以生成sqlite数据库。具体查看该项目文档。然后,运行相应版本(32或64位Windows)的DbGenerator项目,以生成初始sqlite数据库。
该数据库仍然缺少有关哪些参数是输入参数以及哪些是输出参数的信息。该信息可以从MSDN获得。要解析MSDN,可以使用提供的脚本。此脚本基于Zynamics发布的msdn_crawler脚本。此修改后的脚本将生成一个xml文件,其中包含MSDN中记录的每个API的信息。
最后一步,运行populate_db.py脚本,以便使用MSDN爬虫提取的信息来填充sqlite数据库。