Pisałem już o wykorzystaniu Prefetch w celu uzyskania informacji na temat uruchamianych na danym komputerze procesów, oraz określenie pierwszej i ostatniej daty ich uruchomienia. Teraz krótki przykład, jak stworzyć timeline zmian w plikach na dysku (zakładam użycie NTFS).
Kiedy TO się stało, czyli o timeline zmian na dysku
Jeśli zachodzi sytuacja, którą należy zbadać (na przykład wlazł jakiś malware), ważne jest ustalenie zmian, które zostały w systemie poczynione. Datę uruchomienia podejrzanego procesu można ustalić na podstawie informacji z prefetch lub z logów systemowych. Potrzebny jest sposób na łatwą i szybką analizę zmian zachodzących na dysku. Na przykład:
- plików ostatnio używanych,
- plików tworzonych ostatnio, lub w określonym czasie,
- plików modyfikowanych ostatnio, lub w określonym czasie,
Każdy plik na NTFS ma trzy znaczniki czasowe:
- datę utworzenia (CreationTime),
- datę modyfikacji (LastWriteTime),
- datę dostępu (LastAccessTime),
Choć te znaczniki nie są niemodyfikowalne, to często na ich podstawie można ustalić kolejność zachodzących zdarzeń.
Narzędziem do analizy może być LogParser. Pozwala ono na tworzenie zapytań SQL dla wielu formatów wejściowych danych i prezentowanie ich w jednym z wielu formatów wyjściowych. W praktyce daje to takie możliwości, jakby analizowane dane znajdywały się w bazie danych, choć oczywiście język SQL implementowany w LogParser jest uproszczony, niż w przypadku Braci Większych.
Zebranie danychChoć LogParser wspiera format wejściowy FS (FileSystem), to każdorazowe uruchamianie zapytania na tym formacie mija się z celem. Lepiej jest zrobić "zdjęcie" systemu na przykład do formatu CSV i później pracować na tych danych.
Warto się również zdecydować w jaki sposób zebrać te dane, by nie naruszyć stanu badanego obiektu. Można zrobić na przykład obraz badanego dysku i wszystkie operacje wykonywać montując go na przykład w VMWare Player. Jeśli nie trzeba wykonywać aż takich akrobacji, to po warto się upewnić, że zebranie danych nie spowoduje aktualizacji LastAccessTime na badanych plikach. W tym celu format FS ma dodatkowy parametr -preserveLastAccTime:ON. Domyślnie jego wartość to OFF, co powoduje, że każdy "odwiedzony" przez LogParser plik będzie miał zaktualizowaną datę ostatniego dostępu. Zmiana tego zachowania pozwala na ograniczenie wpływu procesu zbierania danych na stan systemu.
Jak powinno wyglądać zapytanie? Najprościej jest zrobić coś w tym stylu:
logparser "SELECT * INTO e:\output.csv FROM c:\*" -i:FS -preserveLastAccTime:ON
Po pewnym czasie (nie oszukujmy się, chwilę czasu to zajmie) otrzymamy plik CSV, w którym będą zawarte zebrane dane. W celu uzyskania informacji na temat pól dostępnych w pliku, można wykonać polecenie:
logparser -h -i:csv e:\output.csv -headerRow:on
Wiedza ta przyda się przy budowaniu zapytań.
I przykład analizyJak znaleźć plik EXE w %programfiles%, który został ostatnio zmodyfikowany? Proste, wystarczy takie zapytanie:
logparser "SELECT TOP 10 LastAccessTime, LastWriteTime, CreationTime, Path FROM e:\output.csv WHERE Path LIKE '%program%files%.exe' ORDER BY LastWriteTime DESC" -o:datagrid
Prawda, że proste?
Pisałem o wykorzystaniu atrybutu LastAccessTime w celu ustalenia czasu zaistnienia pewnych zdarzeń w systemie. Dotyczyło to systemu plików na NTFS. Co ciekawe również rejestr systemowy utrzymuje pewien interesujący atrybut.A imię jego to LastWrite
Przesłany: Apr 07, 19:43