【问题标题】:Find a free interrupt slot找到一个空闲的中断槽
【发布时间】:2017-04-11 09:56:03
【问题描述】:

一些小丑(BIOS/DOS/TSR...)在中断向量表中写入了随机数据。我知道这一点,因为拆卸告诉我。

通常在获取中断向量之前,我会验证所选的 IVT 插槽是否为空。但是有了所有这些left-behind-data,一个不起眼的应用程序怎么知道挂钩一个特定的中断向量仍然是安全的呢?

虽然我的程序员参考将 DOS 函数 25h SetInterruptVector 描述为

安全地修改中断向量以指向指定的中断处理程序”

我认为它不会太在意这种预先存在的虚假内容。到目前为止,安全


有什么巧妙的方法可以绝对确定一个中断向量是空闲的吗?

【问题讨论】:

  • “安全”可能意味着确保在更新向量不会发生中断。其余问题的答案几乎肯定是:不。
  • 您可以使用多路复用中断 (2Fh) 或备用多路复用中断 (AMIS, 2Dh)。但是您也可以选择一些 BIOS 和 MS-DOS 未记录为使用的随机中断。如果您实际上正在运行任何 TSR,则不难确定是否有人碰巧使用了您选择的中断。只需覆盖矢量,看看是否有任何损坏。

标签: assembly x86 dos interrupt-handling


【解决方案1】:

不,没有巧妙的绝对可靠的方法来检查向量是否免费。

这是因为每个可能的 232 个中断值都可能是有效值。

某些值可能非常可疑,但有效:

  • 0ffffh:0ffffh 可以是有效的(指向带有 A20 掩码的 0ffefh)。
  • 0000h:0000h 可以是有效的,即使在向量 0 上也是如此。值为零的 DWORD 解码为一对有效的 add [bx+si], al
  • 0b800h:0000h 和其他类似的 ROM 地址可以是有效的,因为扩展 ROM 可以用于携带代码。虽然标准显存不太可能。
  • 保留 BIOS 区域中的地址(如 (E)BDA)在理论上可以有效,前提是数据经过特殊处理以既是有效代码又是有效信息。

当然,上面的一些内容非常冗长并且涉及将数据作为代码执行,但您不应该信任向量指针的主要原因是 BIOS 可能会用至少一个虚拟 ISR 填充每个向量槽。
这不会让无意中精心制作的 int 指令挂起系统。


你可以做几件事:

  1. 链接
    选择一个不拥挤的中断号N。选取一组尚未使用的输入值 I(例如 AH=d0-ff)。将您的 ISR 附加到 N 并处理 那些 I 值,将其他输入委托给前一个 ISR。

  2. 针对特定平台
    一些中断向量,如int EA,仅在特定系统中使用。由于这些系统中的大多数都已消失,因此您可以收回它们的中断。
    如果您窃取了一个中断向量并且一切正常并且没有人抱怨,那么这就是您的中断。只需仔细检查场所即可。

  3. 使用中断 2F
    Int 2F 及其变体 Alternate Multiplex Interrupt Specification (AMIS) Int 2D 可用作共享/多路复用中断。
    然而,AMIS 并没有获得太多的人气。

  4. 尽量找个空位
    作为第一次尝试,您可以尝试在 IVT 中搜索空条目1,虽然理论上有效,但它们很可能是空槽。
    您还可以尝试查找出现次数超过一两次的指针,这表明存在虚拟 ISR(因为 ISR 无法轻松识别其向量编号)。

我会选择 n。 1个人,如果不可能,我会实施n。 3. 如果不可能,我会使用 n.4 并回退到 n。 2.


1 捕捉所有“可疑”值是不切实际的,而且只会带来一点好处,所以只为大的。

【讨论】:

  • 0000:0000 的向量不可能真正有效。它不被解释为指令。如果向量上没有安装有效的中断处理程序,则链接将不起作用,因此它不会消除检查是否存在中断处理程序的需要。
  • 我以前用过AMIS,发现它带来了很大的开销。另一方面,Chaining 似乎要简单得多。我会探索这个。由于出于情感原因我特别想使用中断 B1h,所以我认为我只能使用风险更大的蛮力方法来抓住需要的东西。或者我可以停止多愁善感!
  • 不要忘记有些中断向量不是指向代码而是指向数据。当然,它们不能通过int xx 指令调用,但 BIOS 将依赖于它们指向某些数据区域这一事实。
  • @SepRoland INT B1h 应该可以安全使用,至少在任何没有 BASIC ROM 的系统上是这样。不过,我不会费心链接它,因为它通常由 BIOS 初始化为 0000:0000 并且不被 MS-DOS 使用。如果有其他东西使用它,很可能你的函数无论如何都会发生冲突。
  • @RossRidge 如果没有中断处理程序,为什么链接不起作用?新的 ISR 将仅在遗留输入上调用旧的 ISR。如果存在中断处理程序,则存在遗留输入。
猜你喜欢
  • 1970-01-01
  • 2014-06-07
  • 2011-03-17
  • 1970-01-01
  • 2013-08-09
  • 2012-08-06
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多