我正在 x86 PC 上以 MBR 模式(无 EFI(调试异常启动安排。
MBR 中的IPL
-->异国情调的BootManager
* -->Partiton Boot Sector
-->实验OS
我在 16 位实模式下编写了一个原始的 512 字节分区引导扇区 (PBR(x86
程序集,它使用int 10h
BIOS 服务来显示传递给它的 16 位寄存器。 它适用于调试。
我想增强我的调试 PBR 以显示有关 CPU 模式的信息,即 BootManager 是否已将 CPU 切换到保护模式(32 位或 64 位(或其子模式,例如虚拟 8086 模式。我需要此信息进行调试。
在这种情况下,如何可靠地检测CPU mode
(及其子类型(?
-
引导管理器位于 MBR 和第一个分区之间的扇区中,它拦截/模拟 BIOS 服务/中断 - 我已经看到它在调试器中将
int 13h
向量指向自身
编辑:这个问题不是关于检测软件中模拟的CPU的CPU模式。(又名:虚拟CPU(
此外,Virtual CPU
与真实 CPU 的Virtual 8086 mode
不同。 虚拟 8086 模式是 CPU 模式,它是保护模式的子模式,它是在硬件中实现的,因此此子模式的检测是这个问题的主题,以及 32 位和 64 位保护模式的检测等......在真正的硅上实现。
为了防范简单的 rootkit,很容易检查您是否处于 virtual8086 模式(如 ecm 的评论中所述 - 例如smsw ax
并查看是否设置了低位(。
这解决不了任何问题。
问题是稍微高级的rootkit只会使用硬件虚拟化(例如 https://en.wikipedia.org/wiki/Blue_Pill_(软件((,因此您的简单测试将通过。
要检测您是否处于虚拟化环境中,您需要利用仿真中的弱点(例如,检测行为与应有的行为略有不同的内容(;但是如果您不知道弱点可能是什么,这并不容易,并且任何弱点都可以在下一版本的rootkit中得到纠正,直到没有弱点。
换句话说,整个方法不能"保证成功"。相反,您需要一种不同的方法。
替代方法是"测量"在启动期间执行的代码(以便您知道它是否被篡改/更改,因为您最终会在启动后得到不同的测量结果(,并首先防止执行未经授权的代码。
对于"测量";它主要只是由特殊硬件(例如TPM芯片(完成的美化安全哈希。这有两种形式 - "静态信任根"(测量启动期间执行的所有内容,包括固件、MBR 等(和"动态信任根"(稍后在启动时将 CPU 重置为已知状态,然后测量该已知状态的所有内容(。
为了防止执行未经授权的代码,最知名/最受支持的实现是 (UEFI( SecureBoot。基本思想是使用数字签名(其中可执行文件的安全哈希由发布者的私钥加密;以便可以通过使用发布者的公钥解密签名并将其与可执行文件的哈希进行比较来检查签名(。这允许检测修改(哈希是错误的(,并允许识别和授权发布者(如果发布者的公钥不在接受发布者的白名单中,或者位于被拒绝发布者的黑名单中,则系统拒绝执行代码(。