首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >VirtualProtectEx函数失败-错误487,仅在Windows上

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

Stack Overflow用户
提问于 2013-06-02 06:40:06
回答 1查看 3K关注 0票数 1

请允许我澄清一下,这段代码在Windows和Windows7上都是100%工作的,但是,在Windows上,函数VirtualProtectEx失败了,GetLastError()代码为487 - ERROR_INVALID_ADDRESS。

下面是相关的函数:

代码语言:javascript
运行
复制
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值都是常数(在每次执行时都是相同的),但三个操作系统的m_pvTargetAddress值不同

编辑-我通过上下文的GetThreadContex(远程线程) -> Eip获得m_pvTargetAddress

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

Windows

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

Windows 7

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

Windows

  • 2006122496 -分配基数
  • 128 -分配保护
  • 2006536192 -基本地址
  • 32 -保护
  • 389120 -区域大小
  • 4096 -州
  • 16777216型
EN

回答 1

Stack Overflow用户

发布于 2013-06-02 07:17:40

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16880431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档