2020年IDA插件冠军-DDR插件详解

  • A+

1DDR概述

IDA中的静态逆向工程通常会成问题。某些值是在运行时计算的,这使得很难理解某个基本块在做什么。如果您尝试通过调试一个恶意软件来执行动态分析,则该恶意软件通常会检测到并开始以不同的方式运行。思科Talos推出了动态数据解析器(DDR),该插件是IDA的插件,可简化反向工程恶意软件。DDR正在使用检测技术在运行时从样本中解析动态值。 

2DDR架构

DDR具有如图所示客户端/服务器体系结构。DDR IDA插件和DDR服务器是Python脚本。DynamoRio客户端是用C编写的DLL,它由DynamoRIO工具drrun.exe执行。该DLL使用检测技术在运行时分析和监视恶意软件样本。IDA插件运行在IDA中,是前端;DDR服务器运行在恶意代码机器上,是服务端。通常,所有分析过程都是通过插件控制的。后端DynamoRIO客户端分析完成后,将结果发送回插件。我们选择JSON作为此数据的格式,以使其更易于故障排除并易于由第三方Python脚本解析。

图片.png
从理论上讲,可以在同一台PC上运行插件和服务器,但是就执行恶意软件示例而言,强烈建议在单独的计算机上执行此操作。在大多数情况下,可以从IDA中的DDR菜单开始分析以收集动态值。下图显示了通用的工作流程。但是,如果要在无Python的系统上执行恶意软件,则也可以手动执行分析并单独运行DynamoRio客户端。

图片.png

图片.png
一旦在IDA日志输出窗口中看到插件已成功接收到JSON文件,就可以选择“获取值...”或“获取内存...”菜单之一来解析动态值或操作数。

3程序安装

安装要求Python模块和DynamoRIO框架。
DynamoRIO框架地址:
https://github.com/DynamoRIO/dynamorio/releases/tag/cronbuild-8.0.18547
首先,在“恶意软件PC”上安装Python 3,并确保“分析PC”上的IDA也使用Python 3设置。DDR不支持Python2。由于IDA早期版本中的错误,如果您想在IDA <7.5中运行DDR插件,则应在IDA计算机上安装Python 3.7。DDR服务器端仍可以是Python 3.8或3.7。

3.1原版安装

将归档文件提取到“恶意软件PC”上。最后,从归档文件根目录执行DDR_INSTALLER.py脚本。该脚本不会影响您现有的Python环境,它将为DDR创建专用的虚拟Python环境。它还没有任何非标准的Python模块依赖项。脚本在运行时会下载所有依赖项。它还会将DynamoRio框架安装到您的DDR安装目录中。该脚本将指导您完成DDR服务器和DDR IDA插件的整个安装过程。仔细阅读脚本的输出,其中包含许多其他提示,这些提示对于安装非常重要。
运行DDR_INSTALLER.py脚本后按照提示进行安装。

图片.png
安装过程中服务端IP使用“恶意软件PC”的IP。
安装完成后会要求启动ddr_server.py即服务端。
在DDR目录将ddr_plugin/ddr和ddr_plugin/ddr_plugin.py放到IDA插件目录。
开启IDA后即可使用DDR进行跟踪。

3.2汉化版安装

将plugins文件夹内文件放到IDA插件目录内。
修改ddr_config.json,修改WEBSERVER为服务端IP(“恶意软件PC”);修改CA_CERT为DDR证书绝对路径;修改DDR_WEBAPI_KEY和服务端key一致;将服务端生成的ddr_server.crt证书放到IDA插件目录的ddr目录内。

4功能介绍

4.1查询 模块

4.1.1命令行参数

4.1.1.1设置命令行参数

eg:-a 1 -b “test string”

图片.png

4.1.1.2显示命令行参数

图片.png

4.1.1.3清除命令行参数

图片.png

4.1.2中断地址

4.1.2.1设置中断地址

光标所在处设置为断点,只运行断点之前命令。

图片.png

4.1.2.2显示中断地址

4.1.2.3清除中断地址

4.1.3起始偏移量

4.1.3.1设置起始偏移量

光标选定位置设置为本次追踪起始执行地址,类似于设定执行esp。

图片.png

4.1.3.2显示起始偏移量

4.1.3.3清除起始偏移量

4.1.4基本块

4.1.4.1添加基本块到基本块列表

光标选定基本块,将其添加到列表,在后续跟踪时可以选定跟踪基本块列表。

图片.png

4.1.4.2将该基本块从基本快列表删除

4.1.4.3显示基本块列表

4.1.4.4清除基本块列表

4.2跟踪 模块

4.2.1对标记的地址范围进行完整跟踪

选定地址范围进行追踪。

图片.png

4.2.2对标记的基本块进行完整跟踪

对标记所在的整个基本块进行追踪。

图片.png

4.2.3对基本块列表进行完整跟踪

对标记的基本块列表进行跟踪。可通过显示基本块列表进行查看。

4.2.4对段进行完整跟踪

对当前代码段进行完整跟踪。

4.2.5对段进行轻跟踪

相对于完整跟踪。

4.3转储 模块

4.3.1使用带标记的操作数来获取缓冲区大小

选定缓冲区大小。

图片.png

4.3.2使用有标记的操作数来获取缓冲区地址

图片.png

4.3.3使用标记的地址转储缓冲区到文件

将设置的值转储到缓冲区文件。

4.3.4执行样本和转储缓冲区

将缓冲区文件保存到文件。

4.4补丁 模块

4.4.1以NOP填充指令运行

光标选定指令在运行是以nop指令填充执行。

4.4.2在运行时切换EFLAG

切换EFlag标志,再运行补丁可执行程序,则程序会加载另一条路。如在跳转时修改SF标志,则程序会执行另一条路。
eg:程序不会执行标记块,修改SF标志位后则执行该块。

图片.png

图片.png

4.4.3在运行时跳过标记地址的函数

选定后标记的函数不执行,执行补丁程序后可见。
eg:跳过了func1函数。

图片.png

图片.png

图片.png

4.4.4运行补丁可执行程序

执行创建的补丁可执行程序后。

4.5调试 模块

4.5.1创建带有bp标记地址的x64dbg脚本

创建带有断点的x64dbg脚本。

4.5.2在标记地址处创建循环及生成可执行文件

创建一个指令循环的补丁程序。
修复参考DDR服务端提示。

图片.png

4.6配置 模块

4.6.1设置IDA DISASM视图的跟踪次数

4.6.2设置IDA日志窗口的跟踪次数

4.6.3设置运行时log的指令数量

4.6.4设置API超时的秒数

设置等待DDR server回复时间。

图片.png
4.6.5编辑DDR API请求(仅限专家)
编辑DDR API请求格式。

图片.png

4.7寄存器 模块

4.7.1在x??中获取指针的内存

光标选定地址,获取该地址条件下寄存器指针值。

4.8获取源操作数/目的操作数的值

X86体系,源操作数通常是右边,目的操作数通常是左边。如果此时源操作数/目标操作数是指,则显示值;如果是地址,则通过“获取源操作数/目标操作数中的指针值”来对整个地址值进行获取,二级指针依此类推。

图片.png

4.9获取源操作数/目标操作数中的指针值

光标选定地址,获取该指针值。

图片.png

4.10获取源操作数/目标操作数中的二级指针值

光标选定地址,获取二级指针值。

4.11获取源操作数/目标操作数中的指针内存

查看操作数内存值或指针值。

图片.png

图片.png

4.12获取源操作数/目标操作数中的二级指针内存

获取操作数二级指针内存。

4.13加载跟踪指令

加载跟踪模块执行后的结果。

4.14关闭跟踪指令

关闭跟踪模块执行后的结果。

4.15显示字符串跟踪

图片.png

4.16显示API调用跟踪

图片.png

4.17删除DDR注释

光标选中地址,删除DDR注释。

非常详细内容详见附件:
链接:https://pan.baidu.com/s/1m6tIkvwqfVutofZ_7O5mFQ
提取码:86kw