myAutorun - Die Alternative zur 'autorun.inf'

  • myAutorun ist eine von mir entwickelte Alternative zur 'autorun.inf' unter Windows. Da die Windows eigene Autostart-Funktion für CDs, USB-Sticks und HDDs schon oft von Viren, Trojanern und Co zur Verbreitung ausgenutzt wurde, hat Windows sie deaktiviert. So konnte zwar die Weiterverbreitung einiger Schadprogramme eingedämmt werden, allerdings ging auch eine wirklich nützliche Funktion mit drauf. :thumbdown:
    myAutorun schafft diesem Problem Abhilfe! Mit myAutorun lassen sich kinderleicht, eigene Autostart-Dateien erstellen, die nach der einmaligen Installation von myAutorun auf ihrem Computer, bei jedem Anschließen ausgeführt werden. Erstellen sie Autostarts für CDs, USB-Sticks, Festplatten und sogar Netzlaufwerke! Da myAutorun sich zum einen nicht weit verbreiten wird und zum Anderen sogar der Name der Autostart-Scripte beliebig änderbar ist, wird es keine Viren geben die myAutorun ausnutzen. So können sie fast alle Vorteile von automatischen Autoruns nutzen, ohne zusätzlich Gefahr zu laufen, dass sich ihr Computer über ihr mobilen Speichermedien neue Viren einfängt...
    Quellcode

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <INet.au3>
    #include <Process.au3>
    ; Test auf Parameter-Unterfunktionen:
    If Not @Compiled Then Exit
    If $CmdLineRaw <> '' Then __CheckCmdLine($CmdLineRaw)
    ; Variablen/Konstanten deklarieren:
    Global $DriveList[1] = [0]
    Global Const $__AutorunFileName = 'autorun.txt', $__DriveCheckSleep = 1000, $__ShowTrayInfo = True, $__TrayInfoTimeout = 3

    [/autoit] [autoit][/autoit] [autoit]

    While 1 ; Hauptschleife
    Do
    Sleep($__DriveCheckSleep)
    $NewDrive = __NewDriveConnected()
    Until $NewDrive[0] > 0 ; Warten bis neue Laufwerke gefunden werden...
    For $i = 1 To $NewDrive[0] Step +1
    If FileExists($NewDrive[$i] & '\' & $__AutorunFileName) Then
    __TrayInfo('Neues Laufwerk mit Autorun... (' & StringUpper($NewDrive[$i]) & '\' & ')')
    __AutoRun($NewDrive[$i]) ; Autorun-Datei auf neuem Laufwerk ausführen...
    Else
    __TrayInfo('Neues Laufwerk ohne Autorun... (' & StringUpper($NewDrive[$i]) & '\' & ')')
    EndIf
    Next
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func __AutoRun($Drive) ; Ausführen von vorhanden Autorun-Datein mithilfe von Parameterübergaben an 2. Session dieser Exe...
    Local $File = FileOpen($Drive & '\' & $__AutorunFileName, 0), $CurrentLine = 0, $Seperator
    If $File <> -1 Then
    While 1
    $CurrentLine += 1
    $Line = FileReadLine($File, $CurrentLine)
    If @error Then ExitLoop
    $Seperator = StringInStr($Line, '=')
    If $Seperator Then
    $Command = StringLower(StringLeft($Line, $Seperator - 1))
    $Content = __ReplaceVars(StringTrimLeft($Line, $Seperator), $Drive)
    Switch $Command
    Case 'message'
    If $Content <> '' Then ShellExecute(@ScriptFullPath, ' message:' & $Content)
    Case 'shellexecute'
    If $Content <> '' Then ShellExecute(@ScriptFullPath, ' shellexecute:' & $Content)
    Case 'execute'
    If $Content <> '' Then ShellExecute(@ScriptFullPath, ' execute:' & $Content)
    Case 'run'
    If $Content <> '' Then ShellExecute(@ScriptFullPath, ' run:' & $Content)
    Case 'cmd'
    If $Content <> '' Then ShellExecute(@ScriptFullPath, ' cmd:' & $Content)
    Case 'sleep'
    Sleep($Content)

    [/autoit] [autoit][/autoit] [autoit]

    Case Else
    __TrayInfo('Unbekannter Befehl: "' & $Command & '" in ' & $Drive & '\' & $__AutorunFileName & ' gefunden!', 2)
    EndSwitch
    EndIf
    WEnd
    Else
    __TrayInfo(StringUpper($Drive) & '\' & $__AutorunFileName & ' konnte nicht gelesen werden!', 3)
    EndIf
    EndFunc ;==>__AutoRun

    [/autoit] [autoit][/autoit] [autoit]

    Func __NewDriveConnected($TYP = 'ALL')
    Local $i, $y, $NewList, $Found, $Del[1] = [0], $Return[1] = [0]
    $NewList = DriveGetDrive($TYP)
    ; Entfernte Drives null setzen:
    For $i = 1 To $DriveList[0] Step +1
    $Found = False
    For $y = 1 To $NewList[0] Step +1
    If $DriveList[$i] = $NewList[$y] Then
    $Found = True
    ExitLoop
    EndIf
    Next
    If Not $Found Then
    _ArrayAdd($Del, $i)
    $Del[0] += 1
    EndIf
    Next
    ; Null gesetzte Drives löschen:
    For $i = 1 To $Del[0] Step +1
    _ArrayDelete($DriveList, $Del[$i])
    Next
    ; Neues Drive finden:
    For $i = 1 To $NewList[0] Step +1
    $Found = False
    For $y = 1 To $DriveList[0] Step +1
    If $NewList[$i] = $DriveList[$y] Then
    $Found = True
    ExitLoop
    EndIf
    Next
    If Not $Found Then
    _ArrayAdd($Return, $NewList[$i])
    $Return[0] += 1
    EndIf
    Next
    $DriveList = $NewList
    Return $Return
    EndFunc ;==>__NewDriveConnected

    [/autoit] [autoit][/autoit] [autoit]

    Func __TrayInfo($Text, $Style = 1)
    If $__ShowTrayInfo Then TrayTip('myAutorun', $Text, $__TrayInfoTimeout, $Style)
    EndFunc ;==>__TrayInfo

    [/autoit] [autoit][/autoit] [autoit]

    Func __CheckCmdLine($Code)
    $Seperator = StringInStr($Code, ':')
    If $Seperator = 0 Then Exit
    $Command = StringLower(StringLeft($Code, $Seperator - 1))
    $Content = StringTrimLeft($Code, $Seperator)
    Switch $Command
    Case 'message'
    MsgBox(0, 'myAutorun', $Content, 0)
    Case 'shellexecute'
    ShellExecute($Content)
    Case 'execute'
    Execute($Content)
    Case 'run'
    Run($Content)
    Case 'cmd'
    _RunDos($Content)
    EndSwitch
    Exit
    EndFunc ;==>__CheckCmdLine

    [/autoit] [autoit][/autoit] [autoit]

    Func __ReplaceVars($String, $Drive)
    $String = StringReplace($String, '%drive%', $Drive, 0, 0)
    $String = StringReplace($String, '%hour%', @HOUR, 0, 0)
    $String = StringReplace($String, '%min%', @MIN, 0, 0)
    $String = StringReplace($String, '%sec%', @SEC, 0, 0)
    $String = StringReplace($String, '%year%', @YEAR, 0, 0)
    $String = StringReplace($String, '%month%', @MON, 0, 0)
    $String = StringReplace($String, '%mday%', @MDAY, 0, 0)
    $String = StringReplace($String, '%user%', @UserName, 0, 0)
    $String = StringReplace($String, '%pcname%', @ComputerName, 0, 0)
    $String = StringReplace($String, '%crlf%', @CRLF, 0, 0)
    $String = StringReplace($String, '%lf%', @LF, 0, 0)
    $String = StringReplace($String, '%cr%', @CR, 0, 0)
    $String = StringReplace($String, '%lan%', @IPAddress1, 0, 0)
    $String = StringReplace($String, '%wan%', _GetIP(), 0, 0)
    $String = StringReplace($String, '%fullpath%', $Drive & '\' & $__AutorunFileName, 0, 0)
    Return $String
    EndFunc ;==>__ReplaceVars

    [/autoit]


    Befehle

    Spoiler anzeigen

    Bei den unten aufgeführten Befehl ist zu beachten, dass die Groß- und Kleinschreibung keine Beachtung findet. Außerdem sollte jeder Befehl in eine neue Zeile geschrieben und durch ein '='-Zeichen, ohne Leerzeichen, von seinem Parameter getrennt werden.

    Anzeigen einer Nachricht auf dem Bildschirm:

    Code
    Message=Dieser Text wird in einer Messagebox angezeigt.


    Ausführen/Anzeigen von Dateien/Links usw.:
    (Äquivalent zum Windows-Befehl 'ShellExecute')

    Code
    ShellExecute=notepad
    ShellExecute=http://www.autoit.de/


    Ausführen eines Strings/Autoit-Befehls:
    (siehe Autoit-Befehl 'Execute')

    Code
    Execute=Beep(500,1000)
    Execute=FileDelete(%fullpath%)


    Ausführen von Programmen:

    Code
    Run=%drive%\text.exe


    Auführen von Dos-Befehlen:

    Code
    cmd=echo Hallo Welt! > test.txt


    Anhalten der Script-Abarbeitung für x Millisekunden:

    Code
    Sleep=x


    Weitere Befehle werden noch ergänzt...
    Außerdem können in den Parametern aller Befehle folgende Makros genutzt werden:

    Beispiel Autostart-Script:

    Spoiler anzeigen
    Code
    message=Danke das du auf deinem Computer ('%pcname%') myAutorun installiert hast. %crlf%Heute ist der %mday%.%month%.%year% und wir haben gerade %hour%:%min%:%sec%Uhr. %crlf%Deine lokale IP ist die %lan% und global hast du gerade die IP %wan% ;)
    Message=Hallo %user%!
    execute=Beep(500, 1000)
    cmd=echo Ich bin eine Autorun-Datei auf dem Laufwerk %drive% und um mich zu finden brauchst du diesen Pfad  '%fullpath%' > %drive%\Neue-Textdatei-aus-Autostart-Script.txt
    shellexecute=notepad

    Alle Dateien finden sich auch im Anhang... ;)

  • Das Prinzip habe ich verstanden (gute Idee übrigens), allerdings wäre es gut, wenn du nochmal ausführlich erklärst, was man genau machen muss, damit es funktioniert. ;)

  • Hi,

    @CyRoX
    Das Program läuft im Hintergrund und scannt die Laufwerke ab.
    Wenn das Programm auf einem Laufwerk eine autorun.txt ($__AutorunFileName) findet geht es
    die Datei Zeile für Zeile durch und führt die entsprechenden Befehle im Switch-Block (Zeile 37 -> 53) aus.

    BinDannMalWeg: Wie CyRoX schon gesagt hat, super Idee, aber da du keine Sicherheits-Abfrage drin hat (Soll der Autorun das Programm "blabla.exe" wirklich starten?) drin hast können sich die Viren genau wie bei einer echten AutoRun.INF starten.

    Also eine Abfrage (falls man es in den Programm-Einstellungen aktiv hat) ob der Autorun gestartet werden soll, wäre sinnvoll :)

    mfg

  • Also erstmal muss ich sagen, dass dieses Script aus Langeweile entstand und ich deshalb keine besonders ausführliche Anleitung geschrieben habe. Aber wenn ich Zeit habe werde ich den Startpost mal überarbeiten...
    Blume: Natürlich könnte man eine derartige Abfrage einbauen, aber meiner Meinung wäre dies unnötig, da es nie Viren geben wird die mein kleines Script ausnutzen, da es sich schlicht weg nicht lohnen würde. :D Erstens bin ich mir nicht sicher ob es außer mir überhaupt irgendjemand auf der Welt benutzt und Zweitens lässt dich der Name der Autorun Datei im Script beliebig umstellen, was das ganze noch einmal 'sichert'.

    LG
    Christoph :)

  • (Gerade wieder das Thema entdeckt)

    Achso, muss also nur autorun.txt heißen und kompiliert werden (das Kompilieren war mein Problem :D).
    Funktioniert wunderbar!

    Pitter:

    Du hast dich da mit dem Thread vertan, das Programm ist eins von Cheater Dieter mit dem Namen "Link me!".

    Einmal editiert, zuletzt von CyRoX (21. Juli 2012 um 22:47)

  • Ich habe ja immer schon Probleme gehabt wie Windows .bat und .exe unterschiedlich behandelt aber wie kann ich eine Batch in einem Unterordner über dieses Autorun Script aufrufen? Es funktioniert soweit alles richtig aber irgendwie bekomme ich eine Batch nicht gestartet.

    Vielleicht verwende ich ja nur einen falschen Befehl?

    Mfg Zyan

  • Hi,
    hab's selbst nicht laufen, aber so sollte es eigentlich funktionieren (s. Befehlsliste):

    Code
    Run=%drive%\text.exe


    oder eben

    Code
    Run=%drive%\text.bat


    Wäre gut wenn du geschrieben hättest, welchen Befehl du denn verwendest. ;)

  • Nur der Vollständigkeit halber möchte ich schnell noch einmal alle Möglichkeiten aufzeigen:

    Code
    ShellExecute=%drive%\t.bat
    Run=%drive%\t.bat
    Execute=Run("%drive%\t.bat")
    Execute=ShellExecute("%drive%\t.bat")
    cmd=ping www.google.de > %drive%\log.txt

    LG
    Christoph :)