gpt4 book ai didi

windows - GetWindowText 如何在没有系统调用的情况下获取另一个进程拥有的窗口的名称来读取该进程的内存?

转载 作者:可可西里 更新时间:2023-11-01 13:08:30 28 4
gpt4 key购买 nike

我想弄清楚 GetWindowText 背后的系统调用是什么。我编写了一个简单的程序来调用 GetWindowText,并使用不同进程中的窗口句柄。

int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MessageBox(0,"Attach debugger and set bp","on GetWindowTextA",0);

HWND winmine = FindWindow(NULL,"Minesweeper");

if(winmine != NULL)
{
char buf[255] = "";
GetWindowTextA(winmine, buf, 254);
MessageBox(0,buf,"Found",0);
}
else
{
MessageBox(0,"?","Found nothing",0);
}

return 0;
}

我附加了一个调试器并单步执行 GetWindowTextA 调用,手动单步执行除这些 API 调用之外的所有内容(按顺序):

  • GetWindowThreadProcessId(在 GetWindowLong 中)
  • 互锁增量
  • WCSToMBEx(基本上是 WideCharToMultiByte)
  • 互锁递减

这些 API 调用似乎都无法读取不属于调用进程的内存中的字符串。我使用了一个用户模式调试器,所以我当然不会在没有意识到的情况下单步进入内核模式。这意味着 GetWindowText 无需执行上下文切换即可获取窗口名称。这似乎意味着每个存在的窗口的文本都可以在没有上下文切换的情况下访问。这是不正确的,因为 Windows 无法为系统上的每个窗口/控件保留文本的副本,在每个单一进程。

我已阅读 this article .它提到窗口名称存储在引号“一个特殊的地方”,但没有解释如何在不进行系统调用/上下文切换的情况下从不同的进程访问这个“特殊的地方”。

所以我正在寻找有关如何完成的任何解释。非常感谢您提供的任何信息。

最佳答案

GetWindowText got the window name without performing a context switch. Which seems to imply that the text for every window that exists is accessible without a context switch.

此信息存储在所有使用 user32.dll 的进程之间共享的内存中。您可以尝试在您进程的虚拟空间中搜索其他进程窗口的 unicode 名称。

它在 user32.dll 加载期间被映射到进程地址空间。涉及一些内核结构/部分:win32k!gSharedInfowin32k!ghSectionSharedwin32k!gpsi 和其他(我不知道)的)。

实际上,HWND 的低 16 位表示基地址为 *(&user32!gSharedInfo + 1) 的窗口信息数组的索引。此窗口信息的第一个字段是另一个包含所有共享窗口信息的结构的内核地址。减去该部分的内核地址与其用户空间映射(存储在 TEB!Win32ClientInfo 中)之间的差异,您可以获得相关信息。

user32!ValidateHwnd 是将窗口句柄转换成这个地址的函数,可以被 user32!DefWindowProcWorker 等内部 user32 函数使用。

GetWindowTextW 的伪代码如下(不包括错误处理):

    GetWindowTextW(HWND hwnd, wchar_t* buf, int size)
{
inner_hwnd = ValidateHwnd(hwnd);
if (TestWindowProcess(inner_hwnd))
SendMessageWorker(inner_hwnd, WM_GETTEXT, size, buf, FALSE);
else
DefWindowProcWorker(inner_hwnd, WM_GETTEXT, size, buf, FALSE);
}

DefWindowProcWorker 在您的情况下使用 WM_GETTEXT 调用,它只会解析 inner_hwnd 引用的结构并将窗口的名称复制到 buf


it seems that the text for EDITTEXT controls are not stored in this manner

我从来不知道存储在那里的所有信息,尽管不使用各种 user/gdi 参数污染进程的虚拟空间似乎是一个不错的选择.此外,完整性较低的进程不应该能够获得较高完整性进程的敏感信息。

关于windows - GetWindowText 如何在没有系统调用的情况下获取另一个进程拥有的窗口的名称来读取该进程的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21508662/

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