【问题标题】:How to detect protected mode in a Volume Boot Record (Partition Boot Sector)?如何检测卷引导记录(分区引导扇区)中的保护模式?
【发布时间】:2020-05-15 23:01:05
【问题描述】:

我正在 x86 PC 上以 MBR 模式(无 EFI)调试不寻常的引导安排。
IPL in MBR --> 奇异的BootManager* --> Partiton Boot Sector --> 实验性的@987654331 @

我在 16 位实模式 x86 程序集中编写了一个原始的 512 字节分区引导扇区 (PBR),它使用 int 10h BIOS 服务来显示传递给它的 16 位寄存器。它非常适合调试。

我想增强我的调试 PBR 以显示有关 CPU 模式的信息,即 BootManager 是否已经将 CPU 切换到 Protected Mode(32 位或 64 位)或其子模式,例如 Virtual 8086 mode。我需要此信息用于调试目的。

在这种情况下如何可靠地检测CPU mode(及其子类型)?

  • BootManger 位于 MBR 和第一个分区之间的扇区中,它拦截/模拟 BIOS 服务/中断 - 我已经看到它在调试器中将 int 13h 向量指向自身

编辑:这个问题不是关于检测在软件中模拟的 CPU 的 CPU 模式。 (又名:虚拟 CPU)
此外,Virtual CPU 与真实 CPU 的Virtual 8086 mode 不同。 Virtual 8086 mode 是 CPU 模式,是 Protected Mode 的子模式,它是在硬件中实现的,所以这个子模式的检测是这个问题的主题,以及 32 位和 64 位的检测protected modes 等......在真正的硅片上实现

【问题讨论】:

  • 所以您想编写在 16 位或 32 位模式下执行时能够正常工作的机器代码?或许mov ax, sp/push imm8/sub ax, sp看看SP变化多少? int 10h BIOS 服务甚至可以在 32 位保护模式下工作吗? 另请参阅此检测 16/32/64 位模式的 x86 多语言机器代码:Determine your language's version(针对代码大小进行了优化但评论很好)。您还可以读取相关控制寄存器以查看是否设置了保护模式位,以检测 16 位保护模式与 16 位实模式我猜。
  • @GeorgeRobinson 当然。 Apparently it's not even difficult。好像我之前错了。
  • 没有引导管理器会无缘无故切换到 32 位保护模式。如果确实如此,则没有卷(分区)引导记录起作用。它可能会切换到虚拟 8086 模式,但这不太可能,因为它会阻止受保护模式的操作系统启动。
  • @Ross Ridge:确实,没有一个理智的引导管理器会这样做,但一个有问题的引导管理器可能会。此模式发现用于调试目的。
  • 切换到保护模式并非偶然。

标签: assembly x86 x86-64 x86-16 boot


【解决方案1】:

为了防范简单的 rootkit,很容易检查您是否处于 virtual8086 模式(如 ecm 的评论中所述 - 例如 smsw ax 并查看是否设置了低位)。

这不会解决任何问题。

问题在于,稍微高级一点的 rootkit 只会使用硬件虚拟化(例如 https://en.wikipedia.org/wiki/Blue_Pill_(software) ),因此您的简单测试将通过。

要检测您是否处于虚拟化环境中,您需要利用仿真中的弱点(例如,检测行为与应有的稍有不同的事物);但是,如果您不知道弱点可能是什么,这并不容易,并且任何弱点都可以在下一个版本的 rootkit 中纠正,直到没有弱点为止。

换句话说;整个方法不能“保证成功”。相反,您需要一种不同的方法。

替代方法是“测量”在启动期间执行的代码(这样您就知道它是否被篡改/更改,因为您最终会在启动后得到不同的测量结果),并防止未经授权的代码在第一名。

用于“测量”;它主要是由特殊硬件(例如 TPM 芯片)完成的美化安全哈希。这有 2 种风格 - “静态信任根”(对启动期间执行的所有内容的测量,包括固件、MBR 等)和“动态信任根”(在启动后将 CPU 重置为已知状态,然后测量来自那个已知状态的所有内容)。

为了防止未经授权的代码被执行,最知名/最受支持的实现是 (UEFI) SecureBoot。基本思想是使用数字签名(其中可执行文件的安全散列由发布者的私钥加密;因此可以通过使用发布者的公钥解密签名并将其与可执行文件的散列进行比较来检查签名文件)。这允许检测到修改(哈希是错误的),并允许发布者被识别和授权(如果发布者的公钥不在接受发布者的白名单中,或者在被拒绝发布者的黑名单中,那么系统拒绝执行代码)。

【讨论】:

  • 我同意你的看法,即使用欺骗性软件虚拟化 CPU 执行的代码检测 CPU 模式是徒劳的。但是,原始问题没有询问有关检测软件虚拟化 CPU 的 CPU 模式的问题,因此恕我无法接受您的回答。我认为您对“虚拟 8086 模式”的提及感到困惑,这是一种在 硬件 而非软件中实现的 CPU 模式!!!。我将编辑问题以专门排除您关注的由软件执行的 CPU 硬件虚拟化的极端情况
  • @GeorgeRobinson:第一段回答了您提出的问题(检测 v8086 模式)。答案的其余部分基于想要在引导加载程序中检测 v8086 的通常(?)原因:检测可能旨在在操作系统“外部”运行的 rootkit,将普通操作系统作为来宾。如果您对此不感兴趣,请在 smsw ax 部分之后停止阅读。 (你可以放心地假设你没有处于 32 位保护模式,除非之前的引导扇区有一个巨大的错误。如果跳转到保护模式,引导加载程序不会工作。)
猜你喜欢
  • 2012-10-25
  • 2017-06-12
  • 2016-02-15
  • 2013-07-16
  • 2013-07-15
  • 2018-07-05
  • 1970-01-01
  • 2014-06-25
  • 2021-10-31
相关资源
最近更新 更多