我的程序在 Windows Vista Ultimate 和 Windows 7 上完美运行,但在 Windows XP 上却失败了。
首先,我的应用程序创建一个系统文件的进程,它调用 GetThreadContext(remote_thread) 并将 LPVOID 值设置为值 context->Eip,然后检查从 VirtualQueryEx 设置的结构 MEMORY_BASIC_INFORMATION 中的值。
以下是 VirtualQueryEx 在调用时返回的值:
视窗
- 0 - 分配基数
- 0 - 分配保护
- 2088828928 - 基地址
- 1 - 保护
- 983040 - 区域大小
- 65536 - 状态
- 0 - 类型
Windows 7的
- 2003959808 - 分配基地
- 128 - 分配保护
- 2004025344 - 基地址
- 32 - 保护
- 876544 - 区域大小
- 4096 - 状态
- 16777216 - 类型
视窗
- 2006122496 - 分配基地
- 128 - 分配保护
- 2006536192 - 基地址
- 32 - 保护
- 389120 - 区域大小
- 4096 - 状态
- 16777216 - 类型
为什么当我在 Windows XP 上运行我的应用程序时,它没有分配基础和分配保护,以及与 Windows 7 和 Windows Vista 完全不同的值。
我计划在地址(上下文-> Eip)上使用 VirtualProtectEx,所以如果这些是 XP 上的值,那么 VirtualProtectEx 将不可避免地失败,因为我将访问无法访问的内存。
这是我创建流程的方式:
if ( CreateProcessW(m_pwszContainerPath, NULL, NULL, NULL, FALSE, DETACHED_PROCESS | CREATE_SUSPENDED, NULL, NULL, &m_stStartInfo, &m_stProcessHandles) == TRUE )
{
// Get context of thread
m_stContext.ContextFlags = CONTEXT_FULL;
if ( GetThreadContext(m_stProcessHandles.hThread, &m_stContext) == FALSE )
goto _CLEANUP;
// Grab, Eip
m_pvLdrInitEip = (LPVOID)m_stContext.Eip;
}
事实是:这在 Windows 7 和 Windows Vista 上都能完美运行。
我在这里缺少什么吗?感谢您的任何帮助。
编辑 - 这是一张照片:
这是 olly 运行可执行文件的两个实例的图片,一个在 XP 虚拟机中,一个在外部。据我所知,XP 图片(下一张)将 EIP 设置为 ModuleEntryPoint,而 Windows 7 实例将其设置为 ntdll..
我进一步调查,发现 EIP 实际上是 kernel32.dll 映像(在 Windows XP 上),而不是应该的 ntdll.dll。