Alternate Data Stream nutzen Verfasst am: 15.06.2009, 11:29
Thema: ADS – Alternate Data Stream (Wikipedia, Msdn)
Hallo an alle. Wiedermal hab ich mich an ein Tutorial gesetzt. Diesmal möchte ich euch etwas Besonderes zeigen.
1. Erklärung Ich versuche mal so einfach wie möglich zu erklären was es mit ADS auf sich hat. ADS (Alternate Data Stream) ist eine Funktion die es nur bei dem Dateisystem NTFS gibt, mit der man Daten an verschiedenste Dateien anhängen kann ohne dass diese sichtbar sind. Ihr kennt doch sicher alle die kleinen Vorschaubildchen (Thumbnails) von euren Bildern oder Filmen die ihr gespeichert habt. Habt ihr euch schon mal gefragt wo diese Thumbnails gespeichert werden? Ganz genau. Diese Thumbnails sind versteckt an den Dateien angehängt. Im Grunde nutzt Windows also diese Funktion um weitere Daten/Informationen dieser Datei versteckt mitzuliefern. Und genau deswegen mache ich euch hier ein Tutorial. So seid ihr anderen Programmieren schon mal einen Schritt voraus .
2. Schreibweise Beispiel: Datei:ADS Wie ihr seht benutzt man den Doppelpunkt als Trennungszeichen zwischen der Datei und dem Stream(ADS). Einsetzen kann man das z.B. so. Erstellt euch am besten einen Ordner dafür und zwei Textdateien. Und dann gebt in der Eingabeaufforderung(CMD) das ein: „type a.txt > b.txt:a.txt“ Was geschieht ist, dass die Datei a.txt als ADS an die Datei b.txt angehängt wird.
Ansehen kann man sich die Datei dann z.B. per Notepad: „notepad b.txt:a.txt“ Das liegt daran, dass notepad mit solchen verstecken Dateien umgehen kann. Leider kann das nicht jedes Programm. Ausführbare Dateien sind in der Regel kein Problem, aber Filme und andere Dateien hängen von den benutzen Programmen ab. Außerdem kann man Streams auch an Ordner hängen und nicht nur an Dateien. Es gibt übrigens auch Programme mit dem man Alternate Data Streams aufspüren kann. Hier ein Link zu so einem Programm: http://www.safer-networking.org/files/adsl.zip
3. In VB6 nutzen Da man nicht mit den üblichen Methoden auf so einen Stream zugreifen bzw. ihn löschen kann, brauchen wir als erstes 2 Apis die uns dabei helfen.
Code:
Private Declare Function OpenFile Lib "kernel32" (ByVal lpFileName As String, lpReOpenBuff As OFSTRUCT, ByVal wStyle As Long) As Long<br />Private Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" (ByVal lpFileName As String) As Long
Und noch die dazugehörigen Deklarationen.
Code:
Private Const OF_EXIST = &H4000<br />Private Const OFS_MAXPATHNAME = 128<br />Private Type OFSTRUCT<br />cBytes As Byte<br />fFixedDisk As Byte<br />nErrCode As Integer<br />Reserved1 As Integer<br />Reserved2 As Integer<br />szPathName(OFS_MAXPATHNAME) As Byte<br />End Type
Mit diesen Apis (OpenFile und DeleteFile) können wir jetzt ohne Probleme auf die verstecken Daten zugreifen.
Als nächstes müßen wir mal eine Datei als ADS erstellen. Hier mal ein Code wie man eine Datei in den Speicher einlesen und dann als ADS wieder erstellen kann.
Code:
Dim buffer as string, FilePath as string, NewPath as string<br />FilePath = “C:a.txt”<br />NewPath = “C:b.txt:a.txt”<br />Open FilePath For Binary As #1<br />Open NewPath For Binary As #2<br />buffer = Space$(LOF(1))<br />Get #1, , buffer<br />Put #2, , buffer<br />Close
Hier wird nur die Datei „a.txt“ mit der Nummer #1 in buffer eingelesen und dann in „b.txt:a.txt“ wieder erstellt.
Jetzt wissen wir aber natürlich nicht ob die Datei wirklich da ist und jedesmal per CMD testen ist ja auch langweilig. Mit der normalen „FileExists“ Funktion geht es auch nicht und deshalb kommt jetzt die Api „OpenFile“ zum Einsatz.
Hier ein Code zum Überprüfen der Existenz einer Datei:
Code:
Public Function FileExists(ByVal Filename As String) As Boolean<br />Dim OF As OFSTRUCT<br />FileExists = OpenFile(Filename, OF, OF_EXIST) = 1<br />End Function
Diese könnt ihr einfach in einem Modul speichern und dann so im Code aufrufen.
Code:
If FileExists(NewPath) = True then<br /> Call MsgBox(“Datei ist vorhanden”)<br />End if
Eine Datei löschen kann man so:
Code:
Call DeleteFile(newpath)
So könnt ihr sehr einfach Dateien wie z.B. iwelche .ini Files die ihr fürs Programm braucht als ADS anhängen und auslesen wenn ihr es braucht. Mal sehen ob in Zukunft ein paar Projekte von euch mit dieser Funktion kommen. Würde mich freuen.