VirtualProtectEx函数失败-错误487,仅适用于Windows XP
VirtualProtectEx function failing - error 487, only on Windows XP
让我澄清一下,这段代码在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值在每个操作系统上是恒定的(意味着每次执行都是相同的),但在三个操作系统之间是不同的
编辑 -我通过getthreadcontext (Remote thread) -> context的Eip获取m_pvTargetAddress
编辑 -以下是调用VirtualQueryEx时返回的值:
Windows XP
- 0 -分配基数
- 0 -分配保护
- 2088828928 -基址
- 1 -保护
- 983040 -区域大小
- 65536 - state
- 0 - type
- 2003959808 -分配基数
- 128 -分配保护
- 2004025344 -基址
- 32 - protect
- 876544 -区域大小
- 4096 -状态
- 16777216 - type
- 2006122496 -分配基数
- 128 -分配保护
- 2006536192 - Base address
- 32 - protect
- 389120 -区域大小
- 4096 -状态
- 16777216 - type
我建议您打印出m_pvTargetAddress
值,并检查它是否在目标地址空间的有效地址,例如调试器或ProcessExplorer等,或调用VirtualQueryEx
查询地址是否有效VirtualProtectEx
被调用之前。另一件要检查的事情是如下引用来自MSDN:
指定区域的所有页面必须在相同的保留范围内在调用VirtualAlloc或VirtualAllocEx时分配的区域函数使用MEM_RESERVE。页不能跨越相邻的保留通过单独调用VirtualAlloc或VirtualAllocEx使用MEM_RESERVE.
相关文章:
- 在 NVIDIA GEFORCE GTX 1050 上下载适用于 Windows 10 的 openCL 1.2
- 有没有适用于Windows.lib文件的GNU二进制文件描述符(BFD)
- Qt C++macOS问题。我正在使用函数 .find( "a word") 在多集中搜索单词,它适用于 Windows 但不适用于 mac
- 什么是通用运行时组件 #ifdef 适用于Windows(UWP)而不是iOS
- 无法使用Yocto生成适用于Windows的SDK
- 将wchar_t字符串从/传递到本机插件-仅适用于Windows
- 语言选择:适用于Windows应用商店应用程序的C++或C#
- 试图在Visual Studio 6.0上编译PuTTY PSCP(适用于Windows)时出现C++错误RC2104
- 从何处获取适用于 Windows 的lboost_system
- C++适用于Windows,Linux和Mac的简单GUI
- 方法DSA_do_verify和SHA1(适用于Windows的OpenSSL库)
- 适用于Windows应用商店的Facebook SDK
- 仅适用于windows的c++库
- 在C++std::streams中,失败后,如何获得失败原因?必需:线程安全,适用于Windows和Linux(或至少M
- 哪些适用于 Windows 的 C++11 编译器支持新的类型特征,如"is_nothrow_move_constructible"?
- 在哪里可以下载适用于 Windows 的 GCC 4.3.2 二进制文件
- gcc-fdiagnostics颜色是否适用于Windows
- 编译适用于 Windows 7 的 Windows 8 微筛选器驱动程序
- 在 Linux 上使用 GCC 交叉编译适用于 Windows 的 Qt 应用程序
- QApplication::setWindowIcon 适用于 Windows XP,但不适用于 Windows 7