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 „:$DATA” stream-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.