gpt4 book ai didi

c# - 从 UWP 应用程序窗口的 Windows.UI.Core.CoreWindow 获取 win32 消息

转载 作者:行者123 更新时间:2023-11-30 22:57:05 27 4
gpt4 key购买 nike

我正在尝试通过 WH_CALLWNDPROC 上的 Hook 获取特定窗口的 Pointer Win32 消息, WH_CALLWNDPROCRETWH_GETMESSAGE .

我使用 SetWindowsHookEx在 c++ dll 中挂接和接收消息。

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 能够从同一 UWP 应用程序的 ApplicationFrameWindow 获取消息,我的代码和 Spy++ 也可以)

enter image description here

有趣的是,this (old) blog post关于 Spy++ 说他们使用与我和 MyLiteSpy 相同的三个钩子(Hook),但它收到的消息是我的代码无法接收的。

这里有什么区别?知道为什么会这样吗?

(Spy++ 是否使用上述三个以外的钩子(Hook)?博文写于 2007 年,所以情况可能有所改变)

最佳答案

Windows.UI.Core.CoreWindow 类的窗口通常是沉浸式窗口。为了能够枚举这样的顶级窗口,我们需要 disableWindowFiltering在 list 中。它禁用窗口过滤,因此您可以从桌面枚举(通过 EnumWindows )沉浸式窗口。但是说直接调用FindWindowW(L"Windows.UI.Core.CoreWindow", L"Start"); - 即使 list 中没有 disableWindowFiltering 也不会失败。然而,这部分仅与可见性沉浸式窗口有关,来自 EnumWindows , 为您的应用。

另一个任务集 WH_GETMESSAGE Hook 这样的 window 。这里的问题是这个窗口通常属于 Windows 应用商店应用程序 (AppContainer) 进程。

Windows Store app development: If dwThreadId is zero, then window hook DLLs are not loaded in-process for the Windows Store app processes and the Windows Runtime broker process unless they are installed by either UIAccess processes (accessibility tools).

所以我们需要有或uiAccess在 list 中设置为 true(例如 <requestedExecutionLevel level="requireAdministrator" uiAccess="true" />)或不为 dwThreadId 设置为 0通话中 SetWindowsHookEx . dwThreadId我们可以通过 GetWindowThreadProcessId 得到

WH_GETMESSAGE 钩子(Hook)总是在进程钩子(Hook)上。所以如果我们为另一个进程调用它 - 钩子(Hook)过程必须位于 dll 中,它将被加载到目标进程。这是主要问题 - 如何将 dll 加载到 Windows 应用商店应用程序 (AppContainer) 进程。

我用自己简单的 dll 检查这个 - 尝试为 Windows.UI.Core.CoreWindow::Calculator 设置 Hook window 。电话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 继续,但是无论如何,我的 DLL 调用 ZwCreateSection 失败,代码为 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 inside 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++ 也可以从 Appcontainer 应用程序收集消息。但在我的研究中 Spy++ 调用 SetWindowsHookExWdwThreadId开头设置为零。因此 spyxxhk[_amd64].dll 将不会注入(inject)到 Windows 应用商店应用程序中。每次都需要使用非 0 dwThreadId 并且在 dll 上有特殊的安全描述符。

关于c# - 从 UWP 应用程序窗口的 Windows.UI.Core.CoreWindow 获取 win32 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53873390/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com