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

Qt 查找带有注入代码的第三方QWidget&;QWidget::查找(hwnd),qt,dll,hook,code-injection,qwidget,Qt,Dll,Hook,Code Injection,Qwidget,我有一个Qt Dll,我使用windows detours库将其注入第三方应用程序: if(!DetourCreateProcessWithDll( Path, NULL, NULL, NULL, TRUE, CREATE_DEFAULT_ERROR_MODE | CREATE_SUSPENDED, NULL, NULL, &si, &pi, "C:\

我有一个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回调中,我想截获所有属于QWidget的窗口:

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

QWidget* q = QWidget::find(hwnd);
但问题是,返回的指针总是0。我是否没有将代码正确地注入到流程中?还是我没有像应该的那样使用QWidget::find()

谢谢

戴夫


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

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

回答:


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

您可以使用调试器进入
QWidget::find()
,看看
QWidgetPrivate::mapper
是否为
NULL
在CBT_Proc回调中,似乎无法命中断点。。。有没有其他方法来验证这一点?如果是空的,我该怎么办?如果你想知道“他怎么知道代码会被执行?”,我正在控制台中打印。我将QWidget::find()移动到一个导出函数,QWidgetPrivate::mapper为空。>QWidgetPrivate::mapper为空,这就是为什么
QWidget::find()
返回
NULL
。接下来的问题是:1。您正在注入的应用程序是否加载QtGui4.dll,或者是否静态链接到Qt?2.您是静态地将DLL链接到Qt还是在DLL中使用Qt?3.尝试使用调试器或Process Explorer检查正在挂接的进程加载了多少QtGui4.dll副本。我的假设是,进程中有两个Qt副本,您对
QWidget::find()
的调用引用的是目标进程的QApplication未初始化的副本。虽然我可能错了。你在DLL和我的代码中是什么意思?DLL是我的代码David,你能给我发电子邮件吗,ron@silentmusic.net我有一些关于这方面的问题,因为我正试图做一些类似的事情,我被卡住了。谢谢