[英]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
Windows 7的
Windows Vista
我建议您打印出m_pvTargetAddress
值,并通过调试器或ProcessExplorer等检查其在目标地址空间中的有效地址,或在调用VirtualProtectEx
之前调用VirtualQueryEx
来查询该地址是否有效。 要检查的另一件事是来自MSDN的以下引用:
使用MEM_RESERVE调用VirtualAlloc或VirtualAllocEx函数时,指定区域中的所有页面必须在分配的同一保留区域内。 这些页面不能跨越通过使用MEM_RESERVE单独调用VirtualAlloc或VirtualAllocEx分配的相邻保留区域。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.