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ß

  • 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ß...

  • Andere Möglichkeit:
    Die ersten beiden Bytes der Dateien (Subprogramme) auf "00" "00" ändern, dann lassen sie sich nicht mehr starten.
    Dein Hauptprogramm ändert vor dem Aufruf die beiden Bytes wieder auf den Ursprungswert "4d" "5a" und ruft das Subprogramm dann auf. Nach dem Beenden wieder auf "00" "00" setzen.

  • 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.
    #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


    _WinAPI_CloseHandle($hFile) ; Datei schließen

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

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


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


    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


    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:


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