Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Finding a 3rd party QWidget with injected code & QWidget::find(hwnd)

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.

like image 945
David Menard Avatar asked Jul 23 '09 18:07

David Menard


1 Answers

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

like image 95
David Menard Avatar answered Sep 24 '22 11:09

David Menard