• Offizieller Beitrag

    Hier: UDF für login (pincode) gab es eine Anfrage bezüglich einer Pin-Eingabe-Funktion.
    Ich habe meine Variante mal noch etwas verbessert und stelle sie hier zur allgemeinen Verfügung:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <ButtonConstants.au3>

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

    ; Beispiel (Anfang)
    $hMainGui = GUICreate('Testfenster (ist während PinInput gesperrt)', 600, 360)
    $hButton = GUICtrlCreateButton('Test', 10, 10, 100, 25)
    $hInput = GUICtrlCreateInput('', 120, 10, 200, 25)
    GUISetState()
    $Pin = _PinInput(6, False, $hMainGui)
    If $Pin <> '241211' Then Exit MsgBox(16, 'Test', 'Falscher Pin-Code! Programm wird beendet.', 3, $hMainGui)
    GUICtrlSetData($hInput, $Pin)
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    ; Beispiel (Ende)

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

    ;===============================================================================
    ; Function Name: _PinInput([$iCount = 4][, $bBeep = True][, $hParent = ''])
    ; Description:: Eingabe eines Pin-Codes (1-10stellig)
    ; Parameter(s): $iCount = Wie viele Stellen muss der Benutzer eingeben (1-10)
    ; $bBeep = Sound ein-/ausschalten (True/False)
    ; $hParent = Handle des Parent-Windows (dieses wird während
    ; der Eingabe deaktiviert).
    ; Requirement(s):
    ; #include <GUIConstantsEx.au3>
    ; #include <StaticConstants.au3>
    ; #include <WindowsConstants.au3>
    ; #include <ButtonConstants.au3>

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

    ; Return Value(s): Wenn Eingabe mit [ENTER] abgeschlossen wurde, wird der Pin-Code
    ; zurückgegeben, ansonsten ein Leerstring und @error = 1
    ; Author(s): Oscar (http://www.autoit.de)
    ;===============================================================================
    Func _PinInput($iCount = 4, $bBeep = True, $hParent = '')
    If $iCount > 10 Then $iCount = 10
    If $iCount < 1 Then $iCount = 4
    Local $iOldEventMode = Opt('GUIOnEventMode', 0), $msg, $sReturn, $sOut
    Local $aButtons[12] = ['7', '8', '9', '4', '5', '6', '1', '2', '3', 'C', '0', '<-']
    Local $aKeys1[12] = [ _
    '{NUMPAD7}', '{NUMPAD8}', '{NUMPAD9}', _
    '{NUMPAD4}', '{NUMPAD5}', '{NUMPAD6}', _
    '{NUMPAD1}', '{NUMPAD2}', '{NUMPAD3}', _
    '{DELETE}', '{NUMPAD0}', '{ENTER}']
    Local $aKeys2[12] = [ _
    '7', '8', '9', _
    '4', '5', '6', _
    '1', '2', '3', _
    '{DELETE}', '0', '{ENTER}']
    Local $aAccelKeys[24][2], $ahButtons[12]
    If IsHWnd($hParent) Then GUISetState(@SW_DISABLE, $hParent)
    Local $hGui = GUICreate('Pin eingeben (' & $iCount & ' stellig)', 224, 200, Default, Default, BitOR($WS_CAPTION, $WS_POPUPWINDOW), Default, $hParent)
    GUISetFont(14, 600, 0, 'Verdana')
    GUISetIcon('shell32.dll', -48)
    Local $hOutput = GUICtrlCreateLabel('', 16, 10, 192, 34, $SS_RIGHT, $WS_EX_STATICEDGE)
    GUICtrlSetFont(-1, 22, 400)
    GUICtrlSetBkColor(-1, 0xFFDDAA)
    For $i = 0 To 11
    $ahButtons[$i] = GUICtrlCreateButton($aButtons[$i], 16 + Mod($i, 3) * 64, 54 + Int($i / 3) * 34, 64, 34, $BS_ICON)
    $aAccelKeys[$i][0] = $aKeys1[$i]
    $aAccelKeys[$i][1] = $ahButtons[$i]
    $aAccelKeys[$i+12][0] = $aKeys2[$i]
    $aAccelKeys[$i+12][1] = $ahButtons[$i]
    Next
    GUICtrlSetImage($ahButtons[9], 'shell32.dll', -132, 0)
    GUICtrlSetImage($ahButtons[11], 'shell32.dll', -145, 0)
    GUICtrlSetState($ahButtons[11], $GUI_DISABLE)
    GUISetAccelerators($aAccelKeys, $hGui)
    GUISetState()
    While True
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    If IsHWnd($hParent) Then GUISetState(@SW_ENABLE, $hParent)
    GUIDelete($hGui)
    Opt('GUIOnEventMode', $iOldEventMode)
    If $bBeep Then Beep(200, 400)
    Return SetError(1, 0, '')
    Case $ahButtons[11]
    If StringLen($sOut) = $iCount Then
    If $hParent <> '' Then GUISetState(@SW_ENABLE, $hParent)
    GUIDelete($hGui)
    Opt('GUIOnEventMode', $iOldEventMode)
    If $bBeep Then Beep(800, 200)
    Return SetError(0, 0, $sOut)
    EndIf
    Case $ahButtons[9]
    GUICtrlSetState($hOutput, $GUI_FOCUS)
    GUICtrlSetData($hOutput, '')
    GUICtrlSetState($ahButtons[11], $GUI_DISABLE)
    $sOut = ''
    If $bBeep Then Beep(400, 200)
    Case $ahButtons[0] To $ahButtons[10]
    If StringLen($sOut) < $iCount Then
    $sOut &= $aButtons[$msg - $ahButtons[0]]
    GUICtrlSetData($hOutput, StringLeft('**********', StringLen($sOut)))
    If $bBeep Then Beep(600, 100)
    Else
    If $bBeep Then Beep(200, 200)
    EndIf
    If StringLen($sOut) = $iCount And BitAND(GUICtrlGetState($ahButtons[11]), $GUI_DISABLE) Then GUICtrlSetState($ahButtons[11], $GUI_ENABLE)
    EndSwitch
    WEnd
    EndFunc

    [/autoit]

    Screenshots:
    autoit.de/wcf/attachment/14575/ autoit.de/wcf/attachment/14576/

  • Macht optisch auf jeden Fall was her, nur wirkliche Sicherheit bringt die UDF (wie jede andere Pinpad UDF) nicht wirklich. Das Passwort steht ja offen im Quelltext. Und EXEn kann auch jeder decomplimieren. Aber das ist wohl eher ein allgemeines Problem.

  • Zitat

    Das Passwort steht ja offen im Quelltext. Und EXEn kann auch jeder decomplimieren.

    mmh, ich sag mal eben "Einspruch, Hörensagen!"

    Ich hab mir eben extra eine kleine Test Datei gebaut in der ich einer Variablen das "PASSWORD" zuteile und in einer MsgBox benutze.

    Extra ohne UPX Kompiliert, mit Notepad++ und einem HEX-Editor auseinander genommen - aber mein Passwort habe ich nicht gefunden.

    Wie könnte ich es denn finden?

    Hier mein Testskript:

    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_UseUpx=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    Dim $sPassword = "PASSW0RD"
    MsgBox(0,"Passwort","Das Passwort ist " & $sPassword)

    [/autoit]

    EDIT1: Im Quelltext ist klar :)

  • BLinz dein Einspruch ist komplett falsch. Man kann Autoit Problemlos und sehr einfach decompilieren egal ob UPX oder kein UPX. Ich werde dir aber nun sicher dazu hier keine Anleitung posten.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Mit Notepad++ wirst du in der EXE das Passwort selbstverständlich nicht finden. Dafür brauchst du einen sogenannten Decompliter, der die EXE sozusagen "entschlüselt". Dann liegt die EXE als AU3 Datei vor und du kannst das Passwort problemlos auslesen. Allerdings ist das decomplimieren illegal.

    • Offizieller Beitrag

    Ja genau! Die Funktion dient lediglich der Eingabe des Pin-Codes.
    Das Beispiel war jetzt sehr einfach gehalten. Man sollte natürlich nicht das Password selbst im Skript speichern, sondern lieber den Hashwert.
    Absolute Sicherheit gibt es bei einem AutoIt-Skript allerdings nicht. Darüber sind wir uns wohl einig.

    Hier ist mal ein Beispiel mit Hashwerten:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <ButtonConstants.au3>

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

    #include <Crypt.au3>

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

    ; Das hier dient nur zum erzeugen des Password-Hashwertes
    $sHash = _Crypt_HashData('241211', $CALG_SHA1)
    ConsoleWrite($sHash & @CR)
    ; das kommt nicht ins richtige Skript

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

    $sPasswordHash = $sHash ; hier würde man den Hashwert aus der Console eintragen

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

    ; Beispiel (Anfang)
    $hMainGui = GUICreate('Testfenster (ist während PinInput gesperrt)', 600, 360)
    $hButton = GUICtrlCreateButton('Test', 10, 10, 100, 25)
    $hInput = GUICtrlCreateInput('', 120, 10, 200, 25)
    GUISetState()
    $Pin = _PinInput(6, False, $hMainGui)
    $PinHash = _Crypt_HashData($Pin, $CALG_SHA1)
    If $PinHash <> $sPasswordHash Then Exit MsgBox(16, 'Test', 'Falscher Pin-Code! Programm wird beendet.', 3, $hMainGui)
    GUICtrlSetData($hInput, $Pin)
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    ; Beispiel (Ende)

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

    ;===============================================================================
    ; Function Name: _PinInput([$iCount = 4][, $bBeep = True][, $hParent = ''])
    ; Description:: Eingabe eines Pin-Codes (1-10stellig)
    ; Parameter(s): $iCount = Wie viele Stellen muss der Benutzer eingeben (1-10)
    ; $bBeep = Sound ein-/ausschalten (True/False)
    ; $hParent = Handle des Parent-Windows (dieses wird während
    ; der Eingabe deaktiviert).
    ; Requirement(s):
    ; #include <GUIConstantsEx.au3>
    ; #include <StaticConstants.au3>
    ; #include <WindowsConstants.au3>
    ; #include <ButtonConstants.au3>

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

    ; Return Value(s): Wenn Eingabe mit [ENTER] abgeschlossen wurde, wird der Pin-Code
    ; zurückgegeben, ansonsten ein Leerstring und @error = 1
    ; Author(s): Oscar (http://www.autoit.de)
    ;===============================================================================
    Func _PinInput($iCount = 4, $bBeep = True, $hParent = '')
    If $iCount > 10 Then $iCount = 10
    If $iCount < 1 Then $iCount = 4
    Local $iOldEventMode = Opt('GUIOnEventMode', 0), $msg, $sReturn, $sOut
    Local $aButtons[12] = ['7', '8', '9', '4', '5', '6', '1', '2', '3', 'C', '0', '<-']
    Local $aKeys1[12] = [ _
    '{NUMPAD7}', '{NUMPAD8}', '{NUMPAD9}', _
    '{NUMPAD4}', '{NUMPAD5}', '{NUMPAD6}', _
    '{NUMPAD1}', '{NUMPAD2}', '{NUMPAD3}', _
    '{DELETE}', '{NUMPAD0}', '{ENTER}']
    Local $aKeys2[12] = [ _
    '7', '8', '9', _
    '4', '5', '6', _
    '1', '2', '3', _
    '{DELETE}', '0', '{ENTER}']
    Local $aAccelKeys[24][2], $ahButtons[12]
    If IsHWnd($hParent) Then GUISetState(@SW_DISABLE, $hParent)
    Local $hGui = GUICreate('Pin eingeben (' & $iCount & ' stellig)', 224, 200, Default, Default, BitOR($WS_CAPTION, $WS_POPUPWINDOW), Default, $hParent)
    GUISetFont(14, 600, 0, 'Verdana')
    GUISetIcon('shell32.dll', -48)
    Local $hOutput = GUICtrlCreateLabel('', 16, 10, 192, 34, $SS_RIGHT, $WS_EX_STATICEDGE)
    GUICtrlSetFont(-1, 22, 400)
    GUICtrlSetBkColor(-1, 0xFFDDAA)
    For $i = 0 To 11
    $ahButtons[$i] = GUICtrlCreateButton($aButtons[$i], 16 + Mod($i, 3) * 64, 54 + Int($i / 3) * 34, 64, 34, $BS_ICON)
    $aAccelKeys[$i][0] = $aKeys1[$i]
    $aAccelKeys[$i][1] = $ahButtons[$i]
    $aAccelKeys[$i+12][0] = $aKeys2[$i]
    $aAccelKeys[$i+12][1] = $ahButtons[$i]
    Next
    GUICtrlSetImage($ahButtons[9], 'shell32.dll', -132, 0)
    GUICtrlSetImage($ahButtons[11], 'shell32.dll', -145, 0)
    GUICtrlSetState($ahButtons[11], $GUI_DISABLE)
    GUISetAccelerators($aAccelKeys, $hGui)
    GUISetState()
    While True
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    If IsHWnd($hParent) Then GUISetState(@SW_ENABLE, $hParent)
    GUIDelete($hGui)
    Opt('GUIOnEventMode', $iOldEventMode)
    If $bBeep Then Beep(200, 400)
    Return SetError(1, 0, '')
    Case $ahButtons[11]
    If StringLen($sOut) = $iCount Then
    If $hParent <> '' Then GUISetState(@SW_ENABLE, $hParent)
    GUIDelete($hGui)
    Opt('GUIOnEventMode', $iOldEventMode)
    If $bBeep Then Beep(800, 200)
    Return SetError(0, 0, $sOut)
    EndIf
    Case $ahButtons[9]
    GUICtrlSetState($hOutput, $GUI_FOCUS)
    GUICtrlSetData($hOutput, '')
    GUICtrlSetState($ahButtons[11], $GUI_DISABLE)
    $sOut = ''
    If $bBeep Then Beep(400, 200)
    Case $ahButtons[0] To $ahButtons[10]
    If StringLen($sOut) < $iCount Then
    $sOut &= $aButtons[$msg - $ahButtons[0]]
    GUICtrlSetData($hOutput, StringLeft('**********', StringLen($sOut)))
    If $bBeep Then Beep(600, 100)
    Else
    If $bBeep Then Beep(200, 200)
    EndIf
    If StringLen($sOut) = $iCount And BitAND(GUICtrlGetState($ahButtons[11]), $GUI_DISABLE) Then GUICtrlSetState($ahButtons[11], $GUI_ENABLE)
    EndSwitch
    WEnd
    EndFunc

    [/autoit]
  • Danke Oscar,

    mit dem Hashwerten habe ich da doch gleich eine Lösung für die Praxis :)

    Nein liebe Mit-AutoIt-ler, ich werde keine Hochsicherheitsanwendungen mit darin enthaltenen Passwörtern schreiben ;)