【问题标题】:how to watch and record the information of all the registers such as `eax`,`ecx` and instructions cpu was executing?如何查看和记录所有寄存器的信息,例如`eax`,`ecx`和cpu正在执行的指令?
【发布时间】:2018-07-14 08:08:47
【问题描述】:

我们想写代码来观察和记录eax,ecx等所有寄存器的信息和指令(我们需要记录cpu正在执行的所有指令),这样我们就可以使用Machine识别某些指令序列是否为恶意指令的学习方法。

  1. 我们曾经将QEMU中的translate.c改成记录寄存器和指令等中间信息,也就是说,我们会记录QEMU在将QEMU上的虚拟机指令到真机的过程中的所有信息。

  2. 但是从虚拟机QEMU收集信息比真机效率低,所以我们打算写代码,以便在真机上收集Win10的所有信息。

  3. 问题是当我们编写代码获取PC寄存器的值时,该值始终是我们代码中下一行的地址,我们不知道如何看指令(或代码) CPU 正在执行的其他并行执行程序?

您能提供一些想法吗,谢谢!

【问题讨论】:

  • 使用调试器。
  • @user202729 调试器只能附加一个软件,但我们需要观察整个操作系统。

标签: windows cpu cpu-registers


【解决方案1】:

您可以使用 Intel CPU 的基于事件的精确采样 (PEBS) 功能。

PEBS 可以在每次性能监视器计数器 (PMC) 触发性能监视器中断 (PMI) 时将架构信息(例如 GP 寄存器内容)存储在设计的缓冲区中。

可以设置 PMC 以根据阈值触发 PMI。
PEBS 只能在 IA32_PMC0 上启用,但这不是限制。
它是在 Intel Netburst 架构 (Pentium 4) 中引入的,因此可以在每个现代 Intel 的 CPU 上使用。

在启用 PEBS 的事件中,INSTR_RETIRED.ANY_P 可能是您要查找的事件(注意:我不认为这个计数器每次都会逐步递增,但这应该是轻微的噪音/与您的分析无关)。

PMI 是通过本地 APIC 调度的,因此您必须查看它以将其转换为中断向量,以便将 ISR 附加到它。

PEBS 需要一些设置,尤其是调试存储 (DS) 区域和一些用于存储记录的元结构。

通过对 PMC0 进行编程以计算退出的指令(奖励,您可以使用不同的阈值来调整记录的粒度),通过安装读取 PEBS 记录并将其保存到某个位置的 PMI ISR,最后通过启用 PEBS,您将能够记录寄存器的内容。
请注意,这必须在操作系统内部完成,因此您必须精通 Windows 内部,尤其是调度程序。
加上收集的信息量很大,因此系统仍然会出现相当大的减速。

使用 PMC 的一个很好的副作用是您可以只为用户代码、内核代码或两者都启用它们(如果需要)。

PEBS 功能的完整参考可以在Intel's Manual Volume 3 的第 18 章中找到。
第 17 章是预防性的。


如果 PEBS 过于繁琐,您可以尝试使用 TF 来强制执行每条指令上的 CPU 陷阱。
结合最后分支记录 (LBR) 功能,您可以逐个跳转而不是逐个指令。
它还可以与任务状态段 (TSS) 和 C. 结合使用,以在 Trap 中断时自动执行一些记录(如将上下文溢出到内存中)。

我不知道有任何其他方法可以跟踪寄存器。
虚拟机扩展 (VMX) 没有用,因为更改 GP 寄存器不使用关键指令。

在 Linux 下,可以查看rr,但这不是你的情况。

如果可以的话,也许在系统调用边界跟踪寄存器内容(例如,通过重定向syscall,这对驱动程序来说很容易)是一个更好的主意。
进程不断更改它们的寄存器,但最终只有它们传递给系统调用的内容才会影响系统(这忽略了 0 天和共享内存)。

【讨论】:

    猜你喜欢
    • 2019-03-01
    • 2015-01-21
    • 1970-01-01
    • 2019-09-07
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 2017-04-05
    相关资源
    最近更新 更多