0

我正在尝试读取另一个进程拥有的 Win32 ListView 中的数据。不幸的是,我的 WriteProcessMemory() 调用失败并出现错误“此系统不支持此函数”。当我在 VirtualAlloc() 调用中为基地址指定“NULL”时。但是,如果我将 VirtualAlloc() 地址偏移了某个“神奇”值,而这些值我很幸运并在沮丧的时刻随机选择,那么该调用在我的系统上有效,但在其他系统上失败。(见下面的代码)

任何人都可以建议这个神奇的抵消对我有什么作用吗?通过反复试验,我可以找到适用于特定系统的值,但我找不到此问题的通用解决方案。

谢谢,保罗

#define MAGIC_OFFSET (DWORD)0x01020000

LVHITTESTINFO hti   = { 0 };
hti.pt              = clientPoint;

LPVOID lpBuffer = ::VirtualAlloc( NULL, 1, MEM_RESERVE, PAGE_READWRITE );
::VirtualFree( lpBuffer, 0, MEM_RELEASE );

lpBuffer = ::VirtualAlloc( (LPVOID)((DWORD)lpBuffer + MAGIC_OFFSET), sizeof( hti ), MEM_RESERVER, PAGE_READWRITE );
DWORD dwBuffer = (DWORD)lpBuffer + MAGIC_OFFSET - sizeof( hti );

if( !::WriteProcessMemory( hProcess, (LPVOID)dwBuffer, (LPVOID)&hti, sizeof( hti ), NULL ) )
    return 0;

if( ListView_HitTest( hWndListView, (LPVOID)dwBuffer ) < 0 )
    return 0;

if( !::ReadProcessMemory( hProcess, (LPVOID)dwBuffer, (LPVOID)&hti, sizeof( hti ), NULL ) )
    return 0;

::VirtualFree( lpBuffer, 0, MEM_RELEASE );

澄清(由 Cd-MaN 添加):这是在 Windows Mobile 平台上,可能是非 x86 架构。所以情况可能会有所不同(ARM处理器中是否有单独的地址空间?)。

4

3 回答 3

3

与其尝试在另一个进程中分配内存,不如使用命名共享内存。本文将带您了解共享内存的基本设置,并快速检查以确保Windows Mobile 5支持这些功能。

于 2008-11-11T18:53:42.493 回答
2

VirtualAlloc 在的地址空间中分配内存。在写入另一个进程的内存空间时使用该地址是绝对无效的。您应该改用VirualAllocEx并传入 hProcess。

当它起作用时,您只是幸运并在一些随机的内存上乱涂乱画。

如果在查询另一个进程时不支持为 VirtualAllocEx 的第一个参数指定 NULL(不知道它是否存在)......那么您可以使用VirtualQueryEx来映射另一个进程的地址空间和找到一个有效的空闲区域以传递给 VirtualAlloc。

您可能不得不将其置于重试循环中,因为在您寻找空位时,其他进程地址空间的状态可能会发生变化。

于 2008-11-11T15:06:48.720 回答
0

您必须记住,您正在写入程序的虚拟地址空间。在 Windows 上,它通常从一个地址开始,比如你的幻数。

你调试过程序吗?地址是什么样的?

在我的系统上,可执行文件通常在 00400000 或 01000000 左右加载。它从可执行文件更改为可执行文件,我相信即使在连续运行同一可执行文件时 Windows 也有能力更改此地址。

此外,可执行文件的部分有自己的(并且相对较小的)偏移量。例如,代码部分通常在 +1000 左右,然后是数据、归零数据部分等。

这一切的意思是,如果您的可执行文件的基数为 00400000,并且其数据部分的偏移量为 +2000,则数据的第一个字节将位于 00402000。为了读取/写入此字节,您必须指定基地址 00402000,不是 2000,也绝对不是 0。

尝试打印指针的值。如果指向的对象具有静态生命周期,它可能会驻留在数据部分中,并且您将获得类似 00402000 的地址。然后,如果您将进程内存写入该地址,您将修改该对象。

各种 Win32 可执行格式都包含这个“0040000”基地址以及各个部分的偏移量,但是由于这种读取​​另一个进程的内存的黑客可能会针对特定可执行文件的特定版本,所以你可能会更好只留下幻数。

于 2008-11-11T15:23:46.377 回答