我有一个以前程序员离开的exe(GUI)是在cpp中完成的,但我需要禁用程序中的一些键盘键,因为当它们被意外击中时,这是不可取的。我正在使用Windows。 我可以编写一个在Windows上运行可执行文件的程序,以便过滤掉某些按键吗?
最终,我只想禁用当前exe的某些键,但我没有项目文件。
答案 0 :(得分:1)
基本方法涉及将DLL注入到您正在创建的进程中以挂钩函数调用,将键击提供给现有可执行文件。
您需要找出需要拦截的调用,然后编写一个实现这些调用的函数并执行您需要的过滤。该调用应调用真实DLL中的实际实现。您的新DLL包含过滤调用。
我现在没有时间做出更深层次的回答,可能会在当天晚些时候重温。
更新
我刚看了一些旧的代码(来自已故的#90; 90),它注入了一个DLL来覆盖各种调用。我记得它更先进。代码通过迭代已加载的模块来查看PE信息,从而覆盖GetProcAddress
和LoadLibrary*
函数。它找到了导出的符号,更改了页面保护,然后更新了地址,使用手动编码的汇编程序prolog和epilogs指向自定义函数。
假设您有一个目标可执行文件,更简单的方法可能是修改导入表并使GetMessage
和PeekMesssage
指向您自己的函数版本,该函数调用实际函数但过滤掉包含您要过滤的键的消息。
更改导入表可能比尝试将应用程序和NOP反汇编出相关分支更容易。这样你只需要一个新的DLL,并且不需要单独的可执行文件来启动应用程序。与目标代码不同,记录了导入表格式。
答案 1 :(得分:0)
我不知道你有多少技能水平,但你可以删除程序中的代码。
以下代码不是特定的GUI环境(MFC或Qt等)。 某些程序可能包含用于处理键盘事件的开关语句。
char inputKey = 'c';
switch(inputKey)
{
case 'c':
//do something
break;
case 'd':
//do something
break;
default:
//do something
}
如果要过滤掉某个键,只需删除switch语句代码中的大小写。
答案 2 :(得分:0)
鉴于它是一个GUI EXE,几乎可以肯定它意味着它是一个Win32可执行文件。密钥作为消息传递给Windows,窗口在WindowProc
处理此类消息。您可以创建包装WindowProc
函数来预处理这些消息并有条件地转发到消息。这称为"subclassing"。