找一个免费的中断插槽

Sep*_*and 3 x86 assembly dos interrupt-handling

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

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

虽然我的程序员参考描述了DOS功能25小时SetInterruptVector

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

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


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

Mar*_*oom 5

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

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

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

  • 0ffffh: 0ffffh可以有效(指向A20屏蔽的AFFFh).
  • 0000h:0000h即使在向量0上也可以有效.值为零的DWORD解码为一对add [bx+si], al有效的DWORD .
  • 0b800h:0000h和其他类似的ROM地址可以有效,因为扩展ROM可用于携带代码.虽然标准视频内存不太可能.
  • 保留的BIOS区域中的地址,如(E)BDA,如果数据被特制为有效代码和有效信息,则理论上是有效的.

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


你可以做几件事:

  1. 链接
    选择一个不拥挤的中断号ñ.拿起一组输入值的还没有使用(比方说AH = D0-FF).将ISR附加到N处理I值,将其他输入委派给先前的ISR.
  2. 定位特定平台
    某些中断向量(如int EA)仅在特定系统中使用.由于大多数系统都已消失,您可以收回它们的中断.
    如果你偷了一个中断向量,一切都在继续工作,没有人在抱怨,那么这就是你的中断.只需仔细检查一下.
  3. 使用中断2F
    诠释2F和其变体可替代的多重中断规范(AMIS)诠释2D可以用作共享/复用的中断.
    然而,AMIS确实获得了很多人气.

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

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


1捕捉所有"可疑"值是不切实际的,只会略微增加,所以只需要拍摄大的值.

  • @SepRoland INT B1h应该是安全的,至少在没有BASIC ROM的任何系统上都是如此.我不打扰链接它,因为它通常由BIOS初始化为0000:0000而不是由MS-DOS使用.如果还有其他任何东西使用它,那么你的功能很可能会发生冲突. (3认同)
  • 不要忘记一些中断向量不是指向代码而是指向数据.当然它们不能通过`int xx`指令调用,但BIOS将依赖于它们指向某些数据区域的事实. (2认同)