请允许我澄清一下,此代码在 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) -> 上下文的 Eip 获取 m_pvTargetAddress
编辑- 以下是 VirtualQueryEx 在调用时返回的值:
视窗
- 0 - 分配基数
- 0 - 分配保护
- 2088828928 - 基地址
- 1 - 保护
- 983040 - 区域大小
- 65536 - 状态
- 0 - 类型
Windows 7的
- 2003959808 - 分配基地
- 128 - 分配保护
- 2004025344 - 基地址
- 32 - 保护
- 876544 - 区域大小
- 4096 - 状态
- 16777216 - 类型
视窗
- 2006122496 - 分配基地
- 128 - 分配保护
- 2006536192 - 基地址
- 32 - 保护
- 389120 - 区域大小
- 4096 - 状态
- 16777216 - 类型