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 - TypWindows 7
2003959808 - Zuordnungsbasis128 - Zuweisungsschutz2004025344 - Basisadresse32 - schützen876544 - Regionsgröße4096 - Zustand16777216 - TypWindows Vista
2006122496 - Zuordnungsbasis128 - Zuweisungsschutz2006536192 - Basisadresse32 - schützen389120 - Regionsgröße4096 - Zustand16777216 - TypWarum 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.