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