c++ - 从另一个 exe 打开 exe,禁用内部 exe 中的某些键

标签 c++ c windows

我有一个以前的程序员留下的exe(GUI),它是在cpp中完成的,但是我需要禁用程序中的一些键盘键,因为当它们被意外击中时,这是不可取的。我正在使用 Windows。 我能否编写一个程序来在 Windows 上运行可执行文件,以便过滤掉某些击键?

最终,我只想为我当前的 exe 禁用某些键,但我没有项目文件。

最佳答案

基本方法包括将 DLL 注入(inject)到您正在创建的进程中,以 Hook 将键击馈送到现有可执行文件的函数调用。

您需要弄清楚您需要拦截哪些调用,然后编写一个函数来实现这些调用并执行您需要的过滤。该调用应调用真实 DLL 中的真实实现。您的新 DLL 包含过滤调用。

我现在没有时间进行更深入的回答,可能会在当天晚些时候重新访问。

更新:

我刚刚浏览了一些我的旧代码(从 20 世纪 90 年代末开始),这些代码注入(inject)了一个 DLL 来覆盖各种调用。我记得它更高级。代码覆盖了 GetProcAddressLoadLibrary* 函数,方法是遍历加载的模块并查看 PE 信息。它找到了导出的符号,更改了页面保护,然后更新了地址以指向带有手工编码的汇编程序序言和结尾的自定义函数。

鉴于您有一个单一的目标可执行文件,更简单的方法可能是修改导入表并使 GetMessagePeekMesssage 指向您自己的调用函数的版本真正的功能,但使用您要过滤的键过滤掉消息。

更改导入表可能比尝试反汇编应用程序和 NOP 出相关分支更容易。这样您就拥有了一个新的 DLL 而不需要单独的可执行文件来启动应用程序。导入表格式已记录,与您的目标代码不同。

关于c++ - 从另一个 exe 打开 exe,禁用内部 exe 中的某些键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38470205/

相关文章:

c++ - 使用 UDP 模拟 TCP - 使用数据包而不是 'bytes' 作为窗口大小有什么问题吗?

C 代码崩溃(不知道为什么)

c - 如何在 C 中读取不同数量的整数输入?

windows - TYPE_E_BUFFERTOOSMALL 和 DISP_E_BUFFERTOOSMALL HRESULT 值之间有什么区别?

Windows 相当于 $export

windows - 使用 RabbitMQ 在 Windows 安装上更新 Erlang 的最佳方法是什么

c++ - 如何使用 DCB 结构设置波特率 2.000.000

c++ - boost::property_tree 编译错误(错误 C2061:语法错误:标识符 'p')

c++ - 从转换后的容器元素创建离散分布

c - 如何在 C 中将随机大写字母数组填充为函数?