2010-02-19 16 views
5

To jest dziwne. Wcześniej, z systemem Windows 7 x64, miałem problem z wywołaniem Win32 OpenProcess przeciwko procesom 64-bitowym. Googli trochę i doszli do wniosku, że tak się nie stanie.OpenProcess na obrazach x64 z aplikacji Win32

Potem wydarzyła się zabawna rzecz. Próbowałem go przeciwko ID procesu dla explorer.exe, i święte karpie, zadziałało! Zaczęło się wrzucać do niego inne identyfikatory procesów, a to po prostu cholerny crapshoot.

Jak się okazuje, mogę zadzwonić OpenProcess na dużą liczbę procesów x64 - Explorer iType, Ipoint, taskhost, cmd, mstsc, ..., itd

A inni pop 5 (Odmowa dostępu) - winlogon, csrss, services, svchost, mdm, ...

Potwierdzam "bitness" i identyfikator procesu za pomocą Process Explorer. Ponadto wywoływanie funkcji GetModuleFileNameEx w procesach 64-bitowych zawsze kończy się niepowodzeniem, dzięki czemu oferuje podwójną kontrolę w trybie 32/64.

Jest to kod:

' Get a handle to the process. 
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, ProcessID) 
If hProcess Then 
    ' Grab the filename for base module. 
    nChars = GetModuleFileNameEx(hProcess, 0, Buffer, Len(Buffer)) 
    ' If running in x64, http://winprogger.com/?p=26 
    If Err.LastDllError = ERROR_PARTIAL_COPY Then 
     nChars = GetProcessImageFileName(hProcess, Buffer, Len(Buffer)) 
    End If 
    ' Truncate and return buffer. 
    If nChars Then 
     GetProcessFileName = Left$(Buffer, nChars) 
    End If 
    Call CloseHandle(hProcess) 
Else 
    Debug.Print "LastDllError:"; Err.LastDllError 
End If 

Nic nadzwyczajnego. Po prostu chcesz zapytać procesy o takie rzeczy jak nazwa pliku lub czas procesu. Czy ktoś ma pojęcie, co odróżnia te, które mogę otworzyć, od tych, których nie mogę?

Dodatkowe informacje: Uruchomiony proces jako administrator. UAC wyłączony. Tak, to aplikacja 32-bitowa. Nie miałem lepszych wyników przy użyciu PROCESS_QUERY_LIMITED_INFORMATION.

Dzięki ... Karl

Odpowiedz

4

Procesy że cytowane (winlogon, CSRSS, etc.) są krytyczne procesy i usługi systemowe. Działają pod innym, uprzywilejowanym kontem. Mimo że działasz jako administrator, nie jesteś właścicielem tych procesów, a zatem nie masz żadnych praw do ich listy ACL. Próba otwarcia spowoduje odmowę dostępu.

Jednak członkowie grupy administrators mają atrybut SeDebugPrivilege. Jest to w zasadzie zastąpienie OpenProcess i OpenThread, które pozwoli ci otworzyć się na cały dostęp, nawet jeśli nie masz żadnych uprawnień w ACL.

SeDebugPrivilege to oczywiście bardzo niebezpieczny przywilej - można ominąć kontrolę dostępu i modyfikować/sprawdzać procesy innych użytkowników. Chociaż jest domyślnie obecny w tokenie administratora, nie jest domyślnie włączony. Musisz włączyć to uprawnienie przed wywołaniem OpenProcess.

Ten MSDN article daje przykładowy kod, jak włączyć i wyłączyć uprawnienia w tokenie.

+0

Ouch. Tak, w porządku, w porządku. To również umożliwiło GetProcessTimes razy. Widzę, że Process Explorer działa również z tym ustawieniem. Tak więc, jeśli miałbym uruchomić to pod kontem użytkownika najmniejszego prywatnego konta, to też nie mógł tego robić? W każdym razie, dzięki! :-) –

+1

Niewiele grup ma domyślnie SeDebugPrivilege, w zasadzie tylko SYSTEM i grupę administratorów. Najmniej uprzywilejowani użytkownicy zdecydowanie tego nie robią. Gdyby tak było, podniesienie do pełnego przywileju byłoby trywialne, ponieważ możesz wprowadzić kod, który chcesz uruchomić w uprzywilejowanym procesie. – Michael

+0

Zanim przejdę do tego posta, pomyślałem, że będę musiał stworzyć osobne kompilacje w moim scenariuszu, ale dzięki SeDebugPrivilege mogę teraz wywołać openprocess z 32-bitowego procesu i załadować 64-bitowy proces w moim przypadku, im będzie mógł załadować lsass. – Syler

Powiązane problemy