如何在DOSBox的Turbo Debugger中模拟键盘按键
DOSBox下Turbo Debugger调试按键检测死循环的简便方案
不需要修改程序源码、临时添加跳转段,直接用调试器和DOS系统本身的机制就能快速绕过等待、模拟按键输入,常用方法如下:
- 利用断点+寄存器修改模拟按键
找到程序里键盘检测逻辑的判断出口,比如调用BIOS键盘中断int 16h(功能号AH=01h检测缓冲区是否有按键)的位置,设置一次性断点。程序触发断点停住后,直接修改寄存器值模拟按键返回:把标志寄存器的ZF位设为0(代表缓冲区存在按键),再给AX寄存器写入对应按键的键值,高8位是扫描码、低8位是ASCII码,比如模拟回车键就写入0x1C0D,之后继续运行程序,检测逻辑会直接判定读到有效按键,自动进入后续代码段,全程不会改动原程序文件。 - 直接填充DOS键盘缓冲区
DOS系统的键盘缓冲区固定在内存段0040h处:缓冲区头尾指针分别存放在0040:001A(读指针)、0040:001C(写指针),实际按键内容从0040:001E开始存放,每个按键占2字节。程序停在检测循环时,打开TD的内存查看窗口跳转到对应地址,在写指针指向的位置写入你要模拟的按键扫描码和ASCII码,再把写指针的值加2(注意缓冲区是环形结构,不要超出缓冲区边界),继续运行后程序的检测逻辑可以直接读到你填入的按键,立刻退出等待循环。 - 临时修改指令指针跳过等待
如果不需要模拟特定按键,只是想越过按键检测环节,程序停在循环内时,直接把IP(指令指针)寄存器的值修改为按键检测循环出口后的第一条指令的偏移地址,再继续运行就会直接执行后续调试目标代码,所有修改仅在当前调试会话生效,重启调试后程序逻辑自动恢复,不需要重新编译。 - 正确传入真实按键避免被调试器拦截
很多人调试时按的键没被目标程序读到,是因为TD停在单步/断点状态时,所有键盘输入会优先被TD本身当作调试快捷键处理,不会传给被调试程序。你只需要在按下运行快捷键F9后、程序跑在检测循环中的时候按目标按键,输入就会正常进入DOS键盘缓冲区,被检测逻辑读到。
提示:以上所有操作都是调试时的动态临时修改,不会改动你编译生成的可执行文件,比修改源码加临时跳转的方式效率高很多,不需要反复改代码、重新编译链接。
内容的提问来源于stack exchange,提问作者Quenyrous
相关产品推荐
相关产品推荐

