AutoRun beim Anschließen

USBDLM

 

AutoRun beim Anschießen


 

1. autorun.inf auf dem angeschlossenen Laufwerk

 

Die autorun.inf ist ein Windows-Mechanismus. Unter anderem kann über eine Zeile open= Windows beim Anschließen eines Laufwerks oder Einlegen eines Mediums (CD, DVD, Flash-Karte) ein beliebiges Programm ausführen. Mit jeder Windows-Version wurde das weiter eingeschränkt, XP macht es nur noch auf CD/DVD-Laufwerken ohne Nachfrage, was dann zu so tollen Lösungen wie U3-Sticks und USB-Geräten mit Selfinstallern geführt hat, die ihren Autostart über ein virtuelles CD-ROM bewerkstelligen.

Gerechterweise geht ab Vista auch das nicht mehr ohne Nachfrage.

 

USBDLM kann die Zeile open= in einer autorun.inf auf Wechseldatenträgern, Festplatten, CD-ROMs und Floppys ausführen, bei Wechseldatenträgern auch beim Einlegen einer Karte, sonst nur beim Anschließen eines Laufwerks.

 

Bsp: Nur für Wechseldatenträger:

 

[Settings]

AutoRunInf=1

 

Werte für andere Typen, bei Bedarf addieren:

 

Wechseldatenträger:     1

Festplatten:            2

CDROMs:                 4

Floppys:                8

Unbekannt:             16

Remote (Netzlaufwerk): 32

 

Bsp: Nur für Wechseldatenträger, Festplatten und CD-ROMs:

 

[Settings]

AutoRunInf=7

 

Floppys unterstützen keine 'Benachrichtigung beim Einlegen' (insert notification) - daher kann das bei Floppys nur funktionieren, wenn ein externes Laufwerk mit eingelegtem Medium angeschlossen wird.

 

 

Beispiel zum Öffnen eines maximierten Explorer-Fensters über eine autorun.inf auf dem angeschlossenen Laufwerk bzw. eingelegten Medium (Der Punkt steht für das aktuelle Verzeichnis, also das Stammverzeichnis des angeschlossenen Laufwerks):

 

[Autorun]

open="%windir%\explorer.exe" .

openstyle=max

 

Auf x64-Systemen wird zuerst aus dem Abschnitt [Autorun.Amd64] gelesen. Wird ein Wert dort nicht gefunden, wird [Autorun] gelesen.

 

 

Dem zu startenden Programm kann über die Zeile openstyle= ein Fenster-Stil vorgeschlagen werden - das ist eine Funktion von USBDLM und wird vom Windows-AutoRun nicht unterstützt. Viele Programme halten sich dran, z.B. der Windows-Editor "notepad.exe", andere nicht, z.B. der Windows-Rechner "calc.exe". Verfügbare Stile sind:

 

max         maximiert

min         minimiert

hidden      versteckt

noactivate  normal, aber Fenster wird nicht aktiviert, bekommt also nicht den Fokus

 

Da der Autor es selbst versehentlich immer wieder mit windowstyle= versucht hat, funktioniert das jetzt auch...

 

Ab Vista ist es recht knifflig, das Fenster eines aus einem Dienst heraus gestarteten Programms aktiviert zu bekommen. Falls das gar nicht nötig ist, bitte openstyle=noactivate konfigurieren.

 

 

Die autorun.inf bietet natürlich ein hervorragendes Einfallstor für Schadsoftware auf Fremd-Sticks. Deshalb kann USBDLM das Ganze über einen Schlüssel absichern:

 

[Settings]

AutoRunKey=MeinTotalGeheimerSchlüssel

 

Nur wenn sich in der autorun.inf die gleiche Zeile befindet (dort im Abschnitt [autorun]), führt USBDLM die open= Zeile aus.

 

Eine weitere Möglichkeit, etwas für die Sicherheit zu tun, ist, AutoRun ohne Admin-Rechte auszuführen (falls man nicht ohnehin als "Eingeschränkter Nutzer" oder mit aktiver UAC arbeitet).

 

[Settings]

AutorunInfRestricted=1

 

Wunder darf man davon nicht erwarten - auch ohne Admin-Rechte kann man Tastatureingaben aufzeichen, Nutzerdateien lesen, schreiben und löschen; nach Hause telefonieren geht auch.

 

Ab V4.3 funktionieren hier auch die meisten anderen Erweiterungen, wie open1 bis open9, wait, delay usw., siehe unten.

 

 

Label und Icon aus der autorun.inf

 

Ab V4.4 kann USBDLM die Einträge label und icon aus der autorun.inf lesen und in die Registry-Werte DefaultLabel und DefaultIcon für dieses Laufwerk eintragen. Das kann sinnvoll sein wenn die autorun.inf komplett deaktiviert wurde oder einfach nicht funktioniert..

Beides muss separat aktiviert werden, analog zu AutoRunInf, siehe oben.

 

Beispiel für Label und Icon von CDROM-Laufwerken:

 

[Settings]

AutoRunInfLabel=4

AutoRunInfIcon=4

 

 

 

2. AutoRun-Ereignisse in der USBDLM.INI - abhängig von Laufwerks-Eigenschaften

 

[OnArrival]

open=calc.exe

 

Das würde z.B. bei jedem Anschließen eines USB-Laufwerks oder Einlegen einer Flash-Karte den Windows Taschenrechner ausführen.

 

Es gelten die selben Kriterien wie bei den DriveLetters-Abschnitten, ein Abschnitt ist also standardmäßig nur für USB-Sticks und Festplatten gültig. Für andere Laufwerkstypen braucht's entsprechende Kriterien wie BusType und/oder DriveType. Hier darf man dann auch gefahrlos mit Einstellungen wie BusType=ANY und DriveType=ANY arbeiten.

 

; für CD- und Netzlaufwerke

[OnArrival]

DriveType1=CDROM

DriveType2=REMOTE

open=calc.exe

 

 

Das Kommando kann auch ohne Admin-Rechte ausgeführt werden (wenn der aktive Nutzer kein Admin ist, ergibt sich kein Unterschied):

 

[OnArrival]

open=calc.exe

restricted=1

 

oder mit vollen System-Rechten im Kontext "LocalSystem":

 

[OnArrival]

open=calc.exe

system=1

 

Das Fenster der Anwendung wird man aber nie zu sehen bekommen, da man aus "LocalSystem" heraus nicht einfach so auf den Desktop des Nutzers kommt.

Nützlich ist das zum Ausführen von Tools die Admin-Rechte benötigen, der aktive Nutzer aber keine hat, wie unten im Beispiel 6.

Außerdem funktioniert das auch wenn kein Nutzer angemeldet ist. Was man so ausführt sollte sich aber unbedingt selbst beenden, da der Nutzer nichts davon sieht und nicht eingreifen kann.

 

Mit Windows Vista wurde die "User Account Control", kurz UAC, eingeführt. Das Nutzer-Konto ist dann geteilt in eines mit eingeschränkten Rechten und eines mit vollen Administrator-Rechten, das was man per "Als Administrator ausführen" nutzt. Es hat den Beinamen "elevated".

Standardmäßig startet USBDLM Prozesse mit dem eingeschränkten Konto. Will man "elevated" starten:

 

[OnArrival]

open=calc.exe

elevated=1

 

 

Als Parameter für das auszuführende Programm kann man Variablen wie z.B. %drive% das angeschlossene Laufwerk oder  %root% dessen Stammverzeichnis übergeben.

 

Das Ganze geht auch abhängig von Kriterien, genau wie bei der Konfiguration der Laufwerksbuchstaben.

Geprüft werden [OnArrival1] bis [OnArrival99], anschließend noch 100 [OnArrival] (ohne Nummer). Der erste Abschnitt mit passenden Kriterien wird benutzt.

Ein zusätzliches Kriterium ist der Laufwerksbuchstabe, Letter=X ist hier also ein Kriterium! Buchstabenlisten funktionieren hier nicht. Ein NTFS-Mountpunkt muß hier mit einem Backslash enden. 

Außerdem gilt das Standard-Kriterium MinDiskSize=1, so dass OnArrival-Ereignisse nur ausgeführt werden, wenn das Laufwerk mindestens 1 Byte groß ist, sprich, ein Medium eingelegt ist. Um OnArrival auszuführen wenn kein Medium eingelegt ist (wozu auch immer), kann  MinDiskSize=- konfiguriert werden.

 

Dem zu startenden Programm kann über die Zeile openstyle= noch ein Fenster-Stil vorgeschlagen werden, siehe oben.

 

Bei Bedarf kann noch eine Verzögerung angegeben werden, Standardmäßig in Millisekunden, ab V4.8.9.5 können Einheiten angegeben werden, 's' für Sekunden, 'm' für Minuten und 'h' für Stunden. Maximum sind 24h:

 

delay=10s

 

Wenn das Ausführen übersprungen werden soll, kann die Umschalt-Taste ("Shift") gedrückt gehalten werden. Ab Vista funktioniert das nur, wenn im Abschnitt Force=0 gesetzt ist, da der Tastenstatus hier nur mit etwas Aufwand zu ermitteln ist.

 

Um die Integrität der auszuführenden Datei sicherzustellen, kann ein MD5-Hashwert angegeben werden:

 

[OnArrival]

open=calc.exe

md5=DDCD9FCD B7E1956E E69F8E58 B8C8BF0D

 

Groß- / Kleinschreibung ist egal, ebenso die Leerzeichen. Nur wenn der MD5-Hash der EXE mit dem konfigurierten Wert übereinstimmt, wird das Programm ausgeführt.

 

Tool zum Ermitteln des MD5-Hash einer Datei:

MD5-File.zip

 

 

Soll verhindert werden, dass ein Programm ein weiteres Mal gestartet wird, konfiguriert man OneInstance=1:

 

[OnArrival]

open=calc.exe

OneInstance=1

 

 

Beispiele

 

Beispiel 1: 

  • FotoSoftware für Laufwerke mit der Datenträgerbezeichnung "CANON_DC" oder "NIKON_DC", als Parameter die USBDLM-Variable %root%, also das Stammverzeichnis des neuen Laufwerks
  • nix für Laufwerk X
  • sonst ein maximiertes Explorer-Fenster mit dem Laufwerk

 

[OnArrival]

VolumeLabel=CANON_DC

VolumeLabel=NIKON_DC

open="C:\Programme\Foto Software\FotoSoftware.exe" %root%

 

[OnArrival]

Letter=X

open=

 

[OnArrival]

open="%windir%\explorer.exe" %root%

openstyle=max

 

 

Beispiel 2: 

- Falls vorhanden, die Datei DATEN.TXT vom angeschlossenen Laufwerk nach C:\Daten kopieren, vorher zwei Sekunden warten:

 

[OnArrival]

FileExists=%drive%\DATEN.TXT

delay=2000

open="%windir%\System32\cmd.exe" /c copy "%drive%\DATEN.TXT" "C:\Daten"

 

cmd ist der Windows-Kommandozeilen-Interpreter, /c heißt "Kommando ausführen und dann beenden", copy ist ein Kommando das cmd bekannt ist und Dateien kopiert.

 

Das Selbe versteckt:

 

[OnArrival]

FileExists=%drive%\DATEN.TXT

open="%windir%\System32\cmd.exe" /c copy "%drive%\DATEN.TXT" "C:\Daten"

openstyle=hidden

 

 

Beispiel 3: 

- Eine TrueCrypt Container-Datei mit Namen geheim.tc automatisch auf T: mounten:

 

[OnArrival]

FileExists=%drive%\geheim.tc

open="C:\Programme\TrueCrypt\TrueCrypt.exe" /v "%drive%\geheim.tc" /L T /q

 

 

Beispiel 4: 

- Eine als TrueCrypt-Container eingerichtete Partition automatisch auf J: mounten, deren überflüssigen Laufwerksbuchstaben entfernen und das gemountete TrueCrypt-Laufwerk im Explorer öffnen:

 

;Laufwerksbuchstaben entfernen, ist eh nutzlos

[DriveLetters]

DeviceType1=TrueCrypt

DeviceType2=ReadSharingViolation

Letter=-

 

[OnArrival]

DeviceType=TrueCrypt

open="C:\Programme\TrueCrypt\TrueCrypt.exe" /v %PartitionName% /L J /q

 

[OnArrival]

DeviceType=TrueCryptVolume

open="%windir%\explorer.exe" %root%

 

%PartitionName% ist eine USBDLM-Variable und wird durch sowas wie

\Device\Harddisk2\Partition1 ersetzt, so wie TrueCrypt das erwartet.

 

Der DeviceType ReadSharingViolation trifft für Laufwerke zu, die bereits durch TrueCrypt gemountet sind. Davon kann USBDLM keine Testdaten lesen - der Versuch wird mit ERROR_SHARING_VIOLATION zurückgewiesen, daher der Name. Dazu kommt es z.B. wenn der USBDLM-Dienst neu gestartet wird. Der Buchstabe soll dann ja weg, nochmal mounten wäre aber falsch. Genau das wird durch obige Konfiguration erreicht.

 

Hinweis: USBDLM reagiert nur auf "Volumes", das was für gewöhnlich einen Laufwerksbuchstaben hat. Wechseldatenträger haben unter Windows 2000 und höher immer eine Partition (bei Superfloppys gilt der ganze Datenträger als solche) und somit auch immer ein Volume, selbst wenn sie nicht formatiert sind. Deshalb funktioniert USBDLMs AutoRun mit TrueCrypt auch dann wenn ein Wechseldatenträger komplett als TrueCrypt-Container genutzt wird. 

Bei Festplatten geht das nicht - hier muss man eine Partition anlegen - die kann dann als TrueCrypt-Container genutzt werden. Eine Festplatte komplett, also ohne Partition, als TrueCrypt-Container zu nutzen ist keine gute Idee, da im ersten Sektor eine Partitionstabelle erwartet wird. Wenn dann stattdessen Zufallsdaten vorgefunden werden, ist das Ergebnis nicht vorherzusagen - Windows kommt dann beim Öffnen der Datenträgerverwaltung mit der Empfehlung, die Platte zu initialisieren, was dem TrueCrypt-Container nicht gut tut... 

Ab V4.8 kann USBDLM AutoRuns für ganze Laufwerke ausführen.

 

 

Beispiel 5: 

Einen USB-Stick auf U: mounten und als Stick_U freigeben, beim "sicheren Entfernen" die Freigabe wieder löschen:

 

[DriveLetters]

Letter1=U

 

[OnArrival]

Letter=U

open="%windir%\System32\net.exe" share Stick_U=U:\

openstyle=hidden

 

; beim "sicher entfernen" muss die Freigabe weg, sonst wird's nichts, falls jemand drauf zugreift

[OnRemovalRequest]

Letter=U

open="%windir%\System32\net.exe" share Stick_U /D

openstyle=hidden

 

; falls das Laufwerk einfach abgezogen wurde

[OnRemoval]

Letter=U

open="%windir%\System32\net.exe" share Stick_U /D

openstyle=hidden

 

 

Mit openstyle=hidden kann man das aufpoppende Konsolenfenster unterdrücken.

 

 

Mehrere Open-Kommandos

 

Ab V4.3 können bis zu 10 Open-Kommandos ausgeführt werden - open1 bis open9 und open. Zusätzliche Parameter wie openstyle, restricted usw. müssen dann jeweils die selbe Nummer tragen. Ab V5 kann man auf die Nummerierung verzichten, eine Zeile open= beginnt einen neuen Parameterblock.

"delay" definiert eine Wartezeit bevor die open-Zeile ausgeführt wird. "wait" bewirkt, dass gewartet wird bis das Programm das die open-Zeile gestartet hat beendet wurde - erst dann wie die nächste open-Zeile in Angriff genommen.

 

Beispiel:

- Zweimal den Rechner starten, einmal eingeschränkt, einmal normal:

 

[OnArrival]

open1=calc.exe

restricted1=1

open2=calc.exe

restricted2=0

 

Ab V5 braucht man keine Nummerierung mehr, eine open-Zeile beginnt einen Parametersatz:

 

- Rechner starten, zwei Sekunden später Notepad maximiert starten

 

[OnArrival]

open=calc.exe

delay=2000

 

open=notepad.exe

windowstyle=max

 

- Rechner starten, Notepad sobald Rechner beendet oder 10 Sekunden abgelaufen

 

[OnArrival]

open=calc.exe

wait=10s

 

open=notepad.exe

windowstyle=max

 

 

Weitere realistische Beispiele:

 

Beispiel 6: 

Einen USB-Stick auf A: mounten, falls A: belegt, dieses Laufwerk aus dem Weg räumen, indem es auf B: umgemountet wird:

 

;Auf A: mounten falls verfügbar, sonst unmounten

[DriveLetters]

Letter=A

Letter=-

 

;falls ungemountet (Kriterium "kein Mountpunkt"), A: auf B: ummounten und dann A: zuordnen

[OnArrival]

Letter=-

open="C:\Tools\ReMount.exe" A: B:

system=1

wait=1000

 

open="%windir%\System32\MountVol.exe" A: %VolumeName%

system=1

 

%VolumeName% ist eine USBDLM-Variable und wird durch sowas wie

\\?\Volume{aa6d706a-15da-11dc-a38f-0013d31dd4c5}\ ersetzt, so wie das Windows Kommandozeilen-Tool MountVol das erwartet.

ReMount ist mein Kommandozeilen-Tool zum Ändern von Laufwerksbuchstaben. Download:

http://www.uwe-sieber.de/drivetools.html#remount

Wait bewirkt, dass das nächsten open erst ausgeführt wird, wenn das aktuell open fertig ist (oder 1000 ms abgelaufen sind, was bei ReMount aber nicht passieren wird).

Durch system=1 wird das jeweilige Kommando im Kontext "LocalSystem" ausgeführt - somit sieht man nichts und die Programme haben die nötigen Rechte.

 

Nach dem Entfernen des Laufwerks das Ganze rückgängig:

 

[OnRemoval]

Letter=A

open="ReMount" B: A:

system=1

 

 

Beispiel 7: 

Einem USB-Stick den Laufwerksbuchstaben wegnehmen, Dateisystem mittels EjectMedia abmelden ("dismount"), mittels DD für Windows ein Image aufspielen und zuletzt das USB-Laufwerk mittels RemoveDrive "sicher entfernen":

 

[DriveLetters]

Letter=-

 

[OnArrival]

Letter=-

open="C:\Tools\EjectMedia.exe" %VolumeName% -D

wait=1000

 

open="C:\Tools\DD.exe" -if=C:\usb-image1.bin -of=\\.\%PureVolumeName%

wait=600000

 

open="C:\Tools\RemoveDrive.exe" %VolumeName% -L

 

Zum direkten Schreiben in ein Volume sind Admin-Rechte erforderlich, ab Vista mit aktiver UAC also noch ein elevated2=1 oder system2=1 setzen, mit letzterem sieht man aber das Konsolenfenster nicht.

Will man statt in das Volume auf die Disk schreiben, ist das Ziel für DD \\.\%PhysicalDrive%DeviceNumber%

 

 

 

 

AutoRun für Disks ohne Partitionen

 

Ab USBDLM V4.8 gibt es Events für Disks, analog zu den oben beschriebenen: [OnDiskArrival], [OnDiskRemovalRequest], [OnDiskRemoval].

 

Beispiel:

 

; Festplatte die komplett als TrueCrypt-Kontainer genutzt wird auf J: mounten

[OnDiskArrival]

DeviceType=TrueCrypt

open="%ProgramFiles%\TrueCrypt\TrueCrypt.exe" /q /v \Device\Harddisk%DeviceNumber%\Partition0 /letter J

 

Volumespezifische Kriterien funktionieren hier naturgemäß nicht.

 

 

AutoRun beim Nutzer-Login

 

Die konfigurierten OnArrival-Ereignisse werden standardmäßig nur beim Anschließen eines Laufwerks bzw. Einlegen eines Datenträgers überprüft und ggf. ausgeführt.

Soll USBDLM AutoRuns auch beim Login oder Nutzerwechsel ausführen:

 

[Settings]

AutoRunOnLogon=1

 

Beim automatischen Logon ist der USBDLM-Dienst möglicherweise noch nicht gestartet, da XP nicht auf den Start aller Dienste wartet - die Illusion vom schnellen Windows-Start hat Vorrang. USBDLM verpasst so das Logon-Ereignis.

Deshalb führt USBDLM beim Dienst-Start die AutoRuns dennoch aus, wenn seit dem Systemstart weniger als zwei Minuten vergangen sind und bereits ein Nutzer eingeloggt ist, es sich also offenbar um einen verpassten Logon handelt.

 

 

 

Diagnose

 

Wenn es Unklarheiten bzgl. Kommandozeilenparameter, Arbeitsverzeichnis, Fenster-Stil usw. gibt, kann man sich mit meinem Tool TestCommandline vergewissern, dass beim gestarteten Prozess alles wie konfiguriert ankommt:

http://www.uwe-sieber.de/files/testcommandline.zip

 

Standardmäßig schließt es sich nach 10 Sekunden. Durch Klick auf den Countdown startet der Timer von vorn. Mit dem Kommandozeilenparameter -t:xx kann ein anderer Timeout in Sekunden festgelegt werden.

 

[OnArrival]

open="testcommandline.exe" /open1

openstyle=max

wait=2000

 

open="testcommandline.exe" /open2

openstyle=max

 

Das Fenster von TestCommandline wird nicht aktiv und ignoriert den Fenster-Stil, zeigt in aber an.

 

 

Wenn ein Programm versteckt oder im Kontext "System" gestartet wird, sieht man davon nichts. Die Ausgaben gestarteter Konsolenprogramme fängt USBDLM ab V4.7.2 in diesen Fällen ein und schreibt sie in die Logdatei, standardmäßig mit LogLevel=3.

Ein anderer Loglevel kann eingestellt werden, z.B. so:

 

[Settings]

RedirectLogLevel=2