Drltrace 是一个动态 API 调用跟踪器,主要用于恶意软件分析的 Windows 和 Linux 应用程序。
用法
drltrace 的用法非常简单。用户需要通过以下方式指定日志目录和目标进程的名称:
drltrace -logdir . -- calc.exe
就是这样,该工具将在目标进程中注入所需的 DLL,启动检测并且并行地记录有关在目标进程中执行的所有库调用的信息:
~~43600~~ msvcrt.dll!__wgetmainargs arg 0: 0x010d2364 arg 1: 0x010d2368 and return to module id:0, offset:0x193a ~~43600~~ ntdll.dll!EtwEventRegister arg 0: 0x002ff994 arg 1: 0x010d1490 and return to module id:0, offset:0x157e ~~43600~~ ntdll.dll!EtwEventSetInformation arg 0: 0x007b4b40 arg 1: 0x00000033 and return to module id:0, offset:0x15a1 ~~43600~~ SHELL32.dll!ShellExecuteW arg 0: <null> (type=<unknown>, size=0x0) arg 1: <null> (type=wchar_t*, size=0x0) arg 2: calculator:// (type=wchar_t*, size=0x0) arg 3: <null> (type=wchar_t*, size=0x0) arg 4: <null> (type=wchar_t*, size=0x0) arg 5: 0x1 (type=int, size=0x4) and return to module id:0, offset:0x167d
输出的格式很简单,可以通过外部脚本轻松解析:
~~[thread id]~~ [dll name]![api call name] arg [arg #]: [value] (type=[Windows type name], size=[size of arg]) and return to module id:[module unique id], offset:[offset in memory]
模块唯一标识符表打印在日志文件的末尾:
Module Table: version 3, count 70 Columns: id, containing_id, start, end, entry, checksum, timestamp, path 0, 0, 0x010d0000, 0x010da000, 0x010d1b80, 0x0000f752, 0xb5fe3575, C:\Windows\SysWOW64\calc.exe 1, 1, 0x6d4c0000, 0x6d621000, 0x6d563940, 0x00136d65, 0x59ce1b0b, C:\Users\Max\Downloads\drltrace\drltrace\dynamorio\lib32\release\dynamorio.dll 2, 2, 0x73800000, 0x73975000, 0x7380dbf7, 0x00000000, 0x59ce1b0f, C:\Users\Max\Downloads\drltrace\drltrace\bin\release/drltracelib.dll 3, 3, 0x742f0000, 0x742fa000, 0x742f2a00, 0x0000c877, 0x0adc52c1, C:\Windows\System32\CRYPTBASE.dll 4, 4, 0x74300000, 0x74320000, 0x7430c9b0, 0x0002c617, 0x245970b4, C:\Windows\System32\SspiCli.dll 5, 5, 0x74410000, 0x74431000, 0x74416900, 0x0002a940, 0x88a53c1d, C:\Windows\System32\GDI32.dll 6, 6, 0x74440000, 0x74500000, 0x7446fb20, 0x000cc410, 0xd343d532, C:\Windows\System32\RPCRT4.dll 7, 7, 0x74500000, 0x74525000, 0x745047d0, 0x00026737, 0xa39c8991, C:\Windows\System32\IMM32.DLL 8, 8, 0x74550000, 0x745c7000, 0x7456e8a0, 0x00081857, 0x73b971e1, C:\Windows\System32\advapi32.dll 9, 9, 0x748f0000, 0x74929000, 0x748febd0, 0x00045303, 0xa58be652, C:\Windows\System32\cfgmgr32.dll 10, 10, 0x74930000, 0x75c78000, 0x74aa09d0, 0x01377aa6, 0x4b39926b, C:\Windows\System32\SHELL32.dll
Drltrace
Drltrace 可以通过指定 -only_from_app 选项来轻松过滤掉馆际调用并仅打印从目标应用程序的主模块(或堆)执行的 API 调用,这对于生成大型日志的应用程序非常有用。Drltrace 还有几个有用的外部脚本来过滤某些库的 API 调用,只打印可能有趣的 API 调用和字符串。
执照
Drltrace主要模块在BSD下被分发。
drltrace 所需的一些文件在 LGPL 下是 distrubuted。有关详细信息,请参阅源文件
动机
恶意软件分析并非易事。像 Themida 和 Armadillo 这样的复杂软件包装工具当然还有数十个由恶意软件作者编写的未命名的打包器以及代码和数据加密技术,大大方便了(在某些情况下完全不可能)这些样本的静态逆向工程使得恶意软件分析师的生活变得复杂。在这种情况下,API 调用跟踪可以显着减少了解实际恶意意图所需的时间,并揭示有关受保护恶意代码的大量技术细节。
虽然传统的 API 挂钩技术已在多个解决方案中成功实施,但该方法已被恶意软件作者充分研究,并且可以轻松检测和/或绕过。此外,这些工具作为独立的重量级 GUI 应用程序(作为专有产品)分发,这些应用程序通常不容易在现有的恶意软件分析工作流程中集成。
如果我们看看 Linux 世界,有一个很棒的工具叫做 ltrace。使用单个 bash 命令,我们可以轻松获得某个可执行文件的 API 调用的完整跟踪。
为什么我们不为 Windows 提供这样的工具(如 Linux 中的 ltrace),这对于现代恶意软件使用的反研究技巧也是透明的?
它转变为有一种技术可以帮助我们为 Windows 提供这样的工具,并对执行程序透明地跟踪 API 调用。这种技术称为动态二进制检测,即 DBI。DBI 是一种通过注入检测代码在运行时分析二进制应用程序行为的技术。
但是,DBI 用于恶意软件分析的应用受到了解包自动化以及指令,基本块和函数调用跟踪概念的若干证明的不应有限。据我们所知,drltrace 是基于 DBI 的 API 调用跟踪的第一个工具,可以在实践中用于恶意软件分析。我们在 wiki 中提供了几个恶意软件分析示例,其中我们描述了 drltrace 如何允许在几分钟内陶醉许多关于复杂恶意样本的内部技术细节,甚至无需启动 IDA 或调试器。
为什么选择Drltrace Rock?
足够快,可以执行恶意样本分析,而不会被基于时间的反研究技术检测到。
支持x86和x64(未来的ARM)。
支持Windows和Linux(将来的macOS)。
支持自修改代码。
支持所有类型的库链接(静态和动态)。
通过标准的反研究方法(反钩,反调试和反仿真)无法检测到。
用户可以轻松添加新的函数原型,告诉drltrace如何打印有关以前未知的API调用的更多详细信息(甚至是非系统DLL)。使用外部配置文件。
易于使用和修改,用于您自己的目的(没有额外的包要求,没有重量级的GUI界面)。
开源,代码清晰,文档齐全。您可以在 drltrace 之上自由构建和使用自己的高级解决方案。
命令行选项
-logdir [ .] Log directory to print library call data -only_from_app [ false] Reports only library calls from the app -follow_children [ true] Trace child processes -print_ret_addr [ false] Print library call's return address -num_unknown_args [ 2] Number of unknown libcall args to print -num_max_args [ 6] Maximum number of arguments to print -default_config [ true] Use default config file. -config [ ""] The path to custom config file. -ignore_underscore [ false] Ignores library routine names starting with "_". -only_to_lib [ ""] Only reports calls to the library <lib_name>. -help [ false] Print this message. -version [ false] Print version number. -verbose [ 1] Change verbosity. -use_config [ true] Use config file
配置文件语法
Drltrace 支持外部配置文件,用户可以在其中描述 drltrace 应如何为某些 API 调用打印参数。
HANDLE|CreateRemoteThread|HANDLE|SECURITY_ATTRIBUTES*|size_t|THREAD_START_ROUTINE*|VOID*|DWORD|__out DWORD*
每个函数参数都应该用|。第一个参数是返回类型,第二个参数是函数名称本身,其余参数是函数参数。令牌__out用于标记输出参数,___inout用于标记输入+输出参数。
恶意软件分析示例
您可以在 Wiki 页面找到如何使用 drltrace 分析复杂恶意软件的示例。
记录可视化
为了简化日志文件的工作,这里实现了一个脚本 api_calls_viz.py,可以用来生成 RGB 图像,其中每个像素颜色代表唯一的 API 调用。例如,下图显示了 WannaCry 恶意软件的日志文件。
图片中的大绿域表示 API 调用(wcscmp/wcsicmp),用于选择具有有趣扩展名的文件(例如 docx,xls,py)来加密它们。紫域表示 API 调用(FindFirstFile/FindNextFile/CryptEncrypt),用于枚举和加密磁盘上的文件和文件夹。
该脚本还可以生成生成的 RGB 图像的 HTML 表示,其中可以选择每个元素以显示 API 调用的名称。
这里是 原始 HTML 文件。
有关详细信息,请参阅 api_calls_viz 目录。
如何建立
您可以在此 Wiki 页面上找到详细的手册。
OS 支持
Windows,Linux(未来的macOS)。
CPU架构支持
x86,x64(列表中的 ARM)。
语言
C 和 C ++标准库(以及用 Python 编写的日志处理脚本)。
技术细节
我们决定在动态二进制检测框架 DynamoRIO 之上实现我们的 API 调用跟踪器。Drltrace 要求 DynamoRIO 执行 LoadLibrary 调用的检测,以便能够处理目标进程正在加载的新库。当进程尝试加载新库时,DynamoRIO 会将控制流重定向到 drltracelib.dll。反过来,drltrace 枚举新加载的 DLL 中的导出函数,并为每个函数注册一个特殊的回调函数。因此,如果恶意软件会调用某些导出的函数,则会在此函数之前执行 drltrace 的回调,并且该工具将能够记录所有必需的信息,例如函数名和参数。可以在保存执行结果的函数之后注册另一个回调。
为什么不是 Intel Pin?决定使用 DynamoRIO 的原因如下:
DynamoRIO 的源代码可在 github.com上获得,并在 BSD 许可下分发,而 Intel Pin 是专有软件。
DynamoRIO 在开发时的基本要求之一是对仪表化可执行文件的透明度。
DynamoRIO 使用基于代码转换的不同仪器技术,而英特尔 PIN 使用特殊的蹦床,这对于分析的可执行文件不透明,可能被恶意软件检测到。
Acknowledgments
Maksim Shudrak https://github.com/mxmssh
Derek Bruening https://github.com/derekbruening
Comments