适用于Windows和Linux应用程序的动态API调用跟踪器:Drltrace

Drltrace是一个动态API调用跟踪器,主要用于恶意软件分析的Windows和Linux应用程序 .Drltrace构建于DynamoRIO动态二进制检测框架之上。发布版本可以在这里下载。

用法

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?

  • 足够快,可以执行恶意样本分析,而不会被基于时间的反研究技术检测到。
  • 支持86和64(未来的ARM)。
  • 支持的Windows和Linux(将来的Mac系统)。
  • 支持自修改代码。
  • 支持所有类型的库链接(静态和动态)。
  • 通过标准的反研究方法(反钩,反调试和反仿真)无法检测到。
  • 用户可以轻松添加新的函数原型,告诉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,xl​​ s,py)来加密它们。紫域表示API调用(FindFirstFile/FindNextFile/CryptEncrypt),用于枚举和加密磁盘上的文件和文件夹。

该脚本还可以生成生成的RGB图像的HTML表示,其中可以选择每个元素以显示API调用的名称。

这里是原始HTML文件

有关详细信息,请参阅api_calls_viz 目录

如何建立

您可以在此Wiki页面上找到详细的手册。

OS支持

在Windows,Linux(未来的Mac系统)。

CPU架构支持

x86,x64(列表中的ARM)。

语言

C和C ++标准库(以及用Python编写的日志处理脚本)。

技术细节

我们决定在动态二进制检测框架DynamoRIO之上实现我们的API调用跟踪器.Drltrace要求DynamoRIO执行LoadLibrary调用的检测,以便能够处理目标进程正在加载的新库。当进程尝试加载新库时,DynamoRIO会将控制流重定向到drltracelib.dll。反过来,drltrace枚举新加载的DLL中的导调函数,并为每个函数注册一个特殊的回调函数。因此,如果恶意软件会调用某些导出的函数,则会在此函数之前执行drltrace的回调,并且该工具将能够记录所有必要的信息,例如函数名和参数。可以在保存执行结果的函数之后注册另一个回调。

为什么不是Intel Pin?决定使用DynamoRIO的原因如下:

  1. DynamoRIO的源代码可在github.com上获得,并在BSD许可下分发,而Intel Pin是专有软件。
  2. DynamoRIO在开发时的基本要求之一是对仪表化可执行文件的透明度。
  3. DynamoRIO使用基于代码转换的不同仪器技术,而英特尔PIN使用特殊的蹦床,这对于分析的可执行文件不透明,可能被恶意软件检测到。

致谢

Maksim Shudrak https://github.com/mxmssh

Derek Bruening https://github.com/derekbruening

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据