Alternate Data Streams és blokkolt fájlok

Az NTFS rendelkezik egy érdekes képességgel: fájlokhoz hozzá tudunk biggyeszteni az „igazi” mellett további adatfolyamokat, ezeket hívjuk Alternate Data Stream -eknek (ADS). Ezt a lehetőséget a Windows és alkalmazások ritkán használják, leginkább az internetről letöltött blokkolt fájloknál találkozhatunk ezzel a technológiával. De előbb nézzük, hogyan tudunk ilyet létrehozni! Már a command prompttal is tudtunk ilyet csinálni. A meglevő üres ads.txt fájlhoz hozzábiggyesztek egy kis rejtett szöveget, amire aztán a „rejtett.txt” címkével tudok hivatkozni (lásd később):

c:\>echo "Titkos információ" > c:\PSKönyv\ads.txt:rejtett.txt

Ha kilistázzuk a fájlomat, akkor továbbra is üresnek tűnik:

PS C:\> dir .\PSKönyv\ads.txt

 

 

    Directory: C:\PSKönyv

 

 

Mode                LastWriteTime     Length Name

----                -------------     ------ ----

-a---       2014.08.16.     14:06          0 ads.txt

Ha tudjuk a címkét, akkor a restett tartalomhoz is hozzáférünk, ha legalább 3.0-ás PowerShell-t használunk:

PS C:\> Get-Content .\PSKönyv\ads.txt -Stream rejtett.txt -Encoding Oem

"Titkos információ"

Látható, hogy a Get-Content-nek immáron van egy –Stream paramétere is, amellyel ismert ADS-eket lehet kiolvasni. Mivel a rejtett szöveget a command prompt felhasználásával készítettem, itt az OEM kódolást kellett alkalmaznom az ékezetes karakterek helyes megjelenítéséhez.

Természetesen a Set-Content-el írni is tudunk ilyen ADS-t:

PS C:\> Set-Content .\PSKönyv\ads.txt -Stream másik.txt -Value "PowerShell"

PS C:\> Get-Content .\PSKönyv\ads.txt -Stream másik.txt

PowerShell

De hogyan találjuk meg azokat a fájlokat, amelyeknek van ADS-ük? A Get-Item-nek is szerencsére van ‑Stream paramétere, ráadásul használhatunk Jolly-Joker karaktereket a Stream nevében. A következő kifejezéssel például megtudom a ADS.TXT fájlom összes adatfolyamát:

PS C:\> Get-Item -Path C:\PSKönyv\ads.txt -Stream *

 

 

   FileName: C:\PSKönyv\ads.txt

 

Stream                   Length

------                   ------

:$DATA                        0

másik.txt                    12

rejtett.txt                  22

Látható, hogy a „:$Data” az igazi adatfolyam, a többi az ADS. Ezek után nem bonyolult egy általános ADS kereső-megjelenítő szkriptet megírni:

Get-ChildItem -Path C:\PSKönyv -Recurse | % {

    Add-Member -InputObject $_ -MemberType NoteProperty -Name Streams -Value (

            Get-Item -Path $_.fullname -Stream * |

                ?{$_.Stream -ne ':$DATA'} |

                    Select-Object -ExpandProperty Stream

        ) -PassThru

} | ?{$_.streams} | ft -Property name, streams -AutoSize

A fenti kis szkriptben kilistázom a fájljaimat, majd hozzáadok a fájlobjektumokoz egy olyan új tulajdonságot, ami a „:$DATAstream-en kívüli adatfolyamok neveit tartalmazza. A fájlokat megszűröm, hogy csak azok látszódjak, amelyeknek lesz ilyen nem üres Streams tulajdonságuk. Az eredmény valahogy így néz ki az én munkakönyvtáramban:

Name                            Streams                

----                            -------                

ads.txt                         {másik.txt, rejtett.txt}

VirtualBox-4.3.12-93733-Win.exe Zone.Identifier        

Az már látott ads.txt fájlom mellett még találtam egy VirtualBox telepítőt is, aminek egy Zone.Identifier adatfolyama van. Ez nem más, mint a Windows által a letöltött fájlokhoz rendelt biztonsági zónával kapcsolatos információ. Ebben a konkrét esetben ennek tartalma így néz ki:

PS C:\> Get-Content C:\PSKönyv\Zónák\VirtualBox-4.3.12-93733-Win.exe -Stream Zo

ne.Identifier

[ZoneTransfer]

ZoneId=3

Ez tehát egy pici INI fájl, amiben a ZoneTransfer szekció a ZoneID=3-at tartalmazza. A 3-as zóna az internetet jelenti, és az ilyen fájlok alaphelyzetben blokkolt fájlként látszódnak a fájlböngészőben:

111 . ábra Internetről letöltött fájlok

Ha ezek után megnyomjuk az „Unblock” gombot, akkor a Windows letörli a Zone.Identifier adatfolyamot. Ezt mi magunk PowerShellből is megtehetjük akár a megfelelően felparaméterezett „Remove‑Item ‑Stream” cmdlettel, vagy a PowerShell 3.0-tól már rendelkezésünkre áll az Unblock‑File  cmdlet is.



Word To HTML Converter