Nowo utworzony EIP zawieszonego procesu nie działa tylko w systemie Windows XP - EIP pod obrazem kernal32.dll?

Mój program działa bez zarzutu w systemach Windows Vista Ultimate i Windows 7, jednak nie działa w systemie Windows XP.

Po pierwsze, moja aplikacja tworzy proces pliku systemowego, wywołuje GetThreadContext (remote_thread) i ustawia wartość LPVOID w kontekście wartości-> Eip, a następnie sprawdza wartości w strukturze MEMORY_BASIC_INFORMATION z VirtualQueryEx.

Oto wartości zwrócone przez VirtualQueryEx po wywołaniu:

Windows XP

0 - baza alokacji0 - ochrona przydziału2088828928 - adres podstawowy1 - chroń983040 - rozmiar regionu65536 - stan0 - typ

System Windows 7

2003959808 - baza alokacji128 - ochrona przydziału2004025344 - adres podstawowy32 - chroń876544 - rozmiar regionu4096 - stan16777216 - typ

Windows Vista

2006122496 - baza alokacji128 - ochrona przydziału2006536192 - Adres podstawowy32 - chroń389120 - rozmiar regionu4096 - stan16777216 - typ

Dlaczego po uruchomieniu aplikacji w systemie Windows XP nie ma bazy alokacji ani ochrony przydziału, a także zupełnie innych wartości dla systemów Windows 7 i Windows Vista.

Planuję użyć VirtualProtectEx na adresie (kontekst-> Eip), więc jeśli są to wartości na XP, to VirtualProtectEx nieuchronnie zawiedzie, ponieważ miałbym dostęp do niedostępnej pamięci.

Oto jak tworzę swój proces:

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

Faktem jest, że działa to bez zarzutu zarówno w systemie Windows 7, jak i Windows Vista.

Czy czegoś tu brakuje? Dziękuję za pomoc.

EDYCJA - Oto zdjęcie:

 Oto obraz dwóch instancji olly uruchamiających plik wykonywalny, jeden na maszynie wirtualnej XP, jeden na zewnątrz. Z tego co zauważyłem, obraz XP (na dole) ma swój EIP ustawiony na ModuleEntryPoint, podczas gdy instancja Windows 7 ma ustawiony na ntdll ..

Zbadałem dalej i odkryłem, że EIP był w rzeczywistości w obrazie kernel32.dll (w systemie Windows XP), a nie w ntdll.dll, jak powinno być.

questionAnswers(2)

yourAnswerToTheQuestion