Assembly 找到一个空闲的中断槽
一些小丑(BIOS/DOS/TSR…)在中断向量表中写入了随机数据。我知道这一点,因为我告诉过我 通常在获取中断向量之前,我会验证所选IVT插槽是否为空。但是,有了所有这些遗留的数据,一个不起眼的应用程序怎么知道挂接一个特定的中断向量是安全的呢 虽然我的程序员参考书将DOS函数25hAssembly 找到一个空闲的中断槽,assembly,x86,dos,interrupt-handling,Assembly,X86,Dos,Interrupt Handling,一些小丑(BIOS/DOS/TSR…)在中断向量表中写入了随机数据。我知道这一点,因为我告诉过我 通常在获取中断向量之前,我会验证所选IVT插槽是否为空。但是,有了所有这些遗留的数据,一个不起眼的应用程序怎么知道挂接一个特定的中断向量是安全的呢 虽然我的程序员参考书将DOS函数25hSetInterruptVector描述为 “安全地修改中断向量以指向指定的中断处理程序” 我不认为它太在意这些预先存在的虚假内容。到目前为止安全 是否有一些巧妙的方法可以绝对确保中断向量是自由的?不,没有任何巧妙
SetInterruptVector
描述为
“安全地修改中断向量以指向指定的中断处理程序”
我不认为它太在意这些预先存在的虚假内容。到目前为止安全
是否有一些巧妙的方法可以绝对确保中断向量是自由的?不,没有任何巧妙的绝对确定的方法可以检查向量是否是自由的 这是因为中断的每个可能232值都可能是有效值 某些值可能非常可疑,但仍然有效:
- 0ffffh:0ffffh可以是有效的(指向带20掩码的0ffffh)
- 0000h:0000h可以有效,即使在向量0上也是如此。值为零的双字解码为一对有效的
add[bx+si],al
- 0b800h:0000h和其他类似的ROM地址可以有效,因为扩展ROM可以用来携带代码。虽然标准的视频存储器不太可能李>
- 保留BIOS区域(如(E)BDA)中的地址在理论上是有效的,前提是数据经过精心编制,既可以是有效代码,也可以是有效信息
这不会让无意中编写的错误
int
指令挂起系统
你可以做几件事:
选取一个不过度拥挤的中断号N。选取一组我尚未使用的输入值(例如AH=d0 ff)。将ISR连接到N并仅处理那些I值,将其他输入委托给前一个ISR
一些中断向量,如,仅在特定系统中使用。由于这些系统中的大多数已经消失,您可以回收它们的中断。
如果你偷了一个中断向量,所有的东西都继续工作,没有人抱怨,那就是你的中断。只要再检查一遍
at及其变体可用作共享/多路复用中断。
然而,非盟特派团确实获得了很大的支持
作为第一次尝试,您可以尝试在IVT中搜索空的entries1,尽管理论上有效,但它们可能是空的插槽。
您还可以尝试查找出现一次或两次以上的指针,表明存在虚拟ISR(因为ISR无法轻松识别其矢量号)
1捕获所有“可疑”值是不切实际的,只会带来一点点好处,因此只需瞄准较大的值。“安全”可能意味着确保向量更新时不会发生中断。对于问题的其余部分,答案几乎是肯定的:不。您可以使用多路复用中断(2Fh)或备用多路复用中断(AMIS,2Dh)。但您也可以选择一些BIOS和MS-DOS没有记录为使用的随机中断。如果您实际上正在运行任何TSR,那么不难确定是否有一个TSR使用了您选择的中断。只需覆盖向量,看看是否有任何中断。0000:0000的向量不可能真正有效。它不被解释为指令。如果向量上没有已安装的有效中断处理程序,链接将不起作用,因此不需要检查是否有中断处理程序。我以前使用过AMIS,发现它带来了很大的开销。另一方面,链接似乎要简单得多。我将对此进行探讨。因为我特别想出于感情的原因使用中断B1h,所以我想我只剩下了更危险的暴力方法,即抓住需要的东西。或者我可以停止多愁善感!不要忘记,一些中断向量并不指向代码,而是指向数据。当然,它们不能通过
int xx
指令调用,但BIOS将依赖于它们指向特定数据区域的事实。@SepRoland int B1h应该可以安全使用,至少在没有基本ROM的任何系统上是如此。不过,我不会费心链接它,因为它通常由BIOS初始化为0000:0000,而不是由MS-DOS使用。如果其他任何东西使用它,您的函数很可能会发生冲突。@RossRidge如果没有中断处理程序,为什么链接无法工作?新的ISR将仅在旧的输入上调用旧的ISR。如果有中断处理程序,则有一个遗留输入iif。