c++ - 在没有源代码访问权限的情况下修改旧 Windows 程序以在按键后不调用退出

标签 c++ windows debugging assembly

我有一个较旧的 C++ Windows 程序,我被要求在一个学生项目的 kiosk 风格环境中运行。在主菜单中,按 ESC 将退出程序,这是不可取的。在过去,我会捕获键盘中断或其他任何东西,并在可能决定所有这些的 case 语句中引用 JMP 或 CALL 的情况下挖掘 NOOP,但在 Windows 上,一切都经过各种注册的事件处理程序,我还没有大约 10 年没有完成任何 Windows 内部工作。

是否有一个很好的工具可以在某些 WM_EVENT(WM_KEYDOWN 是主要目标)消息或类似消息上对程序进行断点,以便我可以缩小可执行文件中进行检查的位置?我目前正在退出各种线程清理和最终退出调用之前进行的各种潜在系统调用,但似乎必须有更好的方法来执行此操作,但我忘记了。

最佳答案

如果您对处理消息的窗口有一个HWND,您可以拦截它的消息,有选择地不将某些消息传递给“真正的”窗口过程。

例如:

/* Get the current window proc for this hwnd. */
WNDPROC OldWindowProc = (WNDPROC)GetWindowLongPtr(hWnd, GWLP_WNDPROC);

/* Set the window proc to your own override. */
SetWindowLongPtr(hWnd, GWLP_WNDPROC, (ULONG_PTR)MyWindowProc);

然后在 MyWindowProc 中,您将拦截 WM_KEYDOWN。对于所有其他消息(以及您想要传递给控件的 WM_KEYDOWN),您将调用 OldWindowProc(您没有源代码的窗口过程)通过 CallWindowProc

更新: 没有意识到这是一个您不能直接更改的 EXE。您可能需要将此技术与 Matteo 提到的 DLL 注入(inject)相结合。也许您可以注入(inject)您的 DLL,通过 FindWindow 获取 HWND,然后按照我所描述的那样更改窗口过程。

关于c++ - 在没有源代码访问权限的情况下修改旧 Windows 程序以在按键后不调用退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2604746/

相关文章:

windows - 通过 pnputil 安装驱动程序

debugging - 测试顶级函数内定义的内部函数并与之交互的最佳方法是什么?

debugging - 内核调试时——查找用户态地址的页面保护

python - 程序输出错误的输出

c++ - 具有 C++ 性能问题/滞后峰值的 Lua

c++ - OpenGL命令的执行顺序

c++ - 如何连接几张 map ?

c++ - HLSL 法线贴图矩阵乘法

c - 有哪些可用的 KPRIORITIES?

mysql - 如何在 MySQL 5.7 (windows) 上设置 utf8mb4