Drltrace是适用于Windows和Linux应用程序的动态 API调用跟踪器。Drltrace建立在DynamoRIO动态二进制检测框架之上,Drltrace最初由Derek Bruening 实现,并与DynamoRIO和DrMemory框架一起分发。此存储库包含Drltrace的独立版本,以及有关如何使用它进行恶意软件分析的附加脚本和材料。
1、速度足够快,可以对恶意样本进行分析,而不会被基于时间的反研究技术检测到。
2、支持 x86 和 x64(未来将支持 ARM)。
3、支持 Windows 和 Linux(未来将支持 macOS)。
4、支持自修改代码。
5、支持所有类型的库连接(静态和动态)。
6、标准反研究方法(反挂钩、反调试和反模拟)无法检测到。
7、用户可以轻松添加新的函数原型来告诉 drltrace 如何打印有关以前未知的 API 调用(甚至有关非系统 DLL)的更多详细信息。使用外部配置文件。
8、易于使用并可根据您的需要进行修改(无需额外的包要求,无需重量级的 GUI 界面)。
9、开源,代码清晰且文档齐全。您可以在 drltrace 上自由构建和使用自己的高级解决方案。
广大研究人员可以直接使用下列命令将该项目源码克隆至本地:
git clone https://github.com/mxmssh/drltrace.git
或者直接访问该项目的【Releases页面】下载最新版本的预编译Drltrace。
-logdir[.] 打印库调用数据的日志目录 -only _from_app[false] 仅报告来自应用程序的库调用 -follow_children[true] 跟踪子进程 -print_ret_addr[false] 打印库调用的返回地址 -num_unknown_args[2] 要打印的未知libcall参数的数量 -num_max_args[6] 要打印的最大参数数 -default_config[true] 使用默认配置文件 -config[“”] 自定义配置文件的路径 -filter[filter.config] 白名单/黑名单文件的路径 -ignore_underscore[false]忽略以“_”开头的库例程名称 -help[false] 打印此消息 -version[false] 打印版本号 -verbose[1] 开启verbose模式 -use_config[true] 使用配置文件 -grepable[false] 可查询输出
Drltrace支持外部配置文件,用户可以在其中描述Drltrace如何打印某些API调用的参数:
HANDLE|CreateRemoteThread|HANDLE|SECURITY_ATTRIBUTES*|size_t|THREAD_START_ROUTINE*|VOID*|DWORD|__out DWORD*
每个函数参数应该用 分隔|。第一个参数是返回类型,第二个参数是函数名称本身,其余的是函数参数。标记__out用于标记输出参数,___inout用于标记输入+输出参数。
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]
grep结合参数使用时,可以进行解析-grepable;这会将函数名称和参数全部打印在一行上:
~~4824~~ KERNELBASE.dll!CreateFileW {0: C:\Windows\Fonts\staticcache.dat (type=wchar_t*, size=0x0)} {1: 0x80000000 (type=DWORD, size=0x4)} {2: 0x3 (type=DWORD, size=0x4)} {3: 0x005cde8c (type=<unknown>*, size=0x0)} {4: 0x3 (type=DWORD, size=0x4)} {5: 0x80 (type=DWORD, size=0x4)}
模块唯一标识符表打印在日志文件的末尾:
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
本项目的开发与发布遵循BSD-3-Clause开源许可协议。
Drltrace:【GitHub传送门】