查找带有注入代码的第三方 QWidget QWidget::find(hwnd)

发布于 2024-07-28 22:19:37 字数 1173 浏览 12 评论 0原文

我有一个 Qt Dll,我使用 windows detours 库注入到第三方应用程序中:

if(!DetourCreateProcessWithDll( Path, NULL, NULL, NULL, TRUE, 
                                CREATE_DEFAULT_ERROR_MODE | CREATE_SUSPENDED, NULL, NULL,
                                &si, &pi, "C:\\Program Files\\Microsoft Research\\Detours Express 2.1\\bin\\detoured.dll",
                                "C:\\Users\\Dave\\Documents\\Visual Studio 2008\\Projects\\XOR\\Debug\\XOR.dll", NULL))

然后我设置一个系统范围的钩子来拦截窗口创建:

HHOOK h_hook = ::SetWindowsHookEx(WH_CBT, (HOOKPROC)CBTProc, Status::getInstance()->getXORInstance(), 0);

其中 XOR 是我的程序名称,Status::getInstance() 是单例我保存全局变量的地方。

在我的 CBTProc 回调中,我想拦截所有 QWidgets 窗口:

HWND hwnd= FindWindow(L"QWidget", NULL);

效果很好,因为我得到了相应的 HWND (我用 Spy++ 检查过) 然后,我想获得一个指向 QWidget 的指针,这样我就可以使用它的函数:

QWidget* q = QWidget::find(hwnd);

但问题是,返回的指针始终为 0。我是否没有正确地将代码注入到进程中? 或者我没有像我应该的那样使用 QWidget::find() ?

谢谢,

Dave

编辑:如果我将 QWidget::find() 函数更改为我的 DLL 的导出函数,在设置挂钩后(以便我可以设置和捕获断点),QWidgetPrivate::mapper 为 NULL。

I have a Qt Dll wich I inject into a third-party Application using windows detours library:

if(!DetourCreateProcessWithDll( Path, NULL, NULL, NULL, TRUE, 
                                CREATE_DEFAULT_ERROR_MODE | CREATE_SUSPENDED, NULL, NULL,
                                &si, &pi, "C:\\Program Files\\Microsoft Research\\Detours Express 2.1\\bin\\detoured.dll",
                                "C:\\Users\\Dave\\Documents\\Visual Studio 2008\\Projects\\XOR\\Debug\\XOR.dll", NULL))

and then I set a system-wide hook to intercept window creation:

HHOOK h_hook = ::SetWindowsHookEx(WH_CBT, (HOOKPROC)CBTProc, Status::getInstance()->getXORInstance(), 0);

Where XOR is my programs name, and Status::getInstance() is a Singleton where I keep globals.

In my CBTProc callback, I want to intercept all windows that are QWidgets:

HWND hwnd= FindWindow(L"QWidget", NULL);

which works well, since I get a corresponding HWND (I checked with Spy++)
Then, I want to get a pointer to the QWidget, so I can use its functions:

QWidget* q = QWidget::find(hwnd);

but here's the problem, the returned pointer is always 0. Am I not injecting my code into the process properly? Or am I not using QWidget::find() as I should?

Thanks,

Dave

EDIT:If i change the QWidget::find() function to an exported function of my DLL, after setting the hooks (so I can set and catch a breakpoint), QWidgetPrivate::mapper is NULL.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

萌无敌 2024-08-04 22:19:37

回答:

愚蠢的错误,我是在调试中编译的,所以加载的是 QtGui4d.dll 和 QtCore4d.dll,而不是 QtCore4.dll 和 QtGui.dll

Answered:

Stupid mistake, I was compiling in Debug, so it was QtGui4d.dll and QtCore4d.dll that where loading, not QtCore4.dll and QtGui.dll

待天淡蓝洁白时 2024-08-04 22:19:37

比较 DLL 和代码中`QWidgetPrivate::mapper 的地址。 特别是。 如果一个是静态链接的,则可能有它的两个实例,每个实例都有自己的、不相交的一组小部件。

Compare the addresses of `QWidgetPrivate::mapper in the DLL and in your code. Esp. if one is linked statically, there might be two instance of it, each with it's own, disjoint, set of widgets.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文