VirtualProtectEx函数失败-错误487,仅适用于Windows XP

VirtualProtectEx function failing - error 487, only on Windows XP

本文关键字:适用于 Windows XP 函数 失败 错误 VirtualProtectEx      更新时间:2023-10-16

让我澄清一下,这段代码在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值在每个操作系统上是恒定的(意味着每次执行都是相同的),但在三个操作系统之间是不同的

编辑 -我通过getthreadcontext (Remote thread) -> context的Eip获取m_pvTargetAddress

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

Windows XP

  • 0 -分配基数
  • 0 -分配保护
  • 2088828928 -基址
  • 1 -保护
  • 983040 -区域大小
  • 65536 - state
  • 0 - type
Windows 7

  • 2003959808 -分配基数
  • 128 -分配保护
  • 2004025344 -基址
  • 32 - protect
  • 876544 -区域大小
  • 4096 -状态
  • 16777216 - type
Windows Vista

  • 2006122496 -分配基数
  • 128 -分配保护
  • 2006536192 - Base address
  • 32 - protect
  • 389120 -区域大小
  • 4096 -状态
  • 16777216 - type

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

指定区域的所有页面必须在相同的保留范围内在调用VirtualAlloc或VirtualAllocEx时分配的区域函数使用MEM_RESERVE。页不能跨越相邻的保留通过单独调用VirtualAlloc或VirtualAllocEx使用MEM_RESERVE.