Dateien leicht verschlüsseln

  • Guten Abend allerseits,
    meine Programme nutzen zur Unterstützung andere Subprogramme. Diese enden natürlich mit .exe . Ich möchte das der User sie alleine nicht ausführen kann. Momentan sieht meine Lösung so aus, dass ich die Datei, die ich mit der Endung .dll bzw. .dat statt exe ausliefere in den TEMP-Ordner als exe kopiere und sie von dort ausführe. Gibt es keine Möglichkeit, diese Datei direkt exe auszuführen? Außerdem würde ich noch gerne verhindern wollen, wenn der User diese Datei in *.exe unbennent, dass sie lauffähig ist.
    Gruß

    Einmal editiert, zuletzt von mille86 (20. April 2009 um 17:19)

    • Offizieller Beitrag

    Die Frage ist, wie sicher muss das sein?

    Eine einfache Möglichkeit wäre, dass Du in Deinen Subprogrammen auf einen Übergabeparamter testest. Wird es ohne Parameter aufgerufen, dann gleich wieder beenden.
    Dein Hauptprogramm ruft die Subprogramme dann natürlich mit Übergabeparameter auf.
    Ist, wie gesagt, nicht sonderlich sicher, aber wer das nicht weiß...

  • Das hört sich sehr gut an.Die Hilfe Datei wird mir schon zeigen wie...
    und nur noch eine erweiterte Aufgabe: Kann man die fremden exe-Dateien auch in AutoIT-Exe einbinden, so dass ich statt 3 nur noch eine Datei ausliefere?
    DAnke :D
    Btw:Wenn das eigene Exe-DAteien wären, fände ich das mit den Übergabeparametern als ziemlich sicher...

  • Zum unbrauchbarmachen der Exe musst du die WinAPI-Funktionenn verwenden, da die normalen AutoIt-Funktionen kein SetFilePointer kennen.

    [autoit]

    #include<WinAPI.au3>
    $File = @DesktopDir & "\test.exe" ; Die Datei zum verändern
    $hFile = _WinAPI_CreateFile($File, 2, 4) ; Datei öffnen, nie erstellen + im Schreibmodus, aber Inhalt nicht löschen
    _WinAPI_SetFilePointer($hFile,0,0) ; Schreibpointer an den Anfang der Datei setzen
    $Buffer = DllStructCreate("byte[2]") ; Buffer mit Bytes zum schreiben
    ;~ DllStructSetData($Buffer, 1, Binary("0x0000")) ; Bytes zum unbrauchbar machen
    DllStructSetData($Buffer, 1, Binary("0x4D5A")) ; Bytes zum reparieren
    Local $iWritten
    _WinAPI_WriteFile($hFile, DllStructGetPtr($Buffer), DllStructGetSize($Buffer), $iWritten) ; erste 2 bytes überschreiben

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

    _WinAPI_CloseHandle($hFile) ; Datei schließen

    [/autoit]
    • Offizieller Beitrag

    Es funktioniert aber auch mit den normalen AutoIt-Funktionen, indem man die Datei im Binary-Mode liest und schreibt:

    [autoit]


    _NotExecute(True, @ScriptDir & '\test.exe') ; Beispielaufruf: Exe nicht ausführbar
    MsgBox(0, 'Test', 'Datei ist jetzt nicht ausführbar!')

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

    _NotExecute(False, @ScriptDir & '\test.exe') ; Beispielaufruf: Exe wieder ausführbar
    MsgBox(0, 'Test', 'Datei ist jetzt wieder ausführbar!')

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

    Func _NotExecute($bExe, $sFilename)
    Local $sHeader, $hFile, $sFile
    $hFile = FileOpen($sFilename, 16)
    $sFile = FileRead($hFile)
    FileClose($hFile)
    If $bExe Then
    $sHeader = '0x0000'
    Else
    $sHeader = '0x4D5A'
    EndIf
    $sFile = $sHeader & StringMid($sFile, 7)
    $hFile = FileOpen($sFilename, 2 + 16)
    FileWrite($hFile, $sFile)
    FileClose($hFile)
    EndFunc ;==>_NotExecute

    [/autoit]

    Dabei wird allerdings die gesamte Exedatei in den Speicher geladen.

  • Genau. dazu muss die gesamte Datei gelesen werden. Mit der WinAPI kann man einfach überschreiben ohne vorher zu lesen ;)

  • Noch einfacher geht es aber, wenn du deinem Skript einen verschlüsselten String mitlieferst, der erst per $CMDLINE empfangen und entschlüsselt wird: Hier ein kleines Beispiel:

    Aufrufer
    [autoit]

    #include <String.au3>
    Dim $test = InputBox("Test", "Bitte gebe das Kennwort ein (bla):")
    Dim $test2 = _StringEncrypt(1, $test, "Dies ist ein Testprogramm")
    MsgBox(0, "Das verschlüsselte Passwort lautet...", $test2)
    Run(@ScriptDir & "\test2.exe " & $test2)
    ToolTip("Das Programm sollte jetzt eigentlich ausgeführt werden (wenn der Tool-Tip verschwindet)", Default, Default, "Test-Programm", 1, 4)
    Sleep(3000)
    ToolTip("")

    [/autoit]

    Achtung!, das nächste Skript muss kompiliert als test2.exe im gleichem Verzeichniss liegen! (s. Anhang)

    Empfänger
    [autoit]

    #include <String.au3>
    Sleep(2000)
    If $CMDLINE[0] And _StringEncrypt(0, $CMDLINE[1], "Dies ist ein Testprogramm") = "bla" Then
    MsgBox(0, "", "richtig")
    Else
    MsgBox(0, "", "falsch!")
    EndIf

    [/autoit]