Qt编写钩子库遇到问题。

xiaobingcaicai 2016-05-05 02:36:38
使用qt mingw 编写键盘钩子。遇到点问题。
用到的接口是windows的SetWindowsHookEx,hook的是WH_KEYBOARD事件,已经封装成了一个DLL,现在却不能做到hook全局的键盘事件。
现在是调用这个库的主程序中的键盘事件可以抓取到,试了下在记事本和word中输入文字也可以抓取到,但是其他程序中的键盘事件却不行。
我用同样的方法,使用vs编译了一个库却可以在任意程序中输入信息都能抓到键盘事件。(qq的输入框输入数字可以抓到,输入汉字不行,怀疑是qq有什么保护机制。)

以下为qt封的dll库的 hook部分的代码。

在线等回复。
-------------------------------------------------

HINSTANCE g_dllHinst __attribute__((section(".lucifd"))) = NULL;
HHOOK g_keyHook __attribute__((section(".lucifd"))) = NULL;
HWND g_caller __attribute__((section(".lucifd"))) = NULL;

HookHandler::HookHandler(QObject *parent) : QObject(parent)
{

}
HMODULE ModuleFromAddress(PVOID pv)
{
MEMORY_BASIC_INFORMATION mbi;
if(VirtualQuery(pv,&mbi,sizeof(mbi)) != 0)
{
return (HMODULE)mbi.AllocationBase;
}
else
{
return NULL;
}
}
void HookHandler::installHook(HWND caller, DWORD threadid, void *fun, HINSTANCE hins, WINBOOL stop)
{
g_keyHook = SetWindowsHookEx(WH_KEYBOARD,KeyBoardProc,ModuleFromAddress((PVOID)KeyBoardProc),threadid);
g_dllHinst = hins;
g_caller = caller;
}
LRESULT KeyBoardProc(int ncode, WPARAM wParam, LPARAM lParam)
{
qDebug()<<"dll key input";
if (ncode < 0 || ncode == HC_NOREMOVE)
{
return ::CallNextHookEx(g_keyHook, ncode, wParam, lParam);
}
if (lParam & 0x40000000) // Check the previous key state
{
return ::CallNextHookEx(g_keyHook, ncode, wParam, lParam);
}
::PostMessage(g_caller,WM_USER+101,wParam,lParam);
return ::CallNextHookEx(g_keyHook, ncode, wParam, lParam);

...全文
187 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaobingcaicai 2016-05-05
  • 打赏
  • 举报
回复
引用 2 楼 A289672082 的回复:
编写钩子库会把DLL依赖的所有非系统DLL统统注入进去。你使用Qt 这个钩子会注入大概30多兆的Qt依赖库!所以十分不稳定。 写钩子库一般都使用纯win32 ,否则必须会出稳定性问题。 QQ几百年前就防止钩子注入,你关掉杀毒,QQ有驱动防御,这个老花样都能注入的花,qq技术员吃4了
这意思,还是用vs编写更靠谱一些吧。 写这个并不是要监控qq的,自己开发的两个应用 会对其中的一些输入设备做些预处理,扫码枪或者其他小键盘。可能在全局也可能在应用程序内。 谢谢你的建议。
A289672082 2016-05-05
  • 打赏
  • 举报
回复
编写钩子库会把DLL依赖的所有非系统DLL统统注入进去。你使用Qt 这个钩子会注入大概30多兆的Qt依赖库!所以十分不稳定。 写钩子库一般都使用纯win32 ,否则必须会出稳定性问题。 QQ几百年前就防止钩子注入,你关掉杀毒,QQ有驱动防御,这个老花样都能注入的花,qq技术员吃4了
xiaobingcaicai 2016-05-05
  • 打赏
  • 举报
回复
有人看到么?

16,173

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧