Projektový deník

 

18. září 2006 19:12 – 19:30

Napsáno neformální zadání ročníkové práce. Nebylo to nijak těžké, protože materiály sbírám již asi půl druhého roku a protože již na samotné aplikaci trochu pracuji.

 

24. září 2006 20:15 – 20:30

Napsal jsem základ odborného článku.

 

25. září 2006 9:20 – 9:45

Vymyslel jsem, jak bude aplikace vypadat a také jak se bude ovládat (uživatelské rozhraní).

 

29. září 2006

Základ uživatelského rozhraní je naprogramován – zatím je funkčnost nulová.

 

1. říjen 2006 20:00 – 20:30

Vytvořen rámcový časový plán projektu. Započaly práce na logu.

 

2. říjen 2006 20:00 – 22:00

Logo bylo úspěšně dokončeno. Je sice velmi jednoduché, ale účelem programu není uchvátit uživatele grafickými efekty, ale poskytnout mu důležité systémové informace.

 

7. říjen 2006 10:00 – 11:00

Vypracováno „Rozhlédnutí“ (State of Art). Nebylo to nijak těžké. Z programy podobného rázu jsem se již setkal a používám je.

 

9. říjen 2006 19:20 – 21:15

Rozpracovány „případy užití“ (USE CASE). Studování postupů, jak psát ovladače jádra (kornel mode drivers) a jak vlastně jádro systému Windows NT funguje (už se na to připravuji asi rok, ale zatím jsem neměl odvahu). Ovladače jádra budou velmi důležitou součástí Process Inspektoru – budou poskytovat interní informace, ke kterým se normální (user mode) programy nemohou dostat.

 

12. říjen 2006 15:30 – 17:30

Podařilo se mi nainstalovat do jádra můj první ovladač. K tomu jsem si musel napsat svůj vlastní instalační program. Ovladač nedělá vůbec nic, jen napíše zprávu o úspěšném spuštění, kterou zachytí program DebugView (www.sysinternals.com).

 

13. říjen 2006 21:00 – 22:00

Pokračují práce na ovladači GMEM.SYS, který bude programu poskytovat informace o paměti jádra (bude možno číst i zapisovat). Zatím jeho funkčnost nebyla testována (a asi ještě dlouho nebude). Asi nejdůležitějším úkolem tohoto driveru bude zjistit obsah Systém Service Descriptor Table (SSDT). Této tabulky využívají některé rootkity a lze je díky tomu detekovat.

 

23. říjen 2006 20:00 – 21:30

Program byl rozvržen na jednotlivé moduly (je jich asi 30). Dále jsem provedl odhad nákladů a pracnosti produktu. Ale není to konečné. Pokud bude čas, ještě program rozšířím o další funkce (vyhledávání skrytých souborů, čtení BOOT sektoru…).

 

29. říjen 2006 22:30 – 0:30

Rozvržení modulů napsané při odhadu nákladů a pracnosti bylo fyzicky provedeno – vytvořeny jednotlivé (prázdné) soubory pro každý modul.

Zdá se, že čtení paměti jádra nebude tak snadné, jak jsem si myslel. V jádru se totiž nachází i stránkované oblasti paměti, které nelze číst, kdy se člověku zachce.

 

11. listopad 2006 16:00 – 21:00

Dnes se stala velmi nešťastná událost. Nedopatřením se mi podařilo smazat veškerá data i samotný program. Po pětihodinovém úsilí se téměr vše podařilo obnovit do původního stavu. Škody tedy nejsou nijak vážné.

 

12. listopad 2006 8:00 – 9:00

Vytvořen základ WWW stránek, kde bude Process Inspektor prezentován. Design je velmi jednoduchý.

 

15. listopad 2006 14:00 – 18:00

Do Process Inspectoru byly zabudovány některé základní funkce. Program nyní umožňuje zobrazit obsah souborů používaných běžícími procesy. Vylepšena metoda zjišťování importovaných funkcí DLL knihoven a dalších modulů používaných procesy (stále však nedetekuje IAT ani inline háky). Odstraněn problém se zobrazováním chybových hlášek (místo chybové hlášky se zobrazovala hláška „informační“ a naopak).

 

16. listopad 2006 15:00 – 18:00

Zprovozněny další funkce programu. Je možno nahrávat a uvolňovat moduly, které proces používá. Dále je možno pozastavovat a „probouzet“ jednotlivá vlákna procesu. Přibyla i možnost zobrazení obsahu paměti procesu a obsahu namapovaných souborů (sections), které proces má ve svém adresovém prostoru. Také se podařilo upravit jména objektů jádra používaných procesy do „přátelštějšího“ tvaru (jména souborů jsou již plně čitelná). O ovladačích lze zobrazit podobné informace jako o DLL knihovnách a technika získávání seznamu nahraných ovladačů byla taktéž vylepšena.

 

17. listopad 2006 12:00 – 22:00

Začaly intenzivní práce na modulu ssdt.dll. Modulu ssdt.dll byl de facto dokončen, ale nastaly velké potíže z ovladačem gmem.sys. Čtení paměti jádra asi opravdu není jednoduché. Podařilo se lokalizovat pravděpodobné místo chyby. To je ale vše – nevím, proč tam k chybě dochází a jakého druhu ta chyba je, protože jejím následkem je okamžitý restart počítače. Také byl vytvořen modul ClassSSDT.

 

18. listopad 2006 9:00 – 10:00, 20:00 – 22:00

Vyřešen problém s ovladačem gmem.sys. Chyba nebyla v ovladači, ale v programu, který s ním komunikoval. Díky opravě této chyby bylo možné pokračovat ve vývoji modulů ssdt.dll a ClassSSDT. Process Inspector je nyní schopen načíst aktuální Systém Service Deskriptor Table. Zatím nedokáže odhalit přesměrované funkce. Další problém je, že při ukončení Process Inspectoru nedochází k odstranění ovladače z paměti.

 

19. listopad 2006 10:00 – 11:00 19:00 – 21:00

Pokračují práce na úvodní části dokumentace. Upraven odborný článek a „rozhlédnutí“.

 

24. listopad 2006 16:00 – 19:00

Drobné vylepšení ovladače gmem.sys. Drobné úpravy programu.

 

25. listopad 2006 15:00 – 19:00

Začaly práce na antirooktikt kontrole. Zatím je hotovo jednoduché hledání skrytých procesů – žádný rootkit s tím však zatím nebude mít problémy.

 

26. listopad 2006 19:00 – 20:00

Nyní program dokáže zobrazit i privilegia jednotlivých procesů. Nefunguje to u některých systémových procesů (prý přístup odepřen).

 

2. prosinec 2006 15:00 – 18:00

Záložka Obecné ve formuláři „informace o procesu“ již plní svůj účel. Začaly práce na umožnění jazykových mutací Process Inspectoru.

 

5. prosinec 2006 15:00 – 18:00, 6. prosinec 2006 14:00 – 16:00

Pokračují práce na ovladači gmem.sys – už nedochází k BSoD. Usilovně se pracuje na anti-rootkit kontrole, ale výsledky zatím nejsou k ničemu. Opraven bug, který zajišťoval, že Process Inspektor žádný skrytý proces nenajde. Přidal jsem další metodu detekce skrytých procesů a objevil jsem chybu, díky níž program nachází „falešné“ skrytý procesy (jde o pozůstatky dříve ukončených procesů).

 

8. prosinec 2006 19:30 – 21:30

Vylepšena metody získávání exportovaných funkcí modulu. Modul je nahráván přímo z paměti cílového procesu (jádra) a i další informace kromě názvu funkce jsou validní. Zajistil jsem, aby program odinstaloval ovladač gmem.sys při ukončení. Díky vylepšení ssdt.dll program dokáže získat jména interních služeb OS. Začal vývoj ovladače logptm.sys.

 

9. prosinec 2006 20:00 – 22:00

Práce na modulu fm.dll – byly objeveny problémy při zobrazování obsahu souborů, namapovaných souborů a jiných částí paměti procesů. Opravy ještě nebyly úplně dokončeny.

 

24. prosinec 2006 10:00 – 16:00, 20:00 – 23:00

Z Process Inspectoru se stal na přechodnou dobu částečný rootkit (do té doby, než vytvořím samostatný rootkit). Implementace rootkitu umožňuje snadnější testování anti-rootkit kontroly (zatím ještě nechci testovat na „opravdových“ rootkitech). Rootkit umí skrývat procesy – v menu Procesy přibyla položka Skrýt. Byl vylepšen modul ssdt.dll. Program nyní testuje KeServiceDescriptorTable na přítomnost háků – a háky opravdu nachází. Dále bylo vylepšeno zobrazování SSDT – pokud je nějaká služba zahákovaná, vypíše se červeně. Při antirootkitové kontrole se od nynějška zkoumá i obsah SSDT.

 

25. prosinec 12:00 – 20:00, 26. prosinec 12:00 – 20:00, 27. prosinec 19:00 – 0:00

Intenzivní programování a psaní první přílohy dokumentace (o OS Windows NT). Opraveno spoustu chyb. Vylepšena antirootkit kontrola – detekuje skryté proces, ssdt a inline háky. Přibyla možnost uložit obsah paměti jádra na disk.

 

1. leden 2007, 19:00 – 22:00

Opraveny chyby znemožňující prohlížení oblastí paměti, souborů a namapovaných souborů. Zahájeny práce na formuláři, který bude zobrazovat informace o vláknech. Zatím problémy s technikou single step.

 

6. leden 2007, 16:00 – 22:00

Začal jsem pracovat na funkci zobrazování oken procesu. Je to celkem komplikovaný úkol, protože zjistit informace o oknech cizího procesu není lehké – některý informace je možno získat jen tehdy, běží-li vlákno v kontextu cílového procesu. Kromě tohoto faktu je tu ještě další překážka – desktopy. Pokud požádáte systém o seznam oken, vrátí vám všechna okna existující na desktopu volajícího vlákna. Některé procesy (jako třeba winlogon.exe) však běží na jiném desktopu (winlogon.exe na desktopu winlogon). Z těchto důvodů jsem nerozhodl použít poněkud invazivní techniku. Na nutnou dobu se do cílového procesu vloží DLL knihovna, která zajistí získání potřebných dat a odešle je Process Inspectoru.

 

7. leden 2007, 15:30 – 18:00

Po velkých problémech se podařilo zobrazování oken rozchodit. Krom toho jsem se dozvěděl několik zajímavých poznatků o programu winlogon.exe. Pozorný uživatel by díky Process Inspectoru mohl odhalit mnou napsaný proof-of-concept keylogger, který zachytává hesla zadávaná do přihlašovacího dialogu Windows.

Přidána funkce pro uložení virtuální paměti procesu na disk.

 

19. leden 2007, 17:00 – 21:00;  20. leden 2007, 12:00 – 19:00; 21. leden 2007, 15:00 – 20:00

Vylepšeno grafické rozhraní. Přidána možnost zobrazení podrobnějších informací o procesech, vláknech, modulech atd. Také byl vytvořen formulář, který se bude starat o spuštění nových procesů.

 

25. leden 2007, 15:00 – 18:00

Po velkém úsilí byla dokončena funkce na zobrazování oken procesu.

 

26. leden 2007, 15:00 – 22:00

Přidána možnost měnit prioritu procesů a vláken. Pokračují práce na ovladači logptm.sys a na modulu logptm.dll, který má zprostředkovat funkce ovladače. Zatím se podařilo zachytit ukončení nebo vytvoření procesu a předat data (zatím není jasné, zda úspěšně) z ovladače do aplikace.

 

27. leden 2007, 13:00 – 21:00

Pokračují práce na ovladači logptm.sys. Aplikace je nyní schopna zaznamenávat vytvoření a ukončení procesu a vytvoření a ukončení vlákna. Vyskytly se drobné problémy při ukončení programu, které snad budou co nejdříve odstraněny.

 

28. leden 2007 10: 00 – 10:30, 19:00 – 21:00

Snaha o řešení problémů při ukončení programu. Zatím bez výsledku. Kvůli zachování funkčnosti byla zablokována funkce pro registrování ukončení a vytvoření vlákna.

 

29. leden 2007, 19:00 – 21:00

Aplikace si nyní může zapamatovat moduly, které určitý proces používá. Červeně se vybarvují ty, které jsou od tohoto vzorce odlišné (proces používá některé moduly „navíc“).

 

1. únor 2007, 17:00 – 18:00, 22:00 – 23:30, 2. únor 2007, 13:00 – 14:00, 17:00 – 19:00

Podařilo se nalézt originální tabulku interních funkcí (SSDT), která se nachází na disku v souboru hlavní součásti jádra (ntoskrnl.exe). Díky tomuto úspěchu byla přidána funkce na opravení SSDT (odstranění přesměrování funkcí na jiné ovladače než ntoskrnl.exe). Zatím program není schopen odstranit „inline“ háky. Také se připravuje první prezentace projektu. Dále bylo vylepšeno GUI – přibyla kontextová menu.

 

4. února 2007, 18:00 – 20:00

Opět vylepšeno GUI. Pokud některou akci nelze v dané situaci učinit, příslušná položka v menu se znepřístupní.

 

5. únor 2007, 12:00 – 18:00

Vylepšena funkce pro zachytávání událostí. Program nyní zachytí jakékoliv zavedení modulu (DLL knihovny nebo SYS ovladače) do paměti. Je velmi zajímavé studovat pochody v systému např. při hibernaci nebo při vytváření nového procesu.

Také se snažím implementovat hák instrukce SYSENTER. Tato instrukce se provádí, když je třeba přepnout procesor do režimu jádra. SYSENTER zajistí přepnutí procesoru a pak předá řízení podprogramu na adrese, jenž se nachází v jednom z procesorových registrů. Hák je implementován tak, že obsah příslušného registru změním a tím je vždy předáno řízení mému podprogramu. Veškeré snahy o využití tohoto háku zatím selhávají, ačkoliv vlastní hák již funguje.

Problémy s monitorováním aktivity vláken stále přetrvávají, zřejmě v dokumentaci k DDK něco zamlčeli (nebylo by to ojedinělé – v DDK je například dokumentován jen malý zlomek funkcí, které jádro nabízí).

 

10. únor 2007, 11 únor 2007, 14:00 – 18:00

IMPLEMENTOVÁN SYSENTER HÁK!!!! Po dlouhých hodinách studování dokumentace se to konečně podařilo! Problém byl v tom, že registry procesoru nebyly příliš dobře nastaveny a tudíž některé API prostě volat nešlo. Druhý problém byl v tom, že kód háku běží na DISPATCH_LEVEL, tudíž nelze použít standardní synchronizaci, o což jsem se snažil. Hák nyní jen přesune získaná data do spojového seznamu, který zpracovává k tomu účelu neustále běžící vlákno. To už jede v PASSIVE_LEVEL, takže to může standardním způsobem (section + 2 eventy) před GUI aplikaci.

 

12 – 17. února 2007, min. 6 hodin denně

Implementován jednoduchý disassembler a vylepšena sekce „Informace o modulu“ (zobrazuje se výpis paměti modulu). Tvrdě se pracuje na dokumentaci, Návrh je téměř hotový a asi tak půlka příručky o Windows NT. Snad se to do 27. stihne…

 

18 – 22. února 2007, min. 5 hodin denně

Dokumentace hodně pokročila. Napsány části „Implementace“ a „Operační systémy rodiny Windows NT,“ pracuje se na příloze o rootkitech. Začal jsem psát i uživatelskou příručku. Bude ve formátu CHM. Opravena chyba díky které nefungovala záložka SSDT na systémech s běžícím jádrem ntoskrnl.exe (což je většina).

Byly prováděny testy na „skutečných“ rootkitech. Většina rootkitů byla stažena z www.rootkit.com. Testované rootkity většinou umí skrývat procesy – Process Inspector totiž nic moc jiného detekovat neumí. Jak to tedy zatím vypadá?

 

 

Plánuji vyzkoušet i některé malware rootkity jako je Rustock A a B.