繁体   English   中英

VirtualProtectEx函数失败-错误487,仅在Windows XP上

[英]VirtualProtectEx function failing - error 487, only on Windows XP

请允许我澄清一下,此代码在Windows Vista和Windows 7上可以100%正常运行,但是,在Windows XP上, GetLastError()代码为487-ERROR_INVALID_ADDRESS的功能VirtualProtectEx失败。

这是相关的功能:

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值:

Windows XP

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

Windows 7的

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

Windows Vista

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM