有些小丑(BIOS/DOS/TSR...)在中断向量表中写入了随机数据。我知道这一点是因为反汇编告诉我的。
通常,在获取中断向量之前,我会验证所选的 IVT 插槽是否为空。但有了这一切遗留数据,一个不起眼的应用程序如何知道挂接特定中断向量仍然是安全的?
虽然我的程序员参考资料描述了DOS功能25hSetInterruptVector
as
"Safely修改中断向量以指向指定的中断处理程序”
我认为它不太关心这个预先存在的虚假内容。到目前为止对于safely!
是否有一些巧妙的方法可以绝对确保中断向量是空闲的?
不,没有一种巧妙且绝对可靠的方法来检查向量是否自由。
This is because every of the possible 232 values for an interrupt is potentially a valid value.
一些值可以是非常可疑,但有效:
-
0ffffh:0ffffh可以有效(指向 0ffefh,且 A20 被屏蔽)。
-
0000h:0000h即使在向量 0 上也可以有效。值为零的 DWORD 解码为一对
add [bx+si], al
哪些是有效的。
-
0b800h:0000h和其他类似的 ROM 地址也可以是有效的,因为扩展 ROM 可用于承载代码。尽管标准视频内存不太可能做到这一点。
- 如果数据经过专门设计为有效代码和有效信息,则保留 BIOS 区域(例如 (E)BDA)中的地址理论上可以有效。
当然,上面的一些方法非常牵强,涉及将数据作为代码执行,但您不应该信任向量指针的主要原因是 BIOS 可能会用至少一个虚拟 ISR 填充每个向量槽。
这不会让无意中的不良制作int
指令挂起系统。
您可以做以下几件事:
-
Chaining
选择一个不拥挤的中断号N。选取一组输入值I尚未使用(例如AH=d0-ff)。将您的 ISR 附加到N并处理only those I值,将其他输入委托给前一个 ISR。
-
瞄准特定平台
一些中断向量,例如int EA http://www.ctyme.com/intr/int-ea.htm,仅在特定系统中使用。由于大多数这些系统都消失了,您可以回收它们的中断。
如果你窃取了一个中断向量并且一切都正常工作并且没有人抱怨,那么这就是你的中断。只需仔细检查场所即可。
-
使用中断2F
The Int 2F http://www.ctyme.com/intr/rb-4251.htm及其变体备用多路中断规范 (AMIS) https://en.wikipedia.org/wiki/Terminate_and_stay_resident_program#Interrupts_sharing at Int 2D http://www.ctyme.com/intr/rb-4214.htm可用作共享/复用中断。
然而,AMIS 并没有获得太大的欢迎。
-
Try to find an empty spot anyway
As a first attempt you can try to search for null entries1 in the IVT, though valid in theory, they are likely empty slots.
You can also try to find a pointer that is present more than one or two times, suggesting the presence of a dummy ISR (as an ISR cannot identify its vector number easily).
我会选择n。 1 就我个人而言,如果不可能的话我会实施n。 3. 如果不可能的话我会使用n。 4 并回退至 n。 2.
1 Catching all the "suspicious" values is impractical and would only give a little gain, so just shoot for the big ones.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)