请允许我澄清一下,此代码在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(远程线程)获取m_pvTargetAddress - >轻描淡写
编辑 - 以下是VirtualQueryEx在调用时返回的值:
Windows XP
Windows 7
Windows Vista
答案 0 :(得分:1)
我建议您打印m_pvTargetAddress
值,并检查它是否是目标地址空间中的有效地址,例如:调试器或ProcessExplorer等,或调用VirtualQueryEx
以在调用VirtualProtectEx
之前查询地址是否有效。要检查的另一件事是按照MSDN的引用:
指定区域中的所有页面必须位于相同的保留区域内 调用VirtualAlloc或VirtualAllocEx时分配的区域 功能使用MEM_RESERVE。页面不能跨越相邻的保留 通过单独调用VirtualAlloc或分配的区域 VirtualAllocEx使用MEM_RESERVE。