Co mówi Prefetch?
W Windows XP pojawił się Prefetch. Można o niej przeczytać między innymi tutaj. Autorzy tego artykułu gwarantują, że będzie merytorycznie, a nie marketingowo. Swoją drogą w zamierzchłych czasach wchodzenia na rynek Windows XP (Tomek, pamiętasz, jak pisaliśmy książkę?) system ten był atakowany, jako “wizualnie podrasowany Windows 2000”. Ten artykuł wyraźnie pokazuje, że tak nie było. I analogicznie jest teraz, gdy Windows Vista jest “niczym więcej jak XP z glutożerkami”. Ale wracając do tematu, poza zwiększeniem wydajności systemu, Prefetch jest przydatny w przypadku, gdy trzeba zbadać co się stało w systemie (bo ktoś/coś wlazło).
To co mówi ten Prefetch?
Pliki związane z prefetch znajdują się w %25systemroot%25\Prefetch. O ile mechanizm ten nie jest wyłączony, to uruchomienie praktycznie każdego procesu powoduje albo utworzenie nowego pliku, albo aktualizację już istniejącego. Co prawda pliki w %25systemroo%25\prefetch nie zostają na wieki, ale jeśli proces jest uruchamiany często (a w przypadku wszelkiego rodzaju malware tak zapewne jest), to plik taki może istnieć dłuuuugo. Mój najstarszy plik w prefetch jest datowany na 1 sierpnia 2006, co jest nawiasem mówiąc, datą instalacji systemu na tym komputerze (HKEYLOCALMACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion, wartość InstallDate).
Teraz niejawnie zakładam, że Windows XP jest instalowany na NTFS. Instalacja systemu z rodziny NT na FAT jest proszeniem się o kłopoty (choćby brak ACL). Na NTFS dla każdego pliku dostępne są trzy znaczniki czasowe:
- data utworzenia,
- data modyfikacji,
- data ostatniego dostępu,
Data ostatniego dostępu jest tutaj zresztą najmniej istotna. Jest to co prawda data ostatniego dostępu do pliku, ale co to tak naprawdę oznacza? Najprościej sprawdzić eksperymentalnie. Najpierw przykładowy, stworzony specjalnie na tą okoliczność plik:
MFT Entry Header Values: Entry: 30 Sequence: 15 $LogFile Sequence Number: 156243297 Allocated File Links: 1
$STANDARD_INFORMATION Attribute Values: Flags: Archive Owner ID: 0 Created: Thu Feb 21 22:35:31 2008 File Modified: Thu Feb 21 22:35:31 2008 MFT Modified: Thu Feb 21 22:35:31 2008 Accessed: Thu Feb 21 22:35:31 2008
$FILE_NAME Attribute Values: Flags: Archive Name: test.txt Parent MFT Entry: 27 Sequence: 11 Allocated Size: 0 Actual Size: 0 Created: Thu Feb 21 22:35:31 2008 File Modified: Thu Feb 21 22:35:31 2008 MFT Modified: Thu Feb 21 22:35:31 2008 Accessed: Thu Feb 21 22:35:31 2008
Attributes: Type: $STANDARDINFORMATION (16-0) Name: N/A Resident size: 72 Type: $FILENAME (48-2) Name: N/A Resident size: 82 Type: $DATA (128-1) Name: $Data Resident size: 7
A teraz ten sam plik po wywołaniu na nim prostego polecenia type , czyli nie ma modyfikacji pliku, jest tylko jego otwarcie i odczytanie zawartości.
MFT Entry Header Values: Entry: 30 Sequence: 15 $LogFile Sequence Number: 156248438 Allocated File Links: 1
$STANDARD_INFORMATION Attribute Values: Flags: Archive Owner ID: 0 Created: Thu Feb 21 22:35:31 2008 File Modified: Thu Feb 21 22:35:31 2008 MFT Modified: Thu Feb 21 22:35:31 2008 Accessed: Thu Feb 21 22:42:58 2008
$FILE_NAME Attribute Values: Flags: Archive Name: test.txt Parent MFT Entry: 27 Sequence: 11 Allocated Size: 0 Actual Size: 0 Created: Thu Feb 21 22:35:31 2008 File Modified: Thu Feb 21 22:35:31 2008 MFT Modified: Thu Feb 21 22:35:31 2008 Accessed: Thu Feb 21 22:35:31 2008
Attributes: Type: $STANDARDINFORMATION (16-0) Name: N/A Resident size: 72 Type: $FILENAME (48-2) Name: N/A Resident size: 82 Type: $DATA (128-1) Name: $Data Resident size: 7
Jak widać w sekcji $STANDARD_INFOMATION zmienia się wartość parametru Accessed. Swoją drogą aktualizacja informacji o ostatnim dostępie do pliku jest domyślnie wyłączona w Windows Vista, a w Windows XP można wyłączyć ją przy pomocy polecenia fsutil. Podnosi to wydajność (odpowiednik opcji noatime przy montowaniu filesystemu w *nix), choć z drugiej strony w większości przypadków różnica nie będzie zauważalna.
Wracając do tematu, w przypadku plików zawartych w %25systemroot%25\prefetch oznacza to, że wartość Accessed może, ale wcale nie musi, oznaczać ostatnie użycie pliku przez system, a więc datę ostatniego uruchomienia procesu. Zamiast tego można wykorzystać datę ostatniej modyfikacji pliku. Każde uruchomienie procesu powoduje zwiększenie licznika uruchomień danego procesu, a więc modyfikację pliku. Tak więc na postawie daty ostatniej modyfikacji pliku można wysnuć informację odnośnie daty ostatniego uruchomienia procesu. Na podstawie daty utworzenia pliku natomiast, można wnioskować kiedy proces został uruchomiony po raz pierwszy. W przypadku, gdy trzeba ustalić co i kiedy się stało, ta informacja może być nad wyraz przydatna.
Swoją drogą na wszystkich moich komputerach włączam śledzenie Detailed Tracking w zdarzeniach typu Security. Ale i tak wówczas informacja pozyskana z prefetch może pokazać gdzie zacząć szukać (w sensie czasu).
To jak to obejrzeć?
Daty utworzenia, modyfikacji i ostatniego dostępu można podejrzeć oczywiście w Explorerze, można również wykorzystać do tego polecenie dir , gdzie przy pomocy opcji /T można kontrolować, która wartość jest wyświetlana i używana do sortowania. Można również użyć przyjemnego programu Windows File Analyzer, który poza informacjami o dacie utworzenia, dostępu i modyfikacji, poda również informację o ilości uruchomień poszczególnych procesów (czyli wartość licznika zawartą w pliku). Przy okazji warto pamiętać, że użycie WFA jednocześnie spowoduje aktualizację wartości informującej o ostatnim dostępie do pliku, bo w celu odczytania informacji z licznika, plik należy otworzyć. Ot taka wersja znanej prawdy, że obserwacja zakłóca stan obserwowanego układu. I dlatego warto wszelkie badania wykonywać offline (czyli na kopii dowodów), a oryginał gdzieś zamknąć. To oczywiście z dokładnością do sytuacji, gdy trzeba przeprowadzić analizę online, a przynajmniej zebrać online część informacji, ale to już zupełnie inny temat.
Oryginał tego wpisu dostępny jest pod adresem Co mówi Prefetch?
Autor: Paweł Goleń