请允许我澄清一下,这段代码在Windows和Windows7上都是100%工作的,但是,在Windows上,函数VirtualProtectEx
失败了,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值都是常数(在每次执行时都是相同的),但三个操作系统的m_pvTargetAddress值不同
编辑-我通过上下文的GetThreadContex(远程线程) -> Eip获得m_pvTargetAddress
编辑-以下是调用时返回的值VirtualQueryEx:
Windows
Windows 7
Windows
发布于 2013-06-02 07:17:40
我建议您打印出m_pvTargetAddress
值,并通过调试器或ProcessExplorer等方法检查它在目标地址空间中的有效地址,或者在调用VirtualProtectEx
之前调用VirtualQueryEx
来查询地址是否有效。另一件要检查的事情是下面引用的MSDN:
在使用VirtualAlloc或VirtualAllocEx函数调用MEM_RESERVE时,指定区域中的所有页面都必须位于分配的同一保留区域内。页面不能跨越通过使用VirtualAlloc或VirtualAllocEx单独调用MEM_RESERVE而分配的相邻保留区域。
https://stackoverflow.com/questions/16880431
复制相似问题