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 - typSystem Windows 7
2003959808 - baza alokacji128 - ochrona przydziału2004025344 - adres podstawowy32 - chroń876544 - rozmiar regionu4096 - stan16777216 - typWindows Vista
2006122496 - baza alokacji128 - ochrona przydziału2006536192 - Adres podstawowy32 - chroń389120 - rozmiar regionu4096 - stan16777216 - typDlaczego 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ć.