19.01.2010

ADS : Alternate Data Streams

NTFS dosya sisteminde bir dosya birden fazla veri akışından (data stream) oluşabilir. Bir akış güvenlik bilgilerini tutarken, diğeri asıl dosya verisini tutar. Bunların dışında bir dosyaya bağlı başka veri akışları da olabilir. Böyle karışık teknik bir cümlenin özeti, Windows Gezgini ile veya dir komutu ile gördüğünüzden daha fazla bilgi diskinizde bulunabilir. Bunlara alternate data streams (diğer veri akışları) denir, ADS diye kısaltılır. Bu aslında sadece NTFS'e özgü bir nitelik değildir. Diğer gelişmiş dosya sistemlerinde de bu veri bölümleri vardır ve genel olarak fork olarak adlandırılırlar.

ADS'lerli ilginç yapan nokta, bu veri akışlarında yaratılan/saklanan verilerin "görünmez" olmasıdır. Windows Gezgini'nde dosyaları gizlemek gibi değil bu; biraz daha farklı. Genelde işletim sistemi ile ilgili özel bilgiler burada tutulur (örneğin Windows XP, SP2'den sonra internetten download edilen dosyaların nereden download edildiği bilgisini ADS'de tutar). Ama bazen de bir virüsün veya başka zararlı bir kodun saklanacağı bir yer haline gelebilir.

Bir ADS, bir dosya veya klasöre bağlı yaratılır. Bağlı olduğu nesne silinirse ADS de silinir. Ama Windows, ADS'lerle ilgilenebilmek için yeterli araçları sunmaz. Yani bağlı olduğu nesneye dokunmadan ADS'yi silmek için başka araçlar kullanmak gerekir.

Örnek olarak Windows Hesap Makinesini, Not Defteri'nin ADS'sine yazalım ve bu şekilde çalıştıralım. Orijinal sistem dosyalarını bozmamak için iki dosyanın da birer kopyasını masaüstünde Deneme adlı bir klasöre kopyalayıp burada çalışalım.


Yukarıdaki resimde de görüldüğü gibi Deneme klasörüne iki araç ve bir dll daha kopyaladı. Bu araçlar, muhteşem Sysinternals araçlarından ikisi: streams.exe ve psexec.exe. Streams, ADS'lerin varlığından bizi haberdar edip, aynı zamanda onları silebiliyor da. psexec.exe çok faydalı bir araçkiti olan pstools'un bir parçası. Genel olarak uzak bilgisayarlarda bir süreç başlatmak için kullanılıyor. Ama ben bunu yerel bilgisayarda ADS'deki calc.exe'yi çalıştırmak için kullanacağım. pdh.dll ise pstools'un ortak dll dosyası; psexec'in çalışması için gerekli. Yukarıdaki resimde streams'i kullanarak mevcut durumda notepad.exe ve calc.exe dosyalarının ADS'leri olmadığını gösterdim. Bunun için şu komutu kullandım:
streams *
Bundan sonraki adımda calc.exe'yi, notepad.exe'nin ADS'sine gizleyeceğim. Bunun için şu komutu kullandım:
type calc.exe > notepad.exe:calca.exe
Notepad.exe'nin ADS'sinde yarattığım hesap makinesinin ismi için özellikle calca.exe (calc.exe yerine) kullandım, ayırt edebilmek için. Daha sonra da ADS'nin varlığını yine streams.exe'yi kullanarak doğruladım, aşağıdaki resmimde görüldüğü gibi.

ADS'e yerleşen calca.exe'nın boyutunun, orijinal Windows Hesap Makinesi calc.exe'nin boyutuna eşit olduğuna dikkat. Şimdi psexec'i kullanarak calca.exe'yi başlatalım.
psexec -d notepad.exe:calca.exe


psexec için kullandığım -d switch'i don't wait, yani bekleme anlamındadır. Yani komut satırında enter'a bastığımızda çalıştırmak istediğimiz programın sonlanmasını beklemeden hemen geri döner. Daha sonra şu şekilde çalıştırılabileceğini de öğrendim:
start ./notepad.exe:calca.exe
Bu resimde Task Manager ile Process Explorer'da listelenen notepad.exe:calca.exe sürecine dikkat! Görüldüğü gibi Windows Hesap Makinesi çalışıyor, ama bu hesap makinesi Deneme klasöründeki calc.exe değil, notepad.exe'ye bağlı olarak yaratılan ADS'nin içindeki calca.exe. Ayrıca süreç listesinde notepad.exe de görülüyor ama çalışan notepad'in kendisi değil, ADS'sindeki dosya.

Şimdi, istenmeyen bir ADS verisi tespit ettik. Ne yapmak gerek? Bunun için de streams aracını -d anahtarı ile kullanacağız. Öncelikle bu sürecin halen çalışıp çalışmadığını kontrol etmek gerek. Eğer çalışıyorsa çalışan süreci sonlandırmalıyız.
streams -d notepad.exe
Bu komut, notepad.exe dosyasına bağlı ADS'leri siler. Verilen bir klasörün içindeki ve alt klasörlerindeki tüm dosyaların (varsa) ADS'lerini silmek için şu komut uygun olacaktır:
streams -d -s D:\Veriler
Bir de text dosyaları ile uğraşmak var. Örneğin gorunur.txt adındaki normal bir dosyanın ADS'sinde gizli.txt adında bir dosya oluşturmak için şunları yapmak gerek:

echo Bu dosya normal bir txt dosyasi > gorunur.txt
echo BU GIZLI BIR DOSYA > gorunur.txt:gizli.txt
Aşağıdaki komutla önce ADS'nin varlığını doğrulayalım:
streams *
  :gizli.txt:$DATA 21
Şimdi de önce gorunur.txt'nin içeriğini komut satırından görelim:
type gorunur.txt
Bu dosya normal bir txt dosyasi
Ancak, gizli.txt dosyasının içeriğini görmek istediğimizde aynı yöntem işe yaramayacak.
type gorunur.txt:gizli.txt
Dosya adı, dizin adı veya birim etiketi sözdizimi hatalı.
Bunun yerine şu şekilde içeriği görüntüleyebiliriz:
more < gorunur.txt:gizli.txt
BU GIZLI BIR DOSYA
Peki, elimizde ADS dosyası tek başına bir dosya sistemi nesnesi olarak bulunmuyorsa bu veriyi nasıl bir dosyaya kopyalarız? Şunu demek istiyorum: Hiçbir dosya veya klasörün ADS'si olmayan, normal bir dosya sistemi dosyası gizli.txt'yi nasıl yaratırız? Veya elimizde orijinal calc.exe yoksa notepad.exe'nin ADS'sindeki çalıştırılabilir dosyayı nasıl alıp normal bir dosya yaparız? Eğer konu text dosyasıysa çözümü Windows içinde bulabiliriz:
more < gorunur.txt:gizli.txt > gizli.txt
Bulunduğumuz klasörde gizli.txt adında bir dosya oluşturuldu. Peki ikilik veri durumunda ne yapılabilir? Benim bulduğum çözümlerden biri, NirSoft'un AlternateStreamView aracını kullanmak. Bu araç, grafik arayüze sahip bir araç. Programı çalıştırdıktan sonra bir klasör belirtip içindeki ADS'leri tarayarak, bulunanlardan birini sağ tıklayarak açılan menüden "Export Selected Streams to..."yu seçerek bunu yapabiliriz.


Bu işlermin sonucunda notepad.exe_calca.exe dosyası oluşturuldu. Yeni dosyamız da orijinal calc.exe'nin byte byte kopyası. Bunu şu şekilde doğrulayabiliriz:
fc calc.exe notepad.exe_calca.exe
Comparing files calc_orig.exe and NOTEPAD.EXE_CALCA.EXE
FC: no differences encountered

Şu adreste bir ADS'nin bir dosya nesnesine bağlı olmadan aşağıdaki şekilde yaratılacağı söylenmiş.
ECHO "This is a really invisible stream file." > :invisible.txt
Evet, streams ile taratılınca şu şekilde bir sonuç çıkıyor:
streams *
C:\Documents and Settings\admin\Desktop\Deneme\.:
   :invisible.txt:$DATA 44
C:\Documents and Settings\admin\Desktop\Deneme\gorunur.txt:
       :gizli.txt:$DATA 21
C:\Documents and Settings\admin\Desktop\Deneme\notepad.exe:
       :calca.exe:$DATA 114688
Ama aslında bu ADS verisi hiçbir dosya nesnesine bağlı değil gibi görünse de, aslında Deneme adında yarattığımız klasöre bağlı olarak oluştu. Bunu, Deneme'nin bir üst klasörüne (Desktop) çıkıp buradan taratarak doğrulayabiliriz.
cd ..
Deneme\streams *
C:\Documents and Settings\admin\Desktop\Deneme:
   :invisible.txt:$DATA 44
Çok uğraşmaya gerek yoktu, tek noka zaten mevcut klasör demek olduğu için bu ilk adımda belliydi. Ama denemiş olduk. Şimdi bir de Deneme klasörüne bağlı yaratılmış bu ADS'yi silelim:
Deneme\streams -d Deneme
C:\Documents and Settings\admin\Desktop\Deneme:
   Deleted :invisible.txt:$DATA

Windows XP SP2 ve sonrasında download edilen dosyalara bir Zone Identifier verisi ADS olarak eklenir demiştik. Şimdi bir de bunu doğrulayalım. Microsoft Sysinternals'dan download ettiğim ProcessExplorer.zip dosyasına bakalım:
streams ProcessExplorer.zip
C:\Documents and Settings\admin\Desktop\ProcessExplorer.zip:
   :Zone.Identifier:$DATA       26
Acaba bu verinin içinde ne yazıyor?
more < ProcessExplorer.zip:Zone.Identifier
[ZoneTransfer]
ZoneId=3

Meğer sadece Zone ID'si yazıyormuş. Ben de ilk kez denedim. Bunun dışında Windows, şu verileri ADS'de saklar:
  • IE Sık Kullanılanlar'daki bir sitenin ikonu (:favico:$DATA)
  • Dosya hakkındaki özet bilgisi (dosya özelliklerinden erişilen Özet sekmesinde gösterilen veriler, :SummaryInformation:$DATA)
Windows Vista ile dir komutu bir anahtar daha kazandı: /R anahtarı. Bu anahtarı kullanarak komut satırından ADS'leri listeyelebilirsiniz.
dir /R
19.01.2010  10:38    15 gorunen.txt
                     12 gorunen.txt:gorunmeyen.txt:$DATA
Peki, bir ADS yaratıyoruz, ama ADS'nin bağlı olduğu dosyanın boyutu değişmiyor. O zaman nerede saklanıyor bu veri? Diskte bir yer kaplamıyor gibi gözükebilir ama aslında kaplıyor. Bir-iki byte'lık verilerle bunu anlamak zor. 720.156.672 byte'lık Pardus 2009 CD kalıbını pardus.txt dosyasına ekleyelim de görelim, disk boyutumuzda nasıl bir değişiklik olacak. Önce dir komutunu kullanarak diskteki boş yeri görelim.
dir
 Volume in drive C has no label.
 Volume Serial Number is 6C41-A8FD
 Directory of C:\Documents and Settings\admin\Desktop\Deneme

        19.01.2010  10:18            .
        19.01.2010  10:18            ..
        19.01.2010  10:18        498 AlternateStreamView.cfg
        10.12.2009  17:56     34.816 AlternateStreamView.exe
        04.08.2004  14:00    114.688 calc_orig.exe
        19.01.2010  09:52         34 gorunur.txt
        19.01.2010  09:07     69.120 notepad.exe
        19.01.2010  10:11    114.688 notepad.exe_calca.exe
        29.08.2008  15:10    155.960 pdh.dll
        01.12.2009  10:53    381.304 psexec.exe
        27.04.2007  10:17     87.424 streams.exe
                      9 File(s)        958.532 bytes
                      2 Dir(s)   9.864.273.920 bytes free

Görüldüğü gibi diskte 9.864.273.920 byte boş yer var. Şimdi işlemin geri kalanını yapalım. Ancak maalesef type komutu bu büyüklükte bir dosya için işe yaramadı. Onun için FlexHex sitesinden streamtools paketini indirip kullanmak zorunda kaldım. Bu paketten cs komutu bir dosyayı, başka bir dosya nesnesinin ADS'si olarak yazıyor.
cs Pardus_2009.iso pardus.txt:Pardus_2009.iso
Bu işlem sonundaki boş disk alanı:

dir
 Volume in drive C has no label.
 Volume Serial Number is 6C41-A8FD

 Directory of C:\Documents and Settings\admin\Desktop\Deneme

19.01.2010  11:14           .
19.01.2010  11:14           ..
19.01.2010  11:13           498 AlternateStreamView.cfg
10.12.2009  17:56           34.816 AlternateStreamView.exe
04.08.2004  14:00           114.688 calc_orig.exe
01.10.2005  20:21           49.152 CS.exe
19.01.2010  09:52           34 gorunur.txt
19.01.2010  09:07           69.120 notepad.exe
19.01.2010  10:11           114.688 notepad.exe_calca.exe
30.10.2009  11:22           12 pardus.txt
29.08.2008  15:10           155.960 pdh.dll
01.12.2009  10:53           381.304 psexec.exe
27.04.2007  10:17           87.424 streams.exe
              11 File(s)      1.007.696 bytes
               2 Dir(s)   9.143.562.240 bytes free

Görüldüğü gibi boş disk alanı  9.143.562.240 byte'a inmiş. Basit bir hesapla bu 720.711.680 byte yapıyor. Aradaki fark tam olarak Pardus_2009.iso'nun boyutu değil; olmasını da beklemiyoruz. Çünkü bu arada FlexHex internet sitesine bağlandım, streamtools paketini indirdim, içinden cs.exe'yi çıkardım vs. derken bir sürü disk işlemi yaptım. Ard arda bile işlem yapsak arada fark olabilir. Neyse, amaç bu değil. Amacımız, ADS'ye kopyalanan verinin de diskte bir yer işgal etttiğiydi. Bunu da doğruladık.

Özet olarak ADS'ler işletim sisteminin bir parçası. Kapatılması mümkün değil. Bazı zararlı içerik (şu yazımda bir örneği var) kendini ADS altında saklasa da, bunlar diğer virüslere göre daha zararlı veya daha korkulacak şeyler değil. Üçüncü parti araçlarla bunları kontrol altına alabiliyoruz. Asıl korkulacak şey rootkit'ler. Bu tip bileşenlerin tespit edilmesi de, temizlenmesi de tam bir baş ağrısı! Bu da başka bir yazının konusu olur artık :)

Hiç yorum yok: