【问题标题】:VirtualProtectEx function failing - error 487, only on Windows XPVirtualProtectEx 函数失败 - 错误 487,仅在 Windows XP 上
【发布时间】:2013-05-28 15:23:26
【问题描述】:

请允许我澄清一下,此代码在 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) 获取m_pvTargetAddress -> 上下文的Eip

编辑 - 以下是 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 - 类型

【问题讨论】:

  • 请更新您的问题,说明您如何获取目标地址以及它的价值。
  • 好的,等一下。
  • 刚刚添加了我获取地址的方式。

标签: c++ c winapi memory process


【解决方案1】:

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

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

【讨论】:

  • 对不起,我的意思是 VirtualProtectEx,无论如何,有趣的是当我创建挂起的进程时,当我突破程序时,每个操作系统都有不同的内存量 - XP 为 24kb,Vista 为 36kb,以及Windows 7 为 100kb。
  • 我用两个操作系统上的查询结果更新了 OP
  • 输出表明它是 XP 的无效地址
  • 我更新了我的问题并在此处提供了更多详细信息 - stackoverflow.com/questions/16882766/…欢呼
猜你喜欢
  • 1970-01-01
  • 2013-12-07
  • 2015-10-16
  • 2014-02-06
  • 2015-07-18
  • 2011-08-14
  • 2020-07-06
  • 2010-09-23
  • 1970-01-01
相关资源
最近更新 更多