주입 된 코드와 QWIDGET을 사용하여 제 3 자 QWIDGET 찾기 :: 찾기 (HWND)
-
19-09-2019 - |
문제
Windows Detours Library를 사용하여 타사 응용 프로그램에 주입하는 QT DLL Wich가 있습니다.
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은 내 프로그램 이름이고 상태 :: getInstance ()는 글로벌을 유지하는 싱글 톤입니다.
CBTPROC 콜백에서 QWIDGET 인 모든 Windows를 가로 채고 싶습니다.
HWND hwnd= FindWindow(L"QWidget", NULL);
해당 HWND (Spy ++로 확인)를 받기 때문에 잘 작동합니다. 그런 다음 QWIDGET에 대한 포인터를 얻고 싶습니다. 따라서 그 기능을 사용할 수 있습니다.
QWidget* q = QWidget::find(hwnd);
그러나 여기에 문제가 있습니다. 반환 된 포인터는 항상 0입니다. 코드를 프로세스에 올바르게 주입하지 않습니까? 아니면 qwidget :: find ()를 사용하지 않습니까?
감사,
데이브
편집 : qwidget :: find () 함수를 내 DLL의 내보내기 함수로 변경하면 후크를 설정 한 후 (따라서 중단 점을 설정하고 잡을 수 있음) qwidgetPrivate :: Mapper는 NULL입니다.
해결책
답변 :
멍청한 실수, 나는 디버그에서 컴파일하고 있었기 때문에 qtgui4d.dll 및 qtcore4d.dll이었던 qtgui4d.dll 및 qtcore4d.dll은 qtcore4.dll 및 qtgui.dll이 아닌 로딩하는 곳이었습니다.
다른 팁
DLL과 코드에서`qwidgetPrivate :: Mapper의 주소를 비교하십시오. ESP. 하나가 정적으로 연결되어 있으면 두 개의 인스턴스가있을 수 있으며, 각각 고유 한 위젯 세트가 있습니다.