1

请允许我澄清一下,此代码在 Windows Vista 和 Windows 7 上 100% 有效,但是,该功能VirtualProtectEx 在 Windows XP 上失败,GetLastError()代码为 487 - ERROR_INVALID_ADDRESS。

这是相关的功能:

int HpRemoteHookInstall(__in HANDLE m_hProcess, __in LPVOID m_pvTargetAddress, __in LPVOID m_pvRedirectAddress) {
// Misc checks
if ( m_pvTargetAddress == NULL || m_pvRedirectAddress == NULL )
{
    return -1;
}

DWORD  m_dwOldRights         = NULL;
BYTE   m_btHotPatch[7];

ZeroMemory(m_btHotPatch, sizeof(m_btHotPatch));

    // m_hProcess - remote process
// m_pvTargetAddress - remote base
// Allow write access - code will be restored later on
if ( VirtualProtectEx(m_hProcess, (LPVOID)m_pvTargetAddress, 6, PAGE_EXECUTE_READWRITE, &m_dwOldRights) == FALSE )
{
    DisplayError(); // displays getlasterror function in messagebox
    return -2;
}

我可能做错了什么?感谢您的时间。

编辑- m_pvTargetAddress 值在每个操作系统上都是恒定的(意味着每次执行都相同),但在三个操作系统之间有所不同

编辑- 我通过 GetThreadContex(Remote thread) -> 上下文的 Eip 获取 m_pvTargetAddress

编辑- 以下是 VirtualQueryEx 在调用时返回的值:

视窗

  • 0 - 分配基数
  • 0 - 分配保护
  • 2088828928 - 基地址
  • 1 - 保护
  • 983040 - 区域大小
  • 65536 - 状态
  • 0 - 类型

Windows 7的

  • 2003959808 - 分配基地
  • 128 - 分配保护
  • 2004025344 - 基地址
  • 32 - 保护
  • 876544 - 区域大小
  • 4096 - 状态
  • 16777216 - 类型

视窗

  • 2006122496 - 分配基地
  • 128 - 分配保护
  • 2006536192 - 基地址
  • 32 - 保护
  • 389120 - 区域大小
  • 4096 - 状态
  • 16777216 - 类型
4

1 回答 1

1

我建议您打印出该m_pvTargetAddress值,并通过例如调试器或 ProcessExplorer 等检查它是否是目标地址空间中的有效地址,或者在调用VirtualQueryEx之前调用查询该地址是否有效VirtualProtectEx。要检查的另一件事是 MSDN 的以下引用:

指定区域中的所有页面必须位于使用 MEM_RESERVE 调用 VirtualAlloc 或 VirtualAllocEx 函数时分配的同一保留区域内。这些页面不能跨越通过使用 MEM_RESERVE 单独调用 VirtualAlloc 或 VirtualAllocEx 分配的相邻保留区域。

于 2013-06-02T07:17:40.817 回答