我正在阅读OpenRCE 上的一篇旧博客文章,其中提到了仅二进制分析和覆盖范围内的 MSR 跟踪。这个词的唯一谷歌命中是 Xen 邮件列表中的几封我无法理解的电子邮件。什么是 MSR 追踪?
什么是 MSR 追踪?
MSR 跟踪一般是指使用 Intel 模型特定寄存器 (MSR) 从 CPU 获取跟踪信息。因为现代(通常是奔腾 4 之后的)处理器具有用于调试的硬件支持,所以这比纯软件解决方案更快。有几种方法可以做到这一点:
正如Pedram Amini 的一篇文章所述,可以通过设置
MSR_DEBUGCTLA
MSR 和启用BTF (single-step on branches)
标志来加速单步执行。这提供了比纯单步执行更好的性能,单步执行会在每条指令上引发调试异常。可以使用“
Branch Trace Store (BTS)
”工具将所有分支记录到内存中的缓冲区中;此外,处理器可以配置为每当这个缓冲区被填满时引发中断,所以你可以将它刷新到磁盘(或任何你喜欢的)。在某些模型上,还有用于仅跟踪用户模式 (CPL > 0) 或仅跟踪内核模式 (CPL = 0) 代码的选项。如果您走这条路,则需要阅读英特尔软件开发人员手册第 3B 卷的第 17.4.5-6 节和第 17.4.9 节。在 Linux 中,对此有一些内核支持,但据我所知,没有一个已进入股票内核。2011 年,Akihiro Nagai 提议为该
perf
工具添加补丁,以添加perf branch trace
使用英特尔 BTS 系统的命令;也有关于这方面的介绍。此外,在2007年,有一个建议补丁,以ptrace
揭露BTS设备。我不知道有什么现成的东西可以在 Windows 中做到这一点。
最后,如果您只关心相当小的 (4-16) 个分支,您可以使用该
Last Branch Recording (LBR)
功能。这具有基本上没有开销的优点,但相当大的缺点是它只会为您提供最后 N 个分支,其中 N 因处理器而异(从少至 4 到多至 16)。这方面的详细信息可以在 Intel 开发人员手册的第 17.4.8 节中找到。一个有趣的注意事项是 Haswell(英特尔刚刚发布的处理器架构)有一个版本,可以跟踪调用和返回,有效地为您提供一个小的影子调用堆栈,这在某些情况下非常有用。
LBR 也已用于至少一个安全系统,以验证函数是否仅从受信任的来源调用,但这对于这个问题来说有点偏离主题。
因此,总而言之,MSR 跟踪是一种使用英特尔处理器中的硬件支持来更快地进行跟踪的方法。它在理论上非常有吸引力,但在常用工具中(还)没有很多支持。
资料来源: