Zobaczymy, co dzieje
się przy skasowaniu plików /dirX/file.xxx
1. Kasowanie pliku zaczyna się od odczytu pierwszego sektora systemu plików i
praca z boot sektorem dla wyliczenia rozmiaru klastera i początkowego adresu MFT
i rozmiaru MFT zapisu.
2. Odczyt z MFT pierwszego zapisu (plik $MFT) i obliczenie według tego zapisu
wyjaśniając strukturę pozostałych zapisów MFT, informacja przechowywana jest w
atrybutach $DATA
3. Dalej potrzebne jest odnalezienie katalogu dirX, dla tego musimy odczytać
zapis MFT katalogu ROOT i przechodzimy po index'ie w atrybutach $INDEX_ROOT i
$INDEX_ALLOCATION. Ze znalezionego elementu dirX bierzemy adres zapisu MFTxxx i
odświeża się czas ostatniego zgłoszenia do folderu.
4. Pracujemy z atrybutem $INDEX_ROOT zapisu MFTxxx i szukamy w nim elementu
file.xxx., wyjaśniamy, że adres MFT pliku jest pod zapisem MFTxxy.
5. Zapis wyklucza się z indexu, elementy węzła przesuwają się i zamieniają
poprzedni element. Dla folderu odświeża się czas ostatniego zgłoszenia.
6. Zapis MFTxxy wyswobodzony zostaje przez zrzucenie flagi użytkowania. Tak samo
opracowany jest atrybut $DATA pliku $BITMAP, i w nim zerujemy bit danego zapisu.
7. Obrabiamy nierezydentne atrybuty zapisu MFTxxy, klastery należące do niego
uwalniają sie w bitowej mapie pliku \$Bitmap. W naszym konkretnym przykładzie to
np. klastery xxx i xxxx.
8. W każdym z wymienionych etapów może być robiony zapis do dziennika systemu
plików $LogFile i dziennika zmian \$Extend\$Usr\JRNL. Jeżeli w systemie są
quoty, nowy rozmiar pliku quoty użytkownika wylicza się w pliku \$Extend\$Quota.
Zwróćcie uwagę: przy kasowaniu plików w NTFS Windows nie kasuje odnośników, i
związki pomiędzy zapisem MFT i klasterami zostają, związek pomiędzy nazwa pliku
i zapisem MFT tez by pozostał, jeżeli zapis nie był by utracony w skutek
sortowania.
Odzyskiwanie plików.
Odzyskiwanie skasowanych plików w NTFS jest łatwiejsze
niż w większości pozostałych systemów plików. Przy kasowaniu pliku jego nazwa
jest wykluczona z indexu foldera rodzicielskiego, wyswobadza się zapis MFT I
zajęte przez niego klastery. Przy tym komponent Microsoft nie kasuje zawartości
odnośników chociaż wykluczyć takiej możliwości w kolejnych wersjach Windows nie
można. NTFS ma jedną wielką wadę: przy wykluczeniu nazw plików z indexu
rodzicielskiego folderu index sortowany jest od nowa, i informacja o nazwie
plików może być utracona. Chociaż taka wada może być po części kompensowana tym,
że wszystkie zapisy MFT są trzymane w jednej tabeli, co ułatwia odnalezienie
wszystkich wolnych zapisów. Oprócz tego każdy zapis jest w atrybutach $FILE_NAME
z bazowym adresom rodzicielskiego folderu, a to oznacza ze przy odnalezieniu
wolnego zapisu można wyliczyć jego całą ścieżkę dostępu, jeżeli tylko zapisy w
rodzicielskich katalogach nie są powtórnie zajęte nowymi plikami lub folderami.
Druga czynność przy odzyskiwaniu – szukać dodatkowych atrybutów $DATA.
Żeby odzyskać wszystkie skasowane pliki w systemie plików NTFS, potrzebnie jest
odnalezienie w MFT wolnych zapisów, już po odnalezieniu wolnych zapisów nazwa
jest zapisana w atrybucie $FILE_NAME i adresie rodzicielskiego foldera.
Odnośniki do klasterów ciągle istnieją, i jeżeli dane jeszcze nie byli nadpisane
można je odzyskać bez trudu nawet przy mocnej fragmentacji skasowanych plików.
Jeżeli znaczenie atrybutu było rezydentne dane nie będą nadpisywane do kolejnego
wydzielenia tego zapisu MFT. Jeżeli dla przechowywania atrybutów pliku
potrzebnie było więcej niż jeden zapis MFT dla pełnego odzyskania mogą być
potrzebne pozostałe zapisy. W Windows dla zapisów MFT wykorzystywany jest
algorytm zaznaczenia pierwszego wolnego zapisu, dla tego MFT zapisy z małymi
numerami są przepisywane częściej niż z wielkimi. Przy odzyskiwaniu mogą być
przydatne dane dziennika systemu plików lub dziennika zmian (dziennik zmian nie
zawsze jest aktywny, ale w nim można odnaleźć czas skasowania lub redagowania
pliku).
Teraz już można konstatować, ze z odzyskiwaniem w NTFS poradzi sobie byle jaki
program z istniajacych na rynku, tylko trzeba przytrzymać się niektorych
obowiązkowych szczegółów.
ext3: Ten system plików niczym prawie nie rożni się od ext2 za wyjątkiem
niektorych szczegółów i tego ze jest "jurnaled filesystem"( data=writeback,
data=ordered, data=journal). 3 tryby księgowania tego systemu plików
1. data=writeback - w tym trybie system plików nie prowadzi jakiegokolwiek
księgowania.
2. data=ordered - tryb data=ordered księguje tylko metadane. W tym trybie bloki
metadanych i dane zapisywane do wspólnego modułu (transaction), przed nagraniem
nowych metadanych dane związane nagrywane są jako pierwsze.
3. data=jurnal - w tym trybie księguje się wszystko i metadane i dane, wszystkie
nowe dane najpierw zapisywane są do księgi i tylko po tym zapisywane na swoich
fizycznych miejscach na dysku.
Jak odzyskać dane skasowane w ext3, w takim przypadku ext2 w odróżnieniu od ext3
po prostu zaznacza odnośniki do bloków jako nieużywane a w ext3 odnośniki są
zerowane. Także odzyskiwanie danych skasowanych w ext3 będzie możliwe tylko
przez szukanie plików po „grep“ sygnaturach plików . Do tego jest najlepszym
softem DataExtraktor BVG HRT DRE lub ACELAB, tryb raw recovery, dla odzyskiwania
plików skasowanych w ext2 można użyć
soft r-studio czy
stellar for linux
i już wcześniej podane narzędzia profesjonalne i tp.
Teraz popatrzymy co dzieje sie przy formatowaniu dysku NTFS
NTFS formatowanie dysku :
Buduje się boot-sektor w formacie ntfs
Generuje się nowy seryjny numer dysku i zapisuje się w boot sektor, offset 48h
Oblicza się nowa suma kontrolna boot-sektor i zapisuje się offset 50h,
Buduje się nowy plik MFT, zawierający informacje o wszystkich plikach na dysku i
zazwyczaj zapisuje się nadpisując stary plik MFT (wyjątków tu nie ma). We
wszystkich przypadkach pierwsze ~24 zapisy (File Record) będą zniszczone
bezpowrotnie.
W tych zapisach znajduje sie sam $MFT, $MFTMirr, folder root, /$LogFile - plik
transakcji,/$BITMAP - mapa wolnej przestrzeni,/$Secure- deskryptory
bezpieczeństwa i inne służbowe pliki
Inicializuje się $MFT:$DATA - ustala się nowa długość ($MFT:$30.AllocatedSize, $MFT:$30.RealSize,
$MFT:$80.AllocatedSize, $MFT:$80.RealSize, $MFT:$80.CompressionSize, $MFT:$80.InitializedSize,
$MFT:$80.LastVCN), data/czas zbudowania/ostatniej modyfikacji ($MFT:$10.FileCreationTime,
$MFT:$10.FileAlertedTime, $MFT:$10.FileReadTime, $MFT:$30.FileCreationTime, $MFT:$30.FileAlertedTime,
$MFT:$30.MFTChangeTime, $MFT:$30.FileReadTime) i najważniejsze, buduje się nowy
spis odcinków (data-runs), bezpośrednio nadpisując stary, a to oznacza ze
zbierać fragmentowany $MFT trzeba będzie po kawałkach
Buduje się nowy /$BITMAP-plik odpowiedzialny za podzielenie przestrzeni dyskowej
(wolne i zajęte klastry) znowu nowa zawartość nadpisuje stara, ale to tez można
odzyskać z chkdsk.
Buduje się nowy plik dziennika transakcji - /$LogFile,
Do nagłówka zapisu $MFT wprowadza się nowy LogFile Sequence Number w skrócie LSN;
$MFT naznaczany jest nowy numer kolejności aktualizacji (Update Sequence Number);
Buduje się lustro $MFTMirr, bezpowrotnie zacierająca stare (znajduje się po
środku partycji NTFS ),
Budują się nowe /$Volume, /$AttrDef i inne pliki służbowe.
Przeprowadza się sprawdzenie powierzchni i wszystkie odnalezione uszkodzone
klastry zapisywane do pliku /$BadClus;
Formuje się nowy folder root
Jeżeli do formatowania partycji istniał /System Volume Information-plik, to on
po prostu odnawia się, w przeciwnym razie /System Volume Information buduje się
tylko po restarcie komputera;
Jak widać po formacie zostają wszystkie dane, które były na dysku, tylko z
wyjątkiem niektorych szczegółów samych metadanych zmiana których utrudnia
odzyskiwanie , ale nie na tyle, żeby to było niemożliwe.
Przy tym klasyczna metoda zerowania za pomocą MHDD niszczy dane całkiem,
nadpisując bezwzględnie każdy sektor zerami, softowe kasowanie można liczyć na
dzień dzisiejszy za jeden z najbardziej dostępnych i najskuteczniejszych. Mozę
nie jest najszybszy , ale używając odpowiednich metod można to przyspieszyć,
przy tej samej skuteczności niszczenia danych.
Teraz trochę info, jak można odbudować
sformatowana partycje NTFS bez jakichkolwiek narzędzi dodatkowych, tylko dowolny
edytor dyskowy (może być i zwykły hex edytor w parze z MHDD, komendy atof i ff
pomogą odczytać i zapisać sektory po edycji na dysk). Jednym slowem darmowe odzyskiwanie danych ze sformatowanej partycji
NTFS bez potrzeby kopiowania na inny nosnik (unformat NTFS recznie).
Naszym celem będzie ręczne odzyskiwanie danych całej sformatowanej partycji NTFS
bez jakichkolwiek dodatkowych narzędzi dla odzyskiwania danych , wszystko co
będzie potrzebne to dowolny edytor dyskowy z takich najlepszym jest
DiskExplorer for
NTFS no i chkdsk (słynny zabójca partycji może posłużyć do ich
ratowania po formacie).
W trakcie formatowania przeprowadza się bezpowrotne zniszczenie większości
kluczowych struktur metadanych - danych, które ręcznie odzyskiwać byłoby bardzo
ciężko, tego właśnie i nie potrzeba . Cały sens jest w tym, żeby przywrócić
partycji utracone zapisy systemu plików, a pozostała prace niech robi chkdsk .
Jedyna struktura danych bez której nie może pracować chkdsk jest atrybut $DATA
pliku $MFT. Dlatego nam potrzebne jest odbudować poprzedni $MFT:$DATA i ulokować
go zamiast ewentualnych zapisow . Jeżeli $MFT:$DATA nie jest fragmetowany, to
można zrobić prosto powiększeniem jego długości. Jak to zrobić ?
Odpalamy DiskExplorer for NTFS wchodzimy na pierwszy sektor MFT(Goto -> Mft),
klikamy na $MFT pliku i w atrybucie $DATA (80h) powiększamy znaczenia pola
Allocated Size/Real Size/Compressed Size na potrzebna ilość równolegle korygując
spis odcinków (run-list). Jak wyliczyć długość pliku MFT? Ona równa się różnicy
pierwszego i ostatniego sektora, w których znajduje sie sygnatura FILE.
Prawidłowa długość pliku MFT wyliczać nie ma potrzeby, wystarczy wziąć długość
większa, niepotrzebna wyrzuci chkdsk (i lepiej brać więcej niż mniej)
DiskExplorer for NTFS nie pozwala redagować pola i dlatego potrzebne jest
przełączenie w tryb hex editora i szukać offsety wszystkich wartości
samodzielnie. Odnalezienie nagłówka atrybutu $DATA jest bardzo proste: na jego
początku zawsze znajduje się kolejność 80 00 00 00 xx 00 00 00 01. W NTFS wersji
3.0 ona ulokowana z offsetem F8h od początku pola sektora. Pole Real Size we
wszystkich wersjach NTFS ma offset 30h odnośnie nagłówka, a pole Allocated Size
i Initialized Size po offsetom 28h/38h bajt, przy czym znaczenia Allocated Size
musi być obowiązkowo wielokrotnością rozmiaru klastra . Najważniejszym jest,
żeby przy formatowaniu był ten sam rozmiar klastra inaczej z tego co chcemy
zrobić nic nie wyjdzie, jeżeli już wyszło tak, ze dysk został sformatowany z
innym rozmiarem klastra, to nic innego nie pozostaje, jak sformatować z kluczem
/A:x, gdzie x rozmiar klastra.
Teraz potrzebne jest wygenerowac nowy run-list. Zazwyczaj on bedzie wygladal tak
13 XX XX XX YY 00, gdzie XX XX XX - trzybajtowy rozmiar $MFT w klastrach, a YY –
poczatkowy klaster. Klaster poczatkowy zawsze musi wskazywac na pierwszy klaster
MFT, w przeciwnym razie chkdsk nie bedzie mogl pracowac. Jezeli nowy run-list ma
wieksza dlugosc niz terazniejszy, potrzebne jest korygowanie dlugosci naglowka
atrybutu (ulokowany po offsetu 04h od jego poczatku). Przeprowadzic taka
nieciezka opieracja, odpalamy chkdsk z kluczem /F i poczekamy poki on przywroci
nasze foldery i pliki. Jedyna rzecz, ktora nie odbuduje chkdsk to deskryptory
bezpieczestwa (wszystkim folderom i plikom naznaczane domyslne prawa dostepu).
Pliki zsylajace sie na nieistniajace foldery ulokowany beda do folderow Found
xxx (to mozna powiedziec sa pliki wyciagniete z tamtego swiata).
Najgorzej jest z odzyskiwaniem danych z partycji, ktorej MFT mocno fragmetowany,
jezeli poprzedni run-list przy formatowaniu bedzie zniszczony bezpowrotnie. Nic
innego nie pozostaje, jak zbierac pliki recznie z kawalkow fragmentow. Brzmi to
straszniej, niz wyglada. W odroznieniu od pozostalych plikow na dysku, plik $MFT
posiada bardzo dobra signatura FILE, ktora jest na poczatku kazdego zapisu
systemu plików. Wszystko, co będzie nam potrzebne, po kolei przeskanować
partycje od pierwszego klastra do ostatniego i zapisać początek i koniec każdego
fragmentu $MFT. Juz kiedy fragmenty beda wypisane, musimy z tego łańcucha
wykluczyć $MFTMirr (jest ulokowany po środku partycji i zawiera kopie zapisów $MFT,
$MFTMirr, $LogFile i $Volume, przy tym $MFTMirr ma odnośnik i na siebie samego).
Wygląda run-list mniej więcej tak np. mamy 04h - 427h, 946h - 1078h, 1786 -
1113h temu będzie odpowiadał taki run-list 12 27 04 04 22 78 10 46 09 22 13 11
86 17 00.
To jest przedstawienie na czarno dlatego, ze nie znamy kolejności, w której były
ulokowane odcinki w pliku. Co będzie, jeżeli porządek w pliku $MFT będzie inny?
W samym MFT wszystkie zapisy maja odnośniki na kolejne zapisy po swoim
porządkowym numerze przedstawiającym indeks masywu. Te odnośniki potrzebne dla
odzyskiwania struktury folderów, uporządkowania hard-linków. Odnośniki na
macierzysty folder dublowane w indeksach i odzyskują się bardzo prosto. Hard
linki niszczą się bezpowrotnie (no tylko jeżeli spróbować zebrać $MFT odcinki w
innym porządku). Największym problemem w takim przypadku są pliki, które same są
bardzo mocno fragmentowane, a ich zapisy porozrzucane po rożnym fragmentach $MFT.
Tu pozostaje tylko poprawne ustawienie fragmentów (zazwyczaj tych kombinacji
jest nie tak dużo, ale to jest uzależnione od faktycznego rozmiaru klastra .
Bywa ze niektórzy admini konfigurują sam ntfs zaczynając od rozmiaru klastra i
ustawiając go równym 1 sektorowi. To jest jeden z największych błędów niedający
jakiegokolwiek efektu jak ze względu oszczędzenia miejsca na dysku, a ze względu
fragmentacji dający taki efekt, ze na jednej partycji niewielkiego rozmiaru może
być do kilku tysięcy fragmentów pliku $MFT.) . W nowej wersji NTFS 3.1 (WIN XP )
numery zapisów $MFT chronione w jawnie po offsecie 2Ch od początku FILE zapisu).