【发布时间】: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