老式DOS游戏内存驻留作弊程序键盘捕获技术问询
为老式DOS游戏开发内存驻留式作弊程序
最近我一直在捣鼓给老式DOS游戏做个简单的内存驻留(TSR)作弊程序——这类程序加载进内存后,会悄悄拦截键盘输入,当按下特定按键时就执行预设的作弊操作。
键盘中断拦截的核心实现
我用汇编代码直接操作DOS的中断向量表,来捕获键盘硬件中断(中断9),具体代码如下:
cli mov ax, [es:9*4+2] mov [origseg], ax mov ax, [es:9*4] mov [origint], ax mov word [es:9*4], kbhandler mov [es:9*4+2], cs sti
这段代码的步骤拆解一下:
- 先执行
cli关闭所有可屏蔽中断,防止修改中断向量表的过程被打断,避免系统崩溃 - 从ES寄存器指向的0段(中断向量表所在段)中,取出原中断9处理程序的段地址和偏移地址,分别存入
origseg和origint变量保存 - 将自定义的键盘处理函数
kbhandler的偏移地址,以及当前代码段(CS)的地址,写入中断向量表的中断9条目,完成中断拦截的替换 - 最后执行
sti重新开启可屏蔽中断,让系统恢复正常中断响应
交还控制权给原处理程序
在自定义的kbhandler函数处理完自己的逻辑后,我用下面的代码把控制权交还给原来的键盘中断处理程序,确保系统的正常键盘功能不受影响:
push word [origseg] push word [origint] retf
目前通过调试器验证,这段逻辑是可以正常工作的~
内容的提问来源于stack exchange,提问作者Jakub Judas
相关产品推荐
相关产品推荐

