LoginWrapper

    • Offizieller Beitrag

    Hi,

    ich habe einen LoginWrapper geschrieben, der dazu dienen soll exe Dateien vor der Ausführung zu schützen. Es muss eine Authentifizierung durch Benutzername & Passwort erfolgen.

    Vielleicht kann dies der eine oder andere ja gebrauchen.

    Falls gewünscht, würde ich die Erklärung auch ins Deutsche übersetzen.

    So long,

    Mega

    Scriptvorschau:

    Spoiler anzeigen
    [autoit]


    ;
    ; AutoIt Version: 3.1.1 beta
    ; Author: Thorsten Meger
    ;
    ; Script Function: LoginWrapper / Security Check
    ;
    ; The script allows you to protect your script from starting by unauthenticated users.
    ; This scrips wrapps your script. After authenticated successfully, it "installs" your script hidden
    ; at the given location and starts it.
    ; If the "main-script" is closed, this script deletes the your Script.exe
    ; Wrapper.exe contains (your script)
    ; ------------------------------------------------------------------------------------------------------
    ; The script creates an (system/hidden) ini-File in the script-folder.
    ; The login.ini contains the encrypted usernames & passwords
    ; To add users who can authenticate successfully, start the script with the para defined
    ; in $createNewUser default(newuser)
    ; The login.ini contains one adminUser(InitialUser & InitialPassword)
    ; Change Initial - user & password to your needs
    ; ------------------------------------------------------------------------------------------------------

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

    ; **** Change this to your script.exe ******************************************************

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

    Dim $yourScriptExe = 'c:\MsgBox.exe'; your script.exe (I recommend c:\)
    Dim $InitialUser = 'xxx' ; change this to your "admin" user
    Dim $InitialPassword = 'xxx' ; change this to your "admin" password
    Dim $iniPath = @WindowsDir & '\'; where to save the ini files
    Dim $nameOfIni = 'login.ini' ; Login.ini should be renamed to the name of the wrapped mainScript. That will allow multiple wrapping
    Dim $createNewUser = 'newuser' ; change this to secure creating new users (first parameter) e.g. : LoginWrapper.exe newuser
    Dim $Sound = 1; Sound On/Off, 1 = On, 0 = Off

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

    ; FileInstall doesn't work with variables, so you have to type fullPath as a string!!!
    ; Example : FileInstall('c:\yourPath\yourScriptExe.exe', 'c:\yourScriptExe.exe', 1) ; 2nd para must be the same as in $yourScriptExe!
    Func _FileInstall()
    FileInstall('c:\Downloads\AutoIt-Skripte\Entwicklung\Wrapper\MsgBox.exe', 'c:\MsgBox.exe', 1) ; first ;!!!Change here!!!
    FileSetAttrib($yourScriptExe, "+SH")
    Sleep(20)
    Run($yourScriptExe)
    If @error = 1 Then MsgBox(0, "Error", "Couldn't find the main script!", 4)
    check()
    EndFunc ;==>_FileInstall
    ; ******************************************************************************************

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

    #include <GUIConstants.au3>
    #include <String.au3>
    #include <File.au3>
    Opt("RunErrorsFatal", 0)

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

    ; The GUI
    $GUI = GUICreate("Security Check", 318, 223, 192, 125)
    ; Group
    $main_G = GUICtrlCreateGroup("Credentials", 8, 56, 297, 153)
    ; Label
    $username_L = GUICtrlCreateLabel("Username : ", 16, 80, 131, 17, $SS_SUNKEN)
    $password_L = GUICtrlCreateLabel("Password : ", 16, 112, 131, 17, $SS_SUNKEN)
    $status_L = GUICtrlCreateLabel("Status", 16, 176, 267, 17, $SS_SUNKEN)
    $headline_L = GUICtrlCreateLabel("Login", 8, 18, 299, 33)
    ; Input
    $username_I = GUICtrlCreateInput("", 160, 76, 121, 21, -1, $WS_EX_CLIENTEDGE)
    $password_I = GUICtrlCreateInput("", 160, 110, 121, 21, $ES_PASSWORD, $WS_EX_CLIENTEDGE)
    ; Button
    $button_B = GUICtrlCreateButton("Login", 16, 136, 131, 25, $BS_DEFPUSHBUTTON)
    ; CheckBox
    $changePassword_C = GUICtrlCreateCheckbox("Change Password", 160, 136, 113, 25)

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

    GUICtrlSetFont($headline_L, 18, -1, -1, "Arial")
    GUICtrlSetColor($headline_L, "0xff0000")
    ; TrayTip
    TrayTip("Security Check", "Please, authenticate with user & password", 2, 1)
    GUISetState(@SW_SHOW)

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

    ;Variables
    Dim $guiStatus = 0
    Dim $exists = False
    Dim $changeActivated = False
    Dim $acceptedUser = ''
    Dim $sectionArray = ''
    ; create Obj for speech
    Dim $voice = ObjCreate("Sapi.SpVoice")

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

    ; You can change the elements which are used for encryption here
    Dim $cryptArray = StringSplit("2we4rf,adfi8,i9lp,we2ay,9o0pw,asdc4,1209i,tz573,98m3,6tg5", ",")

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

    Start()

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

    ; Check at start, whether the ini file is there. If not create it with the initial credentials
    Func Start()
    ;Check for password file
    If Not FileExists($iniPath & $nameOfIni) Then
    _FileCreate($iniPath & $nameOfIni)
    Local $cryptWord = Random(0, 9, 1)
    IniWrite($iniPath & $nameOfIni, '1', _StringEncrypt(1, $InitialUser, 'key', 2), _StringEncrypt(1, $InitialPassword, $cryptArray[$cryptWord], 2) & $cryptWord)
    FileSetAttrib($iniPath & $nameOfIni, "+SH")
    EndIf
    EndFunc ;==>Start

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

    ; Changing GUI whether you want to login or create new users
    If $cmdLine[0] > 0 Then
    If $cmdLine[1] = $createNewUser Then
    $guiStatus = 1
    GUICtrlSetData($button_B, "Save")
    GUICtrlSetData($headline_L, "New User")
    GUICtrlSetData($status_L, "Ready ...")
    GUICtrlSetState($changePassword_C, $GUI_HIDE)
    EndIf
    EndIf

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

    ; Func create new user
    Func createNewUser()
    Local $exists = False
    $sectionArray = IniReadSection($iniPath & $nameOfIni, '1')
    If @error Then
    MsgBox(4096, "", "Error occured, probably no INI file.")
    Else
    For $i = 1 To $sectionArray[0][0]
    If _StringEncrypt(0, $sectionArray[$i][0], 'key', 2) = GUICtrlRead($username_I) Then
    GUICtrlSetData($status_L, "User already exists!")
    If $Sound = 1 Then Speak("User already exists!")
    $exists = True
    Sleep(500)
    GUICtrlSetData($status_L, "Ready...")
    ExitLoop
    EndIf
    Next
    If $exists = False Then
    Local $cryptWord = Random(0, 9, 1)
    IniWrite($iniPath & $nameOfIni, '1', _StringEncrypt(1, GUICtrlRead($username_I), 'key', 2), _StringEncrypt(1, GUICtrlRead($password_I), $cryptArray[$cryptWord], 2) & $cryptWord)
    GUICtrlSetData($status_L, "New User created!")
    If $Sound = 1 Then Speak("New User created!")
    Sleep(500)
    GUICtrlSetData($status_L, "Ready...")
    EndIf
    EndIf
    EndFunc ;==>createNewUser

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

    ; check user and password
    Func verifyUserAndPassword()
    $exists = False
    GUICtrlSetData($status_L, "Verifying User")
    $sectionArray = IniReadSection($iniPath & $nameOfIni, '1')
    If @error Then
    MsgBox(4096, "", "Error occured, probably no INI file.")
    Else
    For $i = 1 To $sectionArray[0][0]
    Local $user = _StringEncrypt(0, $sectionArray[$i][0], 'key', 2)
    If $user = GUICtrlRead($username_I) Then
    Local $cryptNr = StringRight($sectionArray[$i][1], 1)
    Local $value = StringLeft($sectionArray[$i][1], StringLen($sectionArray[$i][1]) - 1)
    If _StringEncrypt(0, $value, $cryptArray[$cryptNr], 2) = GUICtrlRead($password_I) Then
    GUICtrlSetData($status_L, "Login accepted! Welcome! " & $user)
    If $Sound = 1 Then Speak("Login accepted! Welcome! " & $user)
    $exists = True
    $acceptedUser = GUICtrlRead($username_I)
    If Not BitAND(GUICtrlRead($changePassword_C), $GUI_CHECKED) Then
    _FileInstall()
    EndIf
    EndIf
    EndIf
    Next
    EndIf
    If $exists = False Then
    Sleep(200)
    GUICtrlSetData($status_L, "Access denied!")
    If $Sound = 1 Then Speak("Access denied!", 2, 100)
    Sleep(500)
    GUICtrlSetData($status_L, "Ready...")
    EndIf
    EndFunc ;==>verifyUserAndPassword

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

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop
    Case $msg = $button_B
    If (StringLen(GUICtrlRead($username_I)) < 3 Or StringLen(GUICtrlRead($password_I)) < 3) And $exists = False Then
    GUICtrlSetData($status_L, "Minimum 3 letters")
    If $Sound = 1 Then Speak("Minimum 3 letters")
    Else
    If $guiStatus = 0 And Not BitAND(GUICtrlRead($changePassword_C), $GUI_DISABLE) And $changeActivated = False Then
    verifyUserAndPassword()
    ElseIf $guiStatus = 1 And Not BitAND(GUICtrlRead($changePassword_C), $GUI_DISABLE) And $changeActivated = False Then
    createNewUser()
    EndIf
    If $changeActivated = True Then
    If GUICtrlRead($username_I) = GUICtrlRead($password_I) Then
    For $i = 1 To $sectionArray[0][0]
    If _StringEncrypt(0, $sectionArray[$i][0], 'key', 2) = $acceptedUser Then
    Local $cryptWord = Random(0, 9, 1)
    IniWrite($iniPath & $nameOfIni, '1', _StringEncrypt(1, $acceptedUser, 'key', 2), _StringEncrypt(1, GUICtrlRead($username_I), $cryptArray[$cryptWord], 2) & $cryptWord)
    ExitLoop
    EndIf
    Next
    If (StringLen(GUICtrlRead($username_I)) < 3 Or StringLen(GUICtrlRead($password_I)) < 3) Then
    GUICtrlSetData($status_L, "Minimum 3 letters")
    If $Sound = 1 Then Speak("Minimum 3 letters")
    Else
    GUICtrlSetData($status_L, "New password saved!")
    If $Sound = 1 Then Speak("New password saved!")
    Sleep(500)
    GUICtrlSetData($status_L, "Program closes in 1 sec")
    If $Sound = 1 Then Speak("Security Check closes ...")
    Sleep(200)
    check()
    EndIf
    Else
    GUICtrlSetData($status_L, "New passwords dont't match!")
    GUICtrlSetData($username_I, "")
    GUICtrlSetData($password_I, "")
    If $Sound = 1 Then Speak("New passwords dont't match!")
    EndIf
    EndIf
    If BitAND(GUICtrlRead($changePassword_C), $GUI_CHECKED) And Not BitAND(GUICtrlRead($changePassword_C), $GUI_DISABLE) And $changeActivated = False Then
    changePassword()
    EndIf
    EndIf
    EndSelect
    WEnd

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

    ; Preparing GUI for checking password
    Func changePassword()
    If $exists = True Then
    $changeActivated = True
    GUICtrlSetState($changePassword_C, $GUI_DISABLE)
    _GuiCtrlEditChangePasswordChar($username_I)
    _GuiCtrlEditChangePasswordChar($password_I)
    GUICtrlSetData($status_L, "Please, enter new password")
    GUICtrlSetData($username_L, "New password")
    GUICtrlSetData($password_L, "Reenter password")
    GUICtrlSetData($username_I, "")
    GUICtrlSetData($password_I, "")
    GUICtrlSetData($button_B, "Save new password")
    GUICtrlSetState($username_I, $Gui_FOCUS)
    Else
    GUICtrlSetData($status_L, "Please, authenticate first!")
    If $Sound = 1 Then Speak("Please, authorize first!")
    EndIf
    EndFunc ;==>changePassword

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

    ; Speak func
    Func Speak($Text, $Rate = 2, $Vol = 100)
    $voice.Rate = $Rate
    $voice.Volume = $Vol
    $voice.Speak ($Text)
    EndFunc ;==>Speak

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

    Func OnAutoItExit()
    FileDelete($yourScriptExe)
    EndFunc ;==>OnAutoItExit

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

    Func check()
    #NoTrayIcon
    GUISetState(@SW_HIDE)
    Dim $exe = StringSplit($yourScriptExe, "\")
    Sleep(200) ; Sleep, before LoginWrapper starts to check whether the wrapped exe is running
    While 1
    If ProcessExists($exe[$exe[0]]) = 0 Then
    FileDelete($yourScriptExe)
    Exit (0)
    EndIf
    Sleep(2000)
    WEnd
    EndFunc ;==>check

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

    ; Func to set the username (which is clear) to mask the typed signs
    Func _GuiCtrlEditChangePasswordChar(ByRef $h_edit, $s_newchar = '#')
    Local Const $EM_SETPASSWORDCHAR = 0xCC
    GUISetState(@SW_LOCK)
    If StringInStr(@OSVersion, "WIN_XP") And @NumParams = 1 Then
    Local $s_text = GUICtrlRead($h_edit)
    Local $pos = ControlGetPos(WinGetTitle(""), "", $h_edit)
    GUICtrlDelete($h_edit)
    $h_edit = GUICtrlCreateInput($s_text, $pos[0], $pos[1], $pos[2], $pos[3], $ES_PASSWORD, $WS_EX_CLIENTEDGE)
    Else
    GUICtrlSetStyle($h_edit, $ES_PASSWORD, $WS_EX_CLIENTEDGE)
    GUICtrlSendMsg($h_edit, $EM_SETPASSWORDCHAR, Asc($s_newchar), 0)
    EndIf
    GUISetState(@SW_UNLOCK)
    EndFunc ;==>_GuiCtrlEditChangePasswordChar

    [/autoit]
  • Hey,

    ich find das Script super aber ich hab bis jetzt nur rausgefunden wie ich das Passwort ändern kann. Wie man den Username ändert weiß ich net. Hoffe du kannst mir helfen @ th.meger...


    LG Setho

    • Offizieller Beitrag

    Wenn ich das richtig sehe ist eine ändern von Benutzernamen nicht vorgesehen aber wenn du das Programm mit newuser aufrufst kann ein neuer Benuter erstellt werden!

    • Offizieller Beitrag

    HI,

    bernd hat es schon richtig erkannt. Es gibt einen Adminuser, den man im Skript vor dem kompilieren festlegen muss (standard xxx mit passwort xxx). Dessen Passwort legt man ebenfalls im Skript fest. Man kann dieses nachträglich ändern in dem man sich erfolgreich authentifiziert und die Checkbox anhakt. Den Usernamen des Admins neu festzulegen ist bisher nicht vorgesehen.
    Mit dem im Skript festgelegten Parameter (Standard "newuser") <-- kann man ebenfalls ändern (in was man will) vor dem kompilieren - kann man anschließend neue User hinzufügen.

    Als Empfehlung gebe ich mein Vorgehen: User lokal einrichten und dann die ini mit auf den Zielrechner kopieren. So spart man sich das Einrichten, wenn man es auf mehrere Rechner verteilt.
    Außerdem sollte man den Parameter zur Neuanlage von Usern möglichst nicht weitergeben, sonst ... :hammer:

    So long,

    Mega

    P.S.: Wenn du sonst noch Fragen oder Wünsche hast, immer her damit. Bin zwar bis Ende September im Urlaub, aber ich freu mich immer über Feature Requests. :klatschen:

  • Hallo Mega,

    vielleicht habe ich eine Erweiterungsidee, aber noch habe ich die Funktion nicht ganz verstanden, allerdings auch noch nichts ausprobiert (nur hier gelesen).

    Also hiermit kann ich jedes beliebige Programm (exe) so schützen, dass es nur mit Passwort nutzbar ist????

    Ginge das dann auch mit PDF, DOC, ect. - Dateien?

    Wenn ich mich im WIN-Netzwerk einlogge, habe ich Rechte auf Verzeichnisse, welche vertraulich sind und ich nicht täglich benötige.

    Um den fremden Zugriffsschutz zu erhöhen, müsste ich
    * mich beim Verlassen ausloggen, Screensaver-Schutz oder Tastaturblocker verwenden.
    * mir 2 Logins mit unterschiedlichen Rechten geben
    * innerhalb des WIN-Logins nochmals einen geschützen Bereich einrichten, für den ich ein zweites Passwort benötige.

    Die letzte Möglichkeit finde ich die angenehmste und akzeptabelste und die habe ich mit 'Guardian Of Data' auch schon teilweise umgesetzt. Nachteil: Entschlüsseln vor Nutzung, Nutzung, Verschlüsseln nach Nutzung.

    Könnte Dein Tool hierfür eine weitere (bessere) Lösung darstellen?

    Viele Grüsse
    Carsten

    • Offizieller Beitrag

    HI Carsten,

    ich versuche nochmal die Funktion zu erklären. Es ist nämlich nichts besonderes. Die Idee ist also folgende:

    Du baust eine Exe-Datei, die eine Datei im Bauch hat. Zusätzlich wird eine User/Passwortabfrage in die exe integriert. Sollte die Authentifizierung erfolgreich sein, so wird die Datei im Bauch gestartet. Nach dem Beenden, wird die Datei, welche zur Laufzeit in ein angegebenes Verzeichnis versteckt hinkopiert wurde, wieder gelöscht, sodass nur die Wrapper.exe übrig bleibt.

    Derzeit wird geprüft, ob die geschütze Exe als Prozess läuft. Wenn man also DOC oder PDF Dokumente o.ä. schützen möchte, dann ginge das auch - muss aber angepaßt werden. Man könnte diese Dokumente allerdings nicht verändern, weil sie anschließend nicht "verändert" wieder in die exe integriert werden können.

    Das macht also nur Sinn bei Dateien, die längerfrisitg gleich bleiben.

    So long,

    Mega

  • Ui .... Ich habe mir das Programm gerade mal Runtergeladen und bin Begeistert!

    Vllt Könnte man die einzelnen Dinge die man in der au3 eingeben muss,
    einfach beim ersten start in eine Gui Verpacken ....


    Das Programm ist super!

    Gerade diese stimmen!

    Echt Gelungen!


    Mfg Lenny

    Jaja, Moo does the Cow!

  • Ich verstehe dich zwar nochnicht soorichtig..
    Aber vondem was ich verstanden habe, solltest du dir mal TrueCrypt (Hier noch noch eine Deutsche Anleitung, falls du kein Eng verstehen solltest ) anschauen ;.)

    mfg ZoR

  • idee ist sehr nett, jedoch zahlt sich der aufwand eigentlich nicht wirklich aus. wenn man bedengt das man diverse optionen auch bei win rar, upx oder zb zip / 7zip hat, wurde hier das rad ein zweites mal erfunden. auch wenn ich die idee gut finde. meiner meinung dient es mehr als tutorial wie man so etwas hinbekommt, als anwendungsgebräuchlich.

    :thumbup:

  • Ich habe folgendes Problem: Ich habe das neue Autoit installiert und in diesem existiert RunErrorsFatal nicht mehr. Deshalb gibt dedr Script folgenden Fehler aus:

    Line 47 (File "C:\Dokumente und Einstellungen\Arkaneus\Eigene Dateien\Autoit\LoginWrapper1.3.au3"):

    Opt("RunErrorsFatal", 0)

    Error: Unknown option or bad parameter specified.


    Was muss an dem Script geändert werden?

    Viele Grüße, Arkaneus

  • Hallo Mega,

    klasse Programm!!!!

    An dieser Stelle möchte ich mein Script los werden, was eine "entschärfte Version" von Deinem darstellt.
    Vielleicht kann es jemand gebrauchen..

    Ich hatte das Bedürfniss, dass ich meine Scripte von einem "uneingeweihten" Anwender schützen wollte (aus Faulheit/Zeitmangel sie zu dokumentieren :)
    Also, ganz einfach: nur derjenige, der weiss, dass man beim klicken auf OK die STRG-taste drucken soll, kommt weiter ...
    So kann man die Tools auch auf dem Kunden-Server liegen lassen ;)

    Grüße,

    Alex

  • Hi,
    ich hab da mal eine Frage
    und zwar kann es sein das sich dein Script mit der Aktuellen Version (3.3.0.0) von AutoIt nicht compilieren lässt?
    bekomm leide einer error bei der Zeile

    Opt("RunErrorsFatal", 0)

    und dann als nächstes bei

    $username_L = GUICtrlCreateLabel("Username : ", 16, 80, 131, 17, $SS_SUNKEN) und zwar kennt er "$SS_SUNKEN" nicht.

    aber sonst ein tolles Script.
    thx