Napisałem program, który jest w stanie przechwytywać uruchamianie programów w systemie. Spełnia to zadanie poprzez "hook' owanie" funkcji CreateProcessInternalW, CreateProcessAsUserW i CreateProcessAsUserA. Wszystko działa z jednym małym wyjątkiem, a mianowicie nie wykrywa momentu uruchamiania aplikacji wywoływanych poprzez skrót ctrl + alt + delete ( np. taskmgr.exe ). Jeżeli ktoś wytłumaczyłby mi dlaczego tak się dzieje i jak można temu zaradzić byłbym bardzo wdzięczny.
Nie jestem specjalistą w hookach, ale do tej pory nikt Tobie nie odpowiedział, więc napisze to co udało mi
się z pomocą znalezionych kodów na sieci zrobić. Otóż zapoznaj się ze źródłem - pod poniższym adresem.
W oryginale był to kod inaczej zorganizowany, używający niepotrzebnych modułów, ale pod Windowsem XP
Home SP2 u mnie, prawidłowo blokował funkcję TerminareProcess. Jednak jak znajomy testował program na
swoim Windows 7 to i tak ubił jej proces. Mimo to, na bazie tamtego kodu wykonałem dll oraz loadera dla
zablokowania funkcji CreateProcessW. U mnie pod XP działa ok, nawet z pod managera zadan. Pozwala w
trakcie działania programu (zanim klikniesz OK i go zamkniesz) uruchomić wszystkie programy poza takim,
o nazwie calc.exe z dowolnej ściezki, dowolnej wielkości literami nazwanym. Może się to Tobie też przyda.
Pewnie skoro pytałes o inne funkcję AsUser to używasz nowszego systemu niż XP, jednak może ten kod w
czymś Tobie pomoże. Loader został napisany przeze mnie, kod hookujący mam z sieci i działa lepiej dla ów
funkcji niż znaleziony inny, przy którym przy wyłączeniu hooka następowały błędy od explorer.exe i innych.
Z ciekawości napisz czy pod Twoim systemem dla funkcji CreateProcessW ten hook działa. Bo jak u siebie
na XP zauważyłem zatowno managery Total Commander i FAR oraz Explorator używają ów funkcji dla exe.
http://www.przeklej.pl/plik/hook-on-createprocessw-rar-001bgnb5796u
v3ntus napisał(a)
Wszystko działa z jednym małym wyjątkiem, a mianowicie nie wykrywa momentu uruchamiania aplikacji wywoływanych poprzez skrót ctrl + alt + delete ( np. taskmgr.exe )
Najprawdopodobniej zwyczajnie źle się za to zabierasz.
Na SAS (ctrl+alt+del) reaguje Winlogon. W celu uruchomienia taskmgr.exe, zależnie od sytuacji (lub/i konfiguracji), winlogon!SASWndProc bądź winlogon!HandleLoggedOn woła winlogon!StartApplication, ten zaś przechodzi do biblioteki MSGINA, przechodząc kolejno przez MSGINA!WlxStartApplication i MSGINA!ExecApplication, dochodząc w końcu do ADVAPI32!CreateProcessAsUserW.
Próbujesz ładować swoją bibliotekę poprzez SetWindowsHookEx? Mam złą wiadomość, tego rodzaju hooki funkcjonują wyłącznie na desktopie, na którym zostały stworzone, Winlogon z pulpitu użytkownika nie korzysta.
A ja dodam, że tak jak podejrzewałem - mój kod nie wyłapuje pod Windows 7 tej API,
bo tam się używa chyba jednak innych funkcji, o których wspomniał autor wątku, tak
więć kod tylko jako przykład może służyć. Jednak jeszcze z nim pokombinuję troszkę.
Na SAS (ctrl+alt+del) reaguje Winlogon. W celu uruchomienia taskmgr.exe, zależnie od sytuacji (lub/i konfiguracji), winlogon!SASWndProc bądź winlogon!HandleLoggedOn woła winlogon!StartApplication, ten zaś przechodzi do biblioteki MSGINA, przechodząc kolejno przez MSGINA!WlxStartApplication i MSGINA!ExecApplication, dochodząc w końcu do ADVAPI32!CreateProcessAsUserW.
Próbujesz ładować swoją bibliotekę poprzez SetWindowsHookEx? Mam złą wiadomość, tego rodzaju hooki funkcjonują wyłącznie na desktopie, na którym zostały stworzone, Winlogon z pulpitu użytkownika nie korzysta.
Dzięki za odpowiedzi i za wytłumaczenie mi o co chodzi. Będę musiał szukać innych sposobów api hooking' u. Jaki sposób hook' owania pozwala na śledzenie uruchamiania procesów na wszystkich desktopach?
Dobra, miałem chwilę żeby odkopać nieużywanego Windows 7 i zobaczyć jak tam jest to zrealizowane.
Pomijając rewolucje jakie zaszły w implementacji podsystemu Windows to Winlogon też przeszedł sporą metamorfozę. Cały problem sprowadza się tak naprawdę do unifikacji architektury podsystemu - obecnie właściwe funkcje znajdują się m.in. w KERNELBASE, ADVAPI32 do nich jedynie forwarduje dla kompatybilności z istniejącym softem, sam system korzysta ze swoich libów. Aktualnie całość wygląda tak: winlogon!StateMachineRun reaguje na event i woła winlogon!WLGeneric_TaskManager_Enter, to z kolei metodę winlogon!CUser::CreateProcessW, która w końcu korzysta z KERNELBASE!CreateProcessAsUserW.
Jak widać zmieniła się wyłącznie biblioteka, docelowo mechanizm jest ten sam.
Co do właściwszej metody hookowania to trudno powiedzieć, zależy co chcesz osiągnąć i w jakim momencie.
deus: a jeżeli zależy mi na przechwyceniu momentu uruchamiania i jeżeli nazwa uruchomionego pliku to na przykład calc.exe to ją
zablokowac, to jaką dllkę i jaką funkcję pod Windows 7 powinienem hookować? Nie mam póki co nowszego kompa dlatego siedzę
pod XP, ale wczoraj Api Monitorem przez TeamViewer u znajomka pod Windows 7 próbowałem monitorować różne api, kiedy pod
Total Commanderem uruchamialiśmy calc.exe dla testów. Nic nie łapało, to zapytałem innego znajomego co na codzien tworzy dla
jednej z firm sygnatury do popularnego antywirusa, jaką Api należy wziąć pod uwagę przy uruchomieniu to wkleił mi cytat, że pod
Windows 7 zamiast CreateProcessW do uruchomienia programów używane są funkcje ShellExecute(Ex) i to je należy "hookować".
Niestety znajomemu komp padł po raz kolejny w trakcie sesji pod TeamViewerem, a konkretnie to chyba zasilacz i już nie mialem
możliwości sprawdzenia czy Total Commander bądź system po kliknięciu na ikonę OS posłuży się do uruchomienia ów funkcjami.
olesio napisał(a)
Nic nie łapało, to zapytałem innego znajomego co na codzien tworzy dla jednej z firm sygnatury do popularnego antywirusa, jaką Api należy wziąć pod uwagę przy uruchomieniu to wkleił mi cytat, że pod Windows 7 zamiast CreateProcessW do uruchomienia programów używane są funkcje ShellExecute(Ex) i to je należy "hookować".
'Nieco' mija się to z rzeczywistością.
TotalCommander faktycznie używa SHELL32!ShellExecute, zaś Explorer kupy funkcji z shell32.dll, do tego dochodzą hooki powłoki w innych libach, które też z całej gamy funkcji korzystają (zależnie od sytuacji). Generalnie sprawa ma się tak: SHELL32!ShellExecute(Ex) działa jak działało, nadal używa CreateProcessW, po prostu już nie z kernel32 a z kernelbase (przynajmniej we 'właściwej' części bibliotek systemowych). Jak najbardziej wszystkie udokumentowane funkcje od uruchamiania procesów i komend schodzą się w KERNELBASE!CreateProcessInternalW, (prawie wszystkie już w KERNELBASE!CreateProcessW), po prostu (jak już pisałem) zmieniła się biblioteka zawierająca właściwy zestaw funkcji.
W żadnym razie ShellExecute nie zastępuje CreateProcess...
BTW, co to za firma AV, jeżeli to nie tajemnica (ew. na PM)?
Dziękuję za odpowiedź, chyba muszę sobie darować kombinowanie z takim hookiem, a przynajmniej póki sam nie mam Windows 7.
A firma to ESET. Jeżeli szukasz pracy to znajomy wspominał, że jest nabór ludzi. Zadania wymagane do CV są na: http://3537.pl.
Coś takiego, ESET :>. O rekrutacji oczywiście wiem, tak jak wszyscy potencjalnie zainteresowani. Znajomy dobrze trafił...
"Jadał krakersy" i doświadczenie tak nabyte, mu się przydają w pracy. Pracuje mu się ok i robi co lubi.
Tja, siłą rzeczy większość analityków zagrożeń to (byli) crackerzy. Jeżeli to jeden z nowych nabytków firmy to nawet chyba wiem kto. Nie przypominam sobie żeby ktoś poza ESETem miał w tym kraju naprawdę sensowny, rozwijający się lab AV. Ech, też wypadałoby sobie gdzieś stałego zatrudnienia poszukać w tym fachu...
On i wśród jedzących krakersy był starym wyjadaczem, a i w ekipie ESETa z tego co wiem jest już dłuższy czas. A skoro szukasz
zatrudnienia, a za pewne zdolny z Ciebie koder, a może i lubisz śledzić cudzy kod oraz go czasami "poprawić" to może uderz tam.
Pewnie zadania z tej strony są dla Ciebie do przetrawienia. Ja wymiekam, ale może Tobie by się chciało pracować w Krakowie tam
w ESETcie w zdolnym zespole. Jeśli nie analityków to może w developerce. Może spróbuj posiedzieć nad zadaniami i wysłac z CV.
A nuż widelec (w nuż nie ma błędu, tak się pisze to powiedzenie - to do moderacji ortów ;)) się Tobie uda, powodzenia Ci życzę.
Zadanie dla analityka jest proste, na jeden wieczór, zrobiłem wieki temu, stare (którego aktualnie poszukuję) z poprzedniej rekrutacji było znacznie ciekawsze. Kernel developer ma trochę więcej zabawy jeżeli chce zrobić wszystko legalnie, bez korzystania z nieudokumentowanych rzeczy, a przynajmniej ja mam z tym lekkie problemy. Kwestia poświęcenia czasu...
Napisałem do tego znajomka, wkleiłem mu Twoj ostatni post i poprosiłem, że jeżeli by dysponowal tym
zadaniem i mógłbym je Tobie dać to żeby mi je podesłał, więc jak da radę to przyślę Tobie linka na PM.
Dzięki za zainteresowanie. W moim projekcie będę musiał wykorzystać coś w stylu: http://www.codeproject.com/KB/system/soviet_protector.aspx
v3ntus proponuję Ci skorzystać z czegoś udokumentowanego jak PsSetCreateProcessNotifyRoutine zamiast kombinowania z modyfikacją SDT. Przykładowy kod - Detecting Windows NT/2K process execution.
lord_zero
Sorry, że trochę odkopuje temat ale zauważyłem, znalazłem w wyszukiwarce, że była rozmowa o rekrutacji Esetu. Co myślicie o pierwszym zadaniu z http://3537.pl/programista.html ? Ktoś próbował się zmierzyć? Jak oceniacie jego trudność?