找一个免费的中断插槽

时间:2016-11-27 16:53:43

标签: assembly x86 dos interrupt-handling

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

通常在占用中断向量之前,我会验证所选的IVT插槽是否为空。但是对于所有这些留下数据,一个不起眼的应用程序如何知道钩住特定的中断向量仍然是安全的?

虽然我的程序员参考文献描述了DOS函数25h textFieldShouldBeginEditing

  

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

我不认为它过分关注这种预先存在的虚假内容。到目前为止安全

是否有一些巧妙的方法可以绝对确定中断向量是空闲的?

1 个答案:

答案 0 :(得分:5)

不,没有巧妙绝对可靠的方法来检查矢量是否空闲。

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

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

  • 0ffffh:0ffffh 可以有效(指向A20屏蔽了A20)。
  • 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 并仅处理 那些我的值,将其他输入委派给之前的ISR。
  2. 定位特定平台
    某些中断向量(如int EA)仅在特定系统中使用。由于大多数系统都已消失,您可以收回它们的中断 如果你偷了一个中断向量,一切都在继续工作,没有人在抱怨,那么这就是你的中断。只需仔细检查一下。
  3. 使用中断2F
    位于Int 2FAlternate Multiplex Interrupt Specification (AMIS)及其变体Int 2D可用作共享/多路复用中断。
    然而,非盟特派团的确受到了很大的欢迎。

  4. 无论如何都要找个空位
    作为第一次尝试,您可以尝试在IVT中搜索空条目 1 ,虽然理论上有效但它们可能是空插槽。
    您还可以尝试查找一次或多次出现的指针,表明存在虚拟ISR(因为ISR无法轻易识别它的向量编号)。

  5. 我会和n一起去。 1个人,如果不可能,我会实施n。 3.如果不可能,我会使用n.4来回退到n。 2.

    1 捕获所有“可疑”值是不切实际的,只会略微增加,所以只需拍摄大的。