寻找空闲的中断槽

2023-12-20

有些小丑(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指令挂起系统。


您可以做以下几件事:

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

  2. 瞄准特定平台
    一些中断向量,例如int EA http://www.ctyme.com/intr/int-ea.htm,仅在特定系统中使用。由于大多数这些系统都消失了,您可以回收它们的中断。
    如果你窃取了一个中断向量并且一切都正常工作并且没有人抱怨,那么这就是你的中断。只需仔细检查场所即可。

  3. 使用中断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 并没有获得太大的欢迎。

  4. 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(使用前将#替换为@)

寻找空闲的中断槽 的相关文章

  • 如何通过查看程序集来判断程序是否使用动态调度

    我在 Reddit 上读过一篇文章Herb Stutter JIT 永远不会像原生一样快 http www reddit com r programming comments rr2dj herb stutter jit will neve
  • 如何在 x86 汇编中编写自修改代码

    我正在考虑为我最近开发的一个业余爱好虚拟机编写一个 JIT 编译器 我了解一些汇编语言 我主要是一名 C 程序员 我可以阅读大多数汇编语言并参考我不理解的操作码 并编写一些简单的程序 但是我很难理解这几个示例我在网上找到的自我修改代码 这是
  • 让 GCC/Clang 使用 CMOV

    我有一个简单的标记值联合 这些值可以是int64 ts or doubles 我正在对这些联合进行加法 但需要注意的是 如果两个参数都代表int64 t值 那么结果也应该有一个int64 t value 这是代码 include
  • Linux 内核中是否使用了扩展指令集(SSE、MMX)?

    好吧 它们带来 至少应该带来 性能的巨大提升 不是吗 所以 我还没有看到任何 Linux 内核源代码 但很想问 它们是否以某种方式被使用 在这种情况下 对于没有此类指令的系统 必须有一些特殊的 代码上限 SSE 和 MMX 指令集在音频 视
  • 编译器在函数名称前添加下划线前缀的原因是什么?

    当我看到 C 应用程序的汇编代码时 如下所示 emacs hello c clang S O hello c o hello s cat hello s 函数名称以下划线作为前缀 例如callq printf 为什么这样做以及它有什么优点
  • 添加饱和 32 位有符号整数内在函数?

    有人可以推荐一种使用 Intel 内在函数 AVX SSE4 添加饱和 32 位有符号整数的快速方法吗 我查看了内在指南并发现 mm256 adds epi16但这似乎只添加 16 位整数 我没有看到 32 位有任何类似的东西 其他电话似乎
  • 返回地址预测堆栈缓冲区与堆栈存储的返回地址?

    一直在阅读 Agner Fog 的 Intel AMD 和 VIA CPU 的微架构 他在第 34 页描述了 返回地址预测 http www agner org optimize microarchitecture pdf http www
  • 两个 16 位数字相乘 - 为什么结果是 32 位长? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如果我将两个 16 位数字相乘 结果将是 32 位长 但为什么会这样呢 对此有何明确解释 为了我的正确理解 其计算方法是 n 位数字乘以
  • 调用/返回/jmp等后x86代码执行?

    我希望这个问题不会太愚蠢 因为它看起来似乎很明显 当我对缓冲区溢出进行一些研究时 我偶然发现了一个简单的问题 调用 返回 跳转后转到新指令地址后 CPU是否会执行该地址处的OP代码 然后将一个字节移动到下一个地址并执行下一个OP代码 依此类
  • 使用 XCHG 解锁的自旋锁

    维基百科提供的使用 x86 XCHG 命令的自旋锁的示例实现是 Intel syntax locked The lock variable 1 locked 0 unlocked dd 0 spin lock mov eax 1 Set t
  • 当我尝试在 Armv8 程序集中分配数组时,执行冻结

    所以我正在用汇编语言进行编程 这只是一个简单的代码 这样我就可以学习如何分配数组 以便稍后在 NEON 编程中使用它们 ASM FUNC FPE data balign 8 array skip 80 array1 word 10 20 3
  • Mac OS X 上的 64 位程序集运行时错误:“dyld:无可写段”和“Trace/BPT trap”

    当尝试运行以下汇编程序时 globl start start pushq 0x0 movq 0x1 rax subq 0x8 rsp int 0x80 我收到以下错误 dyld no writable segment Trace BPT t
  • 尝试理解 printf() 的 gcc 汇编输出

    我正在尝试学习如何理解汇编代码 因此我一直在研究 GCC 的汇编输出以获取一些愚蠢的程序 其中之一只不过是int i 0 我现在或多或少完全理解了其中的代码 最大的困难是理解散布的 GAS 指令 无论如何 我向前迈了一步并添加了printf
  • .bat 文件将文件排序到文件夹中

    对于我的图片集 我希望文件夹中的所有图片按日期自动分类到文件夹中 幸运的是 这些文件已经以时间戳命名 2012 07 15 12 21 06 jpg 2012 07 15 12 21 26 jpg 2012 07 16 12 12 50 j
  • _addcarry_u64 和 _addcarryx_u64 与 MSVC 和 ICC

    MSVC 和 ICC 都支持内在函数 addcarry u64 and addcarryx u64 根据英特尔的内在指南 https software intel com sites landingpage IntrinsicsGuide
  • __stack_chk_fail_local 和 -fno-stack-protector - 如何让它工作?

    Update 我刚刚发现问题出在我的项目 libxml2 中包含的预构建库上 它是在启用堆栈保护的情况下构建的 因此依赖于 stack chk fail local方法 我现在已经重建了该库 fno stack protector也是 一切
  • 查找用户输入中的第一个和最后一个大写字母

    输入将从 a z 或 A Z 中获取 并且输入以星号结束 我们需要将输入字符的第一个和最后一个大写字母作为输出 另外 我们应该显示每次输入的内容 注意 我们逐个字符地获取输入 而不是作为字符串 测试用例1 输入 aAbCcP 输出 AP 测
  • Haswell 及其后续产品上的 A20 系列是否仍会被屏蔽?

    维基百科引用了英特尔手册中的这一说法 A20M 的功能主要由较旧的操作系统使用 现代操作系统不使用 在较新的 Intel 64 处理器上 A20M 可能不存在 现在的手册中实际上有这样一个短语 但它是含糊不清的 Does A20M 实际上仅
  • 从 64 位 nasm 代码接收 32 位寄存器

    我正在学习 64 位 nasm 我通过执行以下操作来汇编 nasm 文件 该文件仅包含 64 位寄存器 nasm f elf64 HelloWorld nasm o HelloWorld o 并链接它执行以下操作 ld HelloWorld
  • 将 1 字节立即值添加到 2 字节内存位置

    The add说明文档来 自这一页 http x86 renejeschke de html file module x86 id 5 html说如下 请注意我突出显示的两条说明 我在 NASM 中尝试了以下代码 符合第一个突出显示的指令

随机推荐

  • 什么时候调用属性?

    我对某些代码感到困惑 在班级中我有一个财产 Class A ClassB objB public int TimedValue objB Timer Inside classB I have classB public int Timer
  • 推送到不同存储库时自动触发 Travis?

    有没有办法在每次推送到存储库 Y 时触发存储库 X 的 Travis CI 构建 具体来说 我希望每次有推送时都启动我的构建http github com tensorflow tensorflow http github com tens
  • 如何列出 .so 文件中的符号

    如何列出从 so 文件导出的符号 如果可能的话 我还想知道它们的来源 例如 如果它们是从静态库中提取的 我正在使用 gcc 4 0 2 如果这有什么区别的话 列出符号的标准工具是nm 你可以像这样简单地使用它 nm gD yourLib s
  • Android - 创建Word文档

    我想创建word doc 和excelAndroid 平台上的 xls 文件 对于Excel我可以使用jexeljar 但我找不到任何用于 word 文件的 API 你能告诉我是否有任何开源 免费的API可以在android平台上编写wor
  • 如何保存 Linq-to-SQL 中的更改?

    所以 这是我对这个常见问题的独特见解 我执行查询 获取对象 然后将对象传递到表单中 并使用对象中的数据填充表单 这不是通过引用传递的 然后 我编辑 通过表单 查询的对象的值 然后返回根据表单中的值构造的新对象 然后我想将其更新到数据库 At
  • Wildfly 8 AS 中的热部署位置

    在JBoss 6 AS中 热部署位置是 JBOSS HOME server default deploy我可以在其中解压 WAR 或 EAR 并更改任何配置文件的内容 并且无需重新启动即可工作 同样 在Wildfly 8 AS中 任何人都可
  • Swift 无法定位和读取属性列表 (.plist) 文件

    我在让一个简单的命令行 OSX Swift 程序从一个简单的 plist XML 文件中读取数据时遇到了一个真正的问题 事实上 该程序甚至看不到该文件 尽管它似乎存在并复制到捆绑包中 数据由一个类处理 该类旨在读取 plist 数据并将其复
  • 如何从 highcharts 制作响应式饼图

    几天以来 我一直在尝试从 highcharts 中制作一个响应式饼图 我正在从事一个中等规模的项目 有时很容易失去概览 我已经检查过了 http www angulartutorial net 2014 03 responsive high
  • 向现有 Corda 网络添加新节点

    我正在尝试在 corda 网络中添加新节点和现有节点 我是作为文档做的 但无法实现 正如文档中所述 这足以创建一个包含 node conf 的文件夹吗 如果那么它在运行引导程序时不会更新文件夹中的数据和信息 但我可以通过添加 corda 和
  • 单元测试中的修补不起作用,正在调用实际方法

    我有一个 python 文件 update baseline manifest py 现在 我正在编写单元测试 想要修补 read file 和 write file 我已经这样做了 def update baseline manifest
  • 覆盖 dll 类属性集

    我在我的项目中使用了一千个封闭的 DllClass 实例 public sealed class DllClass public DllClass public string DllClassProperty get set DllClas
  • 获取异常 JDBC 类型没有方言映射

    我是 hibernate 和 java 的新手 我正在尝试执行本机 sql 查询 但我被卡住了 任何人都可以帮助我或检查我在哪里做错了吗 我的java代码是 try trns session beginTransaction String
  • Django 和 node.js :抛出参数[1]; // 未处理的“错误”事件

    我正在尝试 Django socket io 和 node js 示例实时 Django https github com mburst django realtime tutorial git 当我尝试从浏览器发送消息时 我从节点服务器收
  • 如何绘制具有两个刻度的 x 轴?

    我想画一个有两个刻度的x轴 如下图所示 ggplot2版本可以是这样的 library ggplot2 x c 1 2 3 4 5 10 20 30 40 50 y c 1 2 2 3 4 2 1 3 5 5 You should intr
  • 无法让 Robotium 在 Android Studio 中工作

    我正在努力让 Robotium 在基于 gradle 的 Android Studio 上工作 但我找不到方法 这是我的 build gradle 文件 buildscript dependencies repositories maven
  • 展平 JToken

    假设我有以下 JToken data company ID 12345 location Some Location name Some Name 我想将此令牌传递到输出此 JToken 的 FlattenToken 函数中 data co
  • 什么是代表图例或图表键的好图标?

    我正在实现一个小型网络应用程序小部件 它显示图表 或图表 地图 图形 其他 的图例 键 但仅在鼠标悬停在小部件上时显示 它基本上只是一个带有背景图像的 div 什么是一个好的图标来向不熟悉的用户传达 我展示传奇 或 我就是传奇 我正在寻找
  • 如何使用python的多处理来终止进程

    我有一些代码需要针对其他几个系统运行 这些系统可能会挂起或出现不受我控制的问题 我想使用 python 的多处理来生成子进程以独立于主程序运行 然后当它们挂起或出现问题时终止它们 但我不确定解决此问题的最佳方法 当调用终止时 它确实会杀死子
  • 比较对象数组

    我正在寻找一种比较 PHP 中对象数组的简洁方法 我知道我可以只检查大小相等的数组 然后循环遍历一个数组 查找第二个数组中的每个对象 但我认为使用一个或多个数组比较函数会更好 我已经测试了几个对象数组 我遇到的主要问题是数组比较函数坚持将元
  • 寻找空闲的中断槽

    有些小丑 BIOS DOS TSR 在中断向量表中写入了随机数据 我知道这一点是因为反汇编告诉我的 通常 在获取中断向量之前 我会验证所选的 IVT 插槽是否为空 但有了这一切遗留数据 一个不起眼的应用程序如何知道挂接特定中断向量仍然是安全