Получение сообщений win32 из Windows.UI.Core.CoreWindow из окон приложения UWP - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь получить сообщения Pointer Win32 определенного окна, перехватывая WH_CALLWNDPROC, WH_CALLWNDPROCRET и WH_GETMESSAGE.

Я использую SetWindowsHookEx в d ++ c ++ для перехватаи получать сообщения.

unsigned long processID = 0;
unsigned long threadID = GetWindowThreadProcessId(hWnd, &processID);

g_hhkGetMsg = SetWindowsHookEx(WH_GETMESSAGE,
    GetMsgProc,
    g_hinstDLL,
    threadID);

Это работает для многих окон, но не для CoreWindow окон UWP.

Каждое окно приложения UWP имеет такую ​​структуру: UWP window structure

Подключение к ApplicationFrameWindow работает правильно, но подключение к Windows.UI.Core.CoreWindow не работает.(SetWindowsHookEx показывает успех, но я не получаю никаких сообщений в обратном вызове)

Тем не менее, Spy ++ может захватывать сообщения из CoreWindow.(CoreWindow получает сообщения WM_POINTER, поэтому мне нужно подписаться на это окно)

Думая, что проблема может быть в моем коде, я также попробовал инструмент с открытым исходным кодом MyLiteSpy чтобы узнать, может ли это захватывать сообщения из CoreWindow.Он не может ничего захватить, как мой пример кода.(Но MyLiteSpy может получать сообщения из ApplicationFrameWindow того же приложения UWP, как и мой код и Spy ++)

enter image description here

Интересно, В этом (старом) блоге о Spy ++ говорится, что они используют те же три хука, что и я и MyLiteSpy, но получают сообщения, которые мой код не может получить.

В чем здесь разница?Есть идеи, почему это происходит?

(Использует ли Spy ++ другие хуки, кроме трех упомянутых? Сообщение в блоге написано в 2007 году, поэтому все могло измениться)

1 Ответ

0 голосов
/ 22 декабря 2018

окна класса Windows.UI.Core.CoreWindow - это обычно иммерсивные окна.чтобы иметь возможность перечислять такие, верхнего уровня, окна, нам нужно иметь disableWindowFiltering в манифесте.он отключает фильтрацию окон, поэтому вы можете перечислять (через EnumWindows) иммерсивные окна с рабочего стола.но произнесите прямой вызов FindWindowW(L"Windows.UI.Core.CoreWindow", L"Start"); - не потерпит неудачу даже без disableWindowFiltering в манифесте.однако эта часть относится только к иммерсивным окнам видимости, через EnumWindows, для вашего приложения.

другой набор задач WH_GETMESSAGE ловушка для таких окон.проблема здесь в том, что эти окна обычно принадлежат процессу приложения Магазина Windows (AppContainer).

Разработка приложения Магазина Windows : если dwThreadId равен нулю, то перехват окнаDLL не загружаются в процессе для процессов приложения Магазина Windows и процесса посредника среды выполнения Windows, если они не установлены с помощью UIAccess процессов (средства специальных возможностей).

, поэтому нам нужноиметь или uiAccess установить значение true в манифесте (скажем, <requestedExecutionLevel level="requireAdministrator" uiAccess="true" />) или нет 0 для dwThreadId при вызове SetWindowsHookEx.dwThreadId, который мы можем получить с помощью GetWindowThreadProcessId

, WH_GETMESSAGE всегда находится в процессе.так что если мы вызываем его для другого процесса - процедура ловушки должна быть расположена в dll, которая будет загружена в целевой процесс.и вот главная проблема - как загрузить dll в процесс приложения Магазина Windows (AppContainer).

Я проверяю это самостоятельно, просто dll - попробуйте установить ловушку для окна Windows.UI.Core.CoreWindow::Calculator.вызов для SetWindowsHookEx(WH_GETMESSAGE, ..) в порядке, а в Calculator.exe вызван LoadLibraryExW для моей библиотеки DLL, но этот вызов завершается ошибкой внутри NtQueryAttributesFile с ошибкой STATUS_ACCESS_DENIED.Хорошо, Appcontainer - очень ограниченный процесс, поэтому я пытаюсь изменить дескриптор безопасности на моей DLL.установите для него значение "D:P(A;;FA;;;BA)(A;;FXFR;;;WD)(A;;FXFR;;;AC)S:P(ML;;NW;;;LW)" (предоставьте полный доступ встроенным (локальным) администраторам и доступ на чтение-выполнение ко всем приложениям, работающим в контексте пакета приложения (SDDL_ALL_APP_PACKAGES - "AC") и каждому ("WD"). с этим LoadLibraryExW идти вперед, но в любом случае произойдет сбой при вызове ZwCreateSection для моей DLL с кодом STATUS_SYSTEM_NEEDS_REMEDIATION (C000047EL - Обнаружена ошибка в двоичном файле системы ), после чегоLdrAppxHandleIntegrityFailure вызывается (экспортированная функция из ntdll.dll )

enter image description here enter image description here

, поэтому длязагрузить DLL в приложение Магазина Windows (Appcontainer), она должна быть подписана. со стороны ядра стек вызовов следующий

CI!KappxpNotifyNonPackagedFile
CI!KappxNotifyIntegrityFailureInPackagedProcess
CI!CipReportAndReprieveUMCIFailure
CI!CiValidateImageHeader
nt!SeValidateImageHeader
nt!MiValidateSectionCreate
nt!MiCreateNewSection
nt!MiCreateImageOrDataSection
nt!MiCreateSection

интересно, что если проверка не удалась CI.DLL внутри KappxpNotifyNonPackagedFile записьимя файла и хэш реестра в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModel\StateChange - BinaryName (REG_SZ) и BinaryHash (REG_BINARY)

enter image description here

вслучай Spyxx - он использует подписанную dll - spyxxhk [_amd64] .dll - эта dll (если разрешить доступ ко всем пакетам приложений) загружается для обработки нормально, поэтому потенциально Spy ++ может собиратьсяct сообщения из приложений Appcontainer тоже.но в моем исследовании Spy ++ вызов SetWindowsHookExW в начале с dwThreadId, установленным в ноль.в результате spyxxhk [_amd64] .dll не будет внедрен в приложения Магазина Windows.нужно каждый раз использовать не 0 dwThreadId и иметь специальный дескриптор безопасности на dll.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...