Neu erstellte EIP des angehaltenen Prozesses schlägt nur unter Windows XP fehl - EIP unter kernal32.dll-Image?

Mein Programm funktioniert unter Windows Vista Ultimate und Windows 7 einwandfrei, unter Windows XP schlägt es jedoch fehl.

Zuerst erstellt meine Anwendung einen Prozess einer Systemdatei, ruft GetThreadContext (remote_thread) auf, setzt einen LPVOID-Wert auf den Wert context-> Eip und überprüft dann die Werte in der Struktur MEMORY_BASIC_INFORMATION, die von VirtualQueryEx festgelegt wurde.

Hier sind die Werte, die VirtualQueryEx beim Aufruf zurückgibt:

Windows XP

0 - Zuordnungsbasis0 - Zuweisungsschutz2088828928 - Basisadresse1 - schützen983040 - Regionsgröße65536 - Bundesstaat0 - Typ

Windows 7

2003959808 - Zuordnungsbasis128 - Zuweisungsschutz2004025344 - Basisadresse32 - schützen876544 - Regionsgröße4096 - Zustand16777216 - Typ

Windows Vista

2006122496 - Zuordnungsbasis128 - Zuweisungsschutz2006536192 - Basisadresse32 - schützen389120 - Regionsgröße4096 - Zustand16777216 - Typ

Warum hat meine Anwendung, wenn sie unter Windows XP ausgeführt wird, keine Zuordnungsbasis und keinen Zuordnungsschutz sowie völlig andere Werte als Windows 7 und Windows Vista?

Ich plane, VirtualProtectEx für die Adresse zu verwenden (context-> Eip). Wenn dies also die Werte unter XP sind, schlägt VirtualProtectEx unvermeidlich fehl, da ich auf nicht zugreifbaren Speicher zugreifen würde.

So erstelle ich meinen Prozess:

    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;
        }

Tatsache ist: Dies funktioniert sowohl unter Windows 7 als auch unter Windows Vista einwandfrei.

Fehlt mir hier etwas? Vielen Dank für jede Hilfe.

BEARBEITEN - Hier ein Bild:

 Hier ist ein Bild von zwei Instanzen von olly, auf denen die ausführbare Datei ausgeführt wird, eine in der virtuellen XP-Maschine und eine außerhalb. Soweit ich weiß, ist für das XP-Bild (unteres Bild) EIP auf ModuleEntryPoint und für die Windows 7-Instanz auf ntdll festgelegt.

Ich recherchierte weiter und fand heraus, dass das EIP tatsächlich im kernel32.dll-Image (unter Windows XP) und nicht in der ntdll.dll war, wie es sein sollte.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage