Что нового

[Криптография] Установить пароль на запуск EXE

mrsoros

Новичок
Сообщения
20
Репутация
0
Проблема как я понял актуальная. Мне понадобилось установить пароль на exe-файл. И я не нашел ни чего толкового в инете + что бы не ругался антивирус.
Скрипт написал за 30 мин. Это не панацея. Продвинутый пользователь сможет получить доступ к exe и потом запускать его без пароля.
В общем делаем так:
1. Устанавливаем на exe атрибуты - только чтение, системный, скрытый, архивный.
2. Пакуем его 7z архиватором с паролем.
3. для работы понадобятся файлы: 7-zip.dll 7z.dll 7zG.exe. Они должны быть в папке со скриптом.
4. удаляем exe.
5. настраиваем скрипт под себя.
Вроде всё. Если не вдаваться в детали)
Код:
#AutoIt3Wrapper_icon="d:\install\Тестирование\ico.ico"
#AutoIt3Wrapper_UseUpx=y
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_Compile_both=y;Компилировать оба варианта X86 и X64 за раз. По умолчанию n
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>

Opt("TrayIconHide", 1)
Global Const $sPASSWORD = 11115 ; Пароль для сравнения

_InputPasswordBox()
If @error Then Exit

$Pach_Archive_file=@ScriptDir & "\maintest4.7z"
$Pach_Archive=@ScriptDir & "\7zG.exe"
$Pach_Test_EXE=@ScriptDir & "\maintest4.exe"


;Проверка наличия архиватора-------------------------------------------------------------------------------------------------------
If Not FileExists($Pach_Archive) Then
	MsgBox (1, "Тестирование", "Ошибка. Файл архиватора '" & $Pach_Archive & "' отсутствует.",6)
	Exit
EndIf
;-------------------------------------------------------------------------------------------------------Проверка наличия архиватора
;Проверка наличия архива-----------------------------------------------------------------------------------------------------------
If Not FileExists($Pach_Archive_file) Then
	MsgBox (1, "Тестирование", "Ошибка. Файл архива '" & $Pach_Archive_file & "' отсутствует.",6)
	Exit
EndIf
;-----------------------------------------------------------------------------------------------------------Проверка наличия архива
RunWait($Pach_Archive & " x -y -p1111+ -aoa -o" & Chr(34) & @ScriptDir & Chr(34) & " " & Chr(34) & $Pach_Archive_file & Chr(34),@ScriptDir,@SW_HIDE);Получается пароль на архив 1111+
If (not @error = 0) Or (not FileExists($Pach_Test_EXE)) Then
	MsgBox (1, "Тестирование", "Ошибка разархивации. Файл теста: '" & $Pach_Test_EXE & "' отсутствует.",6)
	Exit
EndIf
RunWait($Pach_Test_EXE)
FileSetAttrib($Pach_Test_EXE, "-RASHT")
FileDelete ($Pach_Test_EXE)
If FileExists($Pach_Test_EXE) Then
	MsgBox (1, "Тестирование", "Ошибка удаления.",6)
EndIf

Exit

Func _InputPasswordBox()
    $hPass_GUI = GUICreate("Ввод пароля", 310, 144, 488, 351)

    $nPass_Input = GUICtrlCreateInput("", 16, 32, 281, 21)
    _GUICtrlEdit_TogglePassChars($hPass_GUI, $nPass_Input, -1, "•")
    GUICtrlSetLimit(-1, 25)

    $nOk_Button = GUICtrlCreateButton("&Ok", 224, 112, 75, 25, $BS_DEFPUSHBUTTON)
    GUICtrlSetTip(-1, "Проверить")

    GUICtrlCreateGroup(" Введите пароль ", 8, 8, 297, 97)
    $nShowPass_Chckbx = GUICtrlCreateCheckbox("Отображать вводимые символы", 16, 72, 193, 17)

    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUISetState(@SW_SHOW)

    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                Return SetError(1)
            Case $nOk_Button
                If GUICtrlRead($nPass_Input) <> $sPASSWORD Then
                    MsgBox(48, "", "Не верный пароль", 0, $hPass_GUI)
					GUICtrlSetData ($nPass_Input,"")
					GUICtrlSetState ($nPass_Input,$GUI_FOCUS)
                Else
                    ;MsgBox(64, "", "Верный пароль", 0, $hPass_GUI)
                    GUIDelete($hPass_GUI)
                    Return SetError(0)
                EndIf
            Case $nShowPass_Chckbx
                _GUICtrlEdit_TogglePassChars($hPass_GUI, $nPass_Input, -1, "•")
        EndSwitch
    WEnd
EndFunc

Func _GUICtrlEdit_TogglePassChars($hWnd, $hCtrl, $iToggleState = -1, $sPassChar = "*")
    If Not IsHWnd($hWnd) Then $hWnd = WinGetHandle($hWnd)
    If Not IsHWnd($hCtrl) Then $hCtrl = ControlGetHandle($hWnd, "", $hCtrl)

    Local Const $EM_SETPASSWORDCHAR = 0xCC
    Local Const $EM_GETPASSWORDCHAR = 0xD2

    Local $iPass_Char = 0
    Local $aRet = DllCall("user32.dll", "long", "SendMessage", "hwnd", $hCtrl, "int", $EM_GETPASSWORDCHAR, "int", 0, "int", 0)

    If IsArray($aRet) And Not $aRet[0] Then $iPass_Char = Asc($sPassChar)

    If $iToggleState = 0 Then $iPass_Char = 0

    DllCall("user32.dll", "long", "SendMessage", "hwnd", $hCtrl, "int", $EM_SETPASSWORDCHAR, "int", $iPass_Char, "int", 0)
    ControlFocus($hWnd, "", $hCtrl)
EndFunc
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Какой смысл в пароле на программу?
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Не легче ли просто без всяких GUI сразу упаковать нужные файлы в архив? И распространять уже сам архив или SFX?

А для чего -- может просто "поиграться", (получится ли так сделать, может некое подобие лицензионного ключа, может чтобы не все (обычные юзеры) могли пользоваться этой прогой...
 
Верх