Zine.net online

Witaj na Zine.net online Zaloguj się | Rejestracja | Pomoc
w Szukaj

mgrzeg.net - Admin on Rails :)

win32k a sesja

Poprzedni wpis zakończyłem pytaniem o dodatkowe polecenie, które wykonałem tuż po ustaleniu adresu instancji EPROCESS dla kalkulatora, czyli

kd> .process /P fffffa8003951060

Czy było ono niezbędne? :)

Najważniejszą wskazówką jaką podałem, to to, że dump został przygotowany z poziomu debuggera jądra, a nie np. z wykorzystaniem zewnętrznego narzędzia (typu notmyfault, czy win64dd), co oznacza, że wykonałem go będąc przełączonym na proces systemowy.

_MM_SESSION_SPACE

W systemie może być wiele sesji - kilka lat temu pisałem o tym, że od Visty usługi pracują w sesji 0, natomiast użytkownicy w sesji 1 i następnych. W ramach sesji 1 mamy ‘konsolę’, czyli ‘sesję interaktywną’ - tą, z którą łączymy się pracując bezpośrednio przy komputerze. Precyzyjniej rzecz ujmując, jest to sesja 1, stacja okienkowa ‘WinSta0’, pulpit ‘Default’ (co pokazałem na zrzutach w poprzednim wpisie).
Dla każdej sesji system tworzy obiekt typu _MM_SESSION_SPACE i każdy proces ma w ramach swojej struktury EPROCESS link do powiązanej z nim sesji, w ramach pola Session. Sprawdźmy to dla kilku przykładów:

1. Lsass.exe

kd> !process 0 0 lsass.exe
PROCESS fffffa80034e02a0
    SessionId: 0  Cid: 0220    Peb: 7fffffd6000  ParentCid: 019c
    DirBase: 203f9000  ObjectTable: fffff8a002609310  HandleCount: 576.
    Image: lsass.exe
kd> dt nt!_EPROCESS fffffa80034e02a0 Session
   +0x2d8 Session : 0xfffff880`030b2000 Void
kd> dt nt!_MM_SESSION_SPACE 0xfffff880`030b2000 SessionId
   +0x008 SessionId : 0

2. calc.exe

kd> !process 0 0 calc.exe
PROCESS fffffa8003951060
    SessionId: 1  Cid: 0bf8    Peb: 7fffffd9000  ParentCid: 0b50
    DirBase: 1a014000  ObjectTable: fffff8a002b7b0e0  HandleCount:  75.
    Image: calc.exe

kd> dt nt!_EPROCESS fffffa8003951060 Session
   +0x2d8 Session : 0xfffff880`033e5000 Void
kd> dt nt!_MM_SESSION_SPACE 0xfffff880`033e5000 SessionId
   +0x008 SessionId : 1

3. System
To najciekawszy przykład - sprawdźmy, z którą sesją powiązany jest proces systemowy

kd> !process 0 0 system
PROCESS fffffa80018d0040
    SessionId: none  Cid: 0004    Peb: 00000000  ParentCid: 0000
    DirBase: 00187000  ObjectTable: fffff8a000001720  HandleCount: 418.
    Image: System

kd> dt nt!_EPROCESS fffffa80018d0040 Session
   +0x2d8 Session : (null)

A zatem proces systemowy nie jest powiązany z żadną sesją. Dlatego też, wykonując zrzut w kontekście procesu systemowego nie miałem podlączonej żadnej sesji.

kd> !session
Sessions on machine: 2
Valid Sessions: 0 1
Error in reading current session

Gdy jednak to samo polecenie wykonam będąc na zrzucie wykonanym win64dd, otrzymam w wyniku:

kd> !session
Sessions on machine: 2
Valid Sessions: 0 1
Current Session 1

Aby przełączyć się na konkretną sesję mogę wykonać to na dwa sposoby:

kd> !session -s 1
Sessions on machine: 2
Implicit process is now fffffa80`0346eaa0
Using session 1

Ciekawe przy okazji, na jaki proces zostaliśmy przełączeni:

kd> dt nt!_EPROCESS fffffa80`0346eaa0 ImageFileName
   +0x2e0 ImageFileName : [15]  "csrss.exe"

No tak. Pierwszy proces tworzony w ramach każdej sesji.

Drugi sposób to jawne przełączenie kontekstu na dany proces, co zrobiłem w poprzednim wpisie:

kd> .process /P fffffa8003951060

Poprzednio wspomniałem również, że 512 GB obszar sesji obejmuje adresy:
FFFFF900`00000000 - FFFFF97F`FFFFFFFF
zobaczmy zatem co fizycznie odpowiada temu adresowi dla różnych procesów powiązanych z różnymi sesjami:

1. Sesja 1

kd> !process 0 0 notepad.exe
PROCESS fffffa8003c80920
    SessionId: 1  Cid: 0b94    Peb: 7fffffde000  ParentCid: 0b50
    DirBase: 2bff2000  ObjectTable: fffff8a003883480  HandleCount:  57.
    Image: notepad.exe

kd> .process /P fffffa8003c80920
Implicit process is now fffffa80`03c80920
kd> !pte 0xfffff900`00000000
                                           VA fffff90000000000
PXE at FFFFF6FB7DBEDF90    PPE at FFFFF6FB7DBF2000    PDE at FFFFF6FB7E400000    PTE at FFFFF6FC80000000
contains 0000000021DF5863  contains 0000000076F76863  contains 0000000075777863  contains 000000006EB73863
pfn 21df5     ---DA--KWEV  pfn 76f76     ---DA--KWEV  pfn 75777     ---DA--KWEV  pfn 6eb73     ---DA--KWEV

kd> !process 0 0 calc.exe
PROCESS fffffa8003951060
    SessionId: 1  Cid: 0bf8    Peb: 7fffffd9000  ParentCid: 0b50
    DirBase: 1a014000  ObjectTable: fffff8a002b7b0e0  HandleCount:  75.
    Image: calc.exe

kd> .process /P fffffa8003951060
Implicit process is now fffffa80`03951060
kd> !pte 0xfffff900`00000000
                                           VA fffff90000000000
PXE at FFFFF6FB7DBEDF90    PPE at FFFFF6FB7DBF2000    PDE at FFFFF6FB7E400000    PTE at FFFFF6FC80000000
contains 0000000021DF5863  contains 0000000076F76863  contains 0000000075777863  contains 000000006EB73863
pfn 21df5     ---DA--KWEV  pfn 76f76     ---DA--KWEV  pfn 75777     ---DA--KWEV  pfn 6eb73     ---DA--KWEV

A więc mamy te same pfn dla tego adresu w przypadku obu procesów z sesji 1

2. Sesja 0

kd> !process 0 0 lsass.exe
PROCESS fffffa80034e02a0
    SessionId: 0  Cid: 0220    Peb: 7fffffd6000  ParentCid: 019c
    DirBase: 203f9000  ObjectTable: fffff8a002609310  HandleCount: 576.
    Image: lsass.exe

kd> .process /P fffffa80034e02a0
Implicit process is now fffffa80`034e02a0
kd> !pte 0xfffff900`00000000
                                           VA fffff90000000000
PXE at FFFFF6FB7DBEDF90    PPE at FFFFF6FB7DBF2000    PDE at FFFFF6FB7E400000    PTE at FFFFF6FC80000000
contains 0000000022998863  contains 0000000022919863  contains 000000002291A863  contains 0000000022B16863
pfn 22998     ---DA--KWEV  pfn 22919     ---DA--KWEV  pfn 2291a     ---DA--KWEV  pfn 22b16     ---DA--KWEV

kd> !process 0 0 audiodg.exe
PROCESS fffffa8003679060
    SessionId: 0  Cid: 017c    Peb: 7fffffd9000  ParentCid: 03b4
    DirBase: 152e4000  ObjectTable: fffff8a0029177d0  HandleCount: 115.
    Image: audiodg.exe

kd> .process /P fffffa8003679060
Implicit process is now fffffa80`03679060
kd> !pte 0xfffff900`00000000
                                           VA fffff90000000000
PXE at FFFFF6FB7DBEDF90    PPE at FFFFF6FB7DBF2000    PDE at FFFFF6FB7E400000    PTE at FFFFF6FC80000000
contains 0000000022998863  contains 0000000022919863  contains 000000002291A863  contains 0000000022B16863
pfn 22998     ---DA--KWEV  pfn 22919     ---DA--KWEV  pfn 2291a     ---DA--KWEV  pfn 22b16     ---DA--KWEV

A zatem i w tym przypadku mamy ten sam pfn dla obu procesów, przy czym jest on różny od tego, z czym się spotkalismy analizując procesy sesji 1

3. W kontekście procesu systemu

kd> !process 0 0 system
PROCESS fffffa80018d0040
    SessionId: none  Cid: 0004    Peb: 00000000  ParentCid: 0000
    DirBase: 00187000  ObjectTable: fffff8a000001720  HandleCount: 418.
    Image: System

kd> .process /P fffffa80018d0040
Implicit process is now fffffa80`018d0040
kd> !pte 0xfffff900`00000000
                                           VA fffff90000000000
PXE at FFFFF6FB7DBEDF90    PPE at FFFFF6FB7DBF2000    PDE at FFFFF6FB7E400000    PTE at FFFFF6FC80000000
contains 0000000000000000
not valid

A zatem w kontekście procesu system ten adres nie jest poprawny

Gdy zrobimy zrzut załadowanych modułów, to okazuje się, iż w obszarze sesji mamy załadowane następujące:

kd> lm kv
start             end                 module name
[CIAP]
fffff960`000a0000 fffff960`003b6000   win32k     (pdb symbols)          c:\websymbols\win32k.pdb\C56BAB5A7D284C9DA9ECF3691D7D35B32\win32k.pdb
    Loaded symbol image file: win32k.sys
    Mapped memory image file: c:\websymbols\win32k.sys\50AEECC6316000\win32k.sys
    Image path: \SystemRoot\System32\win32k.sys
    Image name: win32k.sys
    Timestamp:        Fri Nov 23 04:25:58 2012 (50AEECC6)
    CheckSum:         0030B8F7
    ImageSize:        00316000
    Translations:     0000.04b0 0000.04e4 0409.04b0 0409.04e4
fffff960`00500000 fffff960`0050a000   TSDDD      (deferred)            
    Image path: \SystemRoot\System32\TSDDD.dll
    Image name: TSDDD.dll
    Timestamp:        Tue Jul 14 02:16:34 2009 (4A5BCE62)
    CheckSum:         00009E96
    ImageSize:        0000A000
    Translations:     0000.04b0 0000.04e4 0409.04b0 0409.04e4
fffff960`00610000 fffff960`00637000   cdd        (deferred)            
    Image path: \SystemRoot\System32\cdd.dll
    Image name: cdd.dll
    Timestamp:        Sat Nov 20 13:55:34 2010 (4CE7C546)
    CheckSum:         0002D4F0
    ImageSize:        00027000
    Translations:     0000.04b0 0000.04e4 0409.04b0 0409.04e4

Dzięki temu win32k nie musi samodzielnie zajmować się sesjami i ma zapewnioną pełną separację między różnymi sesjami, a sam może zajmować się tylko stacjami okienkowymi, pulpitami, oknami, no i oczywiście procesami i wątkami powiązanymi z tymi obiektami :)

Reasumując: gdybym nie przełączył się na proces kalkulatora, to przeglądając zawartość obiektów sesji odwoływałbym się do adresów w ramach kontekstu procesu system, czyli widziałbym nieprawidłowe adresy.

I zagadka dla bardzo wytrwałych: który proces poza system nie jest połączony z żadną sesją?

Opublikowane 24 sierpnia 2013 16:07 przez mgrzeg

Powiadamianie o komentarzach

Jeżeli chciałbyś otrzymywać email gdy ta wypowiedź zostanie zaktualizowana, to zarejestruj się tutaj

Subskrybuj komentarze za pomocą RSS

Komentarze:

 

gt said:

Oj tam zaraz bardzo wytrwałych. Od razu się w oczy rzuca niejaki smss.exe ;)

sierpnia 24, 2013 17:51
 

mgrzeg said:

no tak :) Trudno, żeby menadżer sesji był do którejś specjalnie przywiązany ;)

sierpnia 24, 2013 18:37

Co o tym myślisz?

(wymagane) 
(opcjonalne)
(wymagane) 

  
Wprowadź kod: (wymagane)
Wyślij

Subskrypcje

W oparciu o Community Server (Personal Edition), Telligent Systems