windows, driver, zmiana procesu

0

w jaki sposob pod windowsem wstrzyknac kod do innego procesu?

domyslnie driver sie wykonuje pod System, a ja chce by sie wykonywal w contexcie innego procesu.
zeby miec dostep do przestrzeni adresowej innego procesu, i do obiektow otwartych przez niego.

0

Po pierwsze, driver to niezupełnie windows, w sensie nie WinAPI.
Po drugie, coś robisz nie tak. To raczej proces powinien się komunikować ze sterownikiem, i ewentualnie podać mu jakieś obiekty, a nie odwrotnie.

0

no tak jesli proces bedzie sie komunikowal, to kazdy ioctl bedzie w kontexcie tegoz procesu, ale jak laduje driver to wykonuje sie driverentry w kontexcie System.

Rozumiem ze to tak ma byc, i driver nie moze stanowic wlasnego procesu.

0

Polecam "biblie" pt. "Rotkit. Sabotowanie jądra systemu". Dowiesz się co nieco o technologii wykonania Windowsa, jak się pisze drivery, komunikacja, native API, itp.

0

Nie udzielajcie panowie odpowiedzi jeśli sami nie macie pojęcia w temacie...

Wpierw musisz zdobyć adres obiektu procesu (KTHREAD), pod którego przestrzeń adresową chcesz podpiąć dany wątek (np używając PsLookupProcessByProcessId lub ZwQuerySystemInformation(SystemProcessesAndThreadsInformation, ...) ewentualnie ręcznie przeanalizować listę PsActiveProcessLinks). Następnie musisz wywołać funkcję KeStackAttachProcess. Warto dokonać wpierw zwiększenia licznika referencji obiektu procesu aby upewnić się, że obiekt procesu nie zostanie zwolniony w trakcie wykonywania operacji na jego przestrzeni adresowej... Naturalnie wszekla operacja na adresach przestrzeni użytkownika wymaga ich walidacji przy użyciu ProbeForRead/ProbeForWrite opakowanej w obsługę wyjątków. Po dokonaniu operacji należy wywołać funkcję KeUnstackDetachProcess i zmniejszyć licznik referencji jeżeli był uprzednio zwiększony (ObDereferenceObject). Co do wykonywania konkretnego kodu (shellcode, dll) radzę poczytać o "user-mode asynchronous procedure call (APC)".

pozdrawiam,
lord_zero

0

dzieki przydatne info ale znow mam kolejny problem.

ProbeForRead/ProbeForWrite
po co wywolywac te funkcje?
Przeciez miedzy ProbeForWrite a zapisem do pamieci ochrona strony (lub jej obecnosc) moze sie zmienic, i dostane wyjatek tak czy inaczej. No chyba ze mozna jakos zamrozic przestrzen adresowa, a to jest raczej nie mozliwe. Mutex/lock tez chyba nie wchodzi w gre, ale nie jestem pweien :/

Chociaz ta funkcja sprawdza tylko czy adres jest w przestrzeni UM, ale jaki jest tego sens?
Przeciez przestrzen um/km sie niczym nie roznia pod wzgledem mechanizmow ochrony, wazny jest tylko cpl jaki wykonuje kod...

0

Funkcje ProbeForRead/ProbeForWrite sprawdzają jedynie czy strony pamięci, do których następuje odwołanie są dostępne, czy zostały poddane procesowi stronicowania. Jest to niezbędny zabieg w przypadku odwoływania się do obszaru pamięci użytkownika, która w całości podlega stronicowaniu. Naturalnie nie ma absolutnie żadnej pewności, że w chwile po sprawdzeniu dosatępności danego obszaru pamięci nie nastąpi zrzucenie go do pliku stronicowania. W celu uniknięcia jakichkolwiek niespodzianek niezbędne jest stworzenie MDLa (Memory Descriptor List) - IoAllocateMdl, zablokowanie bufora MmProbeAndLockPages (wywołanie tej funkcji musi być opakowane w __try/__except) przełączenie wątku w kontekst przestrzeni adresowej wybranego procesu KeStackAttachProcess oraz zmapowanie fizycznych stron opisywanych przez MDL - MmMapLockedPagesSpecifyCache z parametrami AccessMode - UserMode, CacheType - MmCached i Priority - NormalPagePriority. Dopiero w tym momencie można śmiało modyfikować atrybuty stron, odczytywać/zapisywać. Naturalnie po wykonaniu tych operacji należy odblokować dany obszar i zwolnić MDL.

pozdrawiam,
lord_zero

0

Ale do 'zwyklego' odwolania (np ioctl METHOD_DIRECT) wystarczy ProbeFor*** i obsluga wyjatku przy dostepie do tegoz bufora?

0

Nie w przypadku metody METHOD_DIRECT tylko METHOD_NEITHER. W przypadku tej pierwszej sterownik musi skorzystać z funkcji MmGetSystemAddressForMdlSafe pamiętając o tym by się upewnić, że z poziomu użytkownika nie został przekazany zerowej długoścu bufor. W przypadku metody METHOD_NEITHER też należy pamiętać o tym by przed wywołaniem ProbeForX sprawdzić długości przekazanych buforów.

lord_zero

0

mam jeszcze jedno pytanie, obsluga wyjatkow.

pod FS:0 jest TEB.TIB
tam sa struktury okreslajace SEH.

jak przelaczam w kernel mode (np via ioctl/readfile/writefile) to fs zostaje ten sam. a wiec kod wykonywany w cpl = 0 bedzie obslugiwany przez kod napisany przez dpl = 3.

jak to jest mozliwe? przeciez jak callback zwroci 1, to wykona sie nastepny handler ktory wlasnie bedzie napisany w UM.

chyba ze ssytem sprawdza czy SEH lezy na stosie, i jak przelacze w KM to stos tez sie zmienia, a SEH z userlandu nie bedzie na stosie i sie nie wykona.

prosilbym o wyjasnienie.

0

Ze wzgledów bezpieczeństwa podczas przejścia wątku z trybu użytkownika w tryb jądra następuje zapisanie stanu stosu trybu użytkownika i korzystanie ze stosu trybu jądra. Podczas powrotu z trybu jądra do trybu użytkownika następuje powrót do stosu trybu użytkownika.

0

MmProbeAndLockPages() crashuje system.

dostaje bsod 0x7F, z argumentem 0x8 (unexcepted trap -> double fault)

oczywiscie opakowalem to w seha, ale niestety.
mysle ze problem lezy w 2 kwestiach:

stos - zapisuje stan przed wrzucaniem argumentow mmlockandprobe, przywracam w handlerze wyjatku nadpisujac CONTEXT->esp. CONTEXT->eip nadpisuje na adres po callu mmprobeandlock.

drugi i mysle ze wazniejszy problem to co system robi miedzy zalozeniem SEHA a prawdziwym wyjatkiem.
moze podnosi irql, moze dodaje wlasny seh, moze bierze jakies locki - a raczej na pewno w koncu musi modyfikowac liste stron.

nie wiem, virtual pc wywala wyjatek, prawdziwy win32 wywala bsoda, o kodzie jaki podalem.

aha, seha ja pisze w asemblerze.

push handler
push dword [fs:0]
mov dword [fs:0],esp

push 0
push 0
call [ds:mmprobeandlockpages]

safe:

pop dword [fs:0]
add esp,4

..

handler:

mov eax,0
ret

pominalem nadpisywanie stosu/eip bo teraz nie mam tego kodu ani kd zeby zobaczyc offsety.
moze blad jest w wartosci zwracanej przez seh? moze eip powinnin byc inny - najbardziej prawdopodobne, jaki powinien byc eip? jak go nie zmienie, to przeciez instrukcja bedzie sie powtarzac w nieskonczonosc (jak bede zwracal 0), jak zwroce 1 - pewnie tez bsod.

any ideas?

1 użytkowników online, w tym zalogowanych: 0, gości: 1