Что нового

Пароль к своей программе

Alexander

Новичок
Сообщения
105
Репутация
2
Всем привет! Подскажите, пожалуйста, как сделать, чтоб при запуске своей программы она спрашивала пароль. И если пароль был введен правильно, то она начала делать свои функции. :smile:
 

aranea

Новичок
Сообщения
27
Репутация
4
http://autoit-script.ru/index.php?topic=1103.msg7899#msg7899
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
Единственная проблема с этим, так это хранение пароля в самом скрипте, оно само по себе не надёжно.
 

aranea

Новичок
Сообщения
27
Репутация
4
А какие способы хранения паролей есть еще? кроме как в скрипте
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
aranea [?]
какие способы хранения паролей есть еще? кроме как в скрипте
Надёжно - никаких :smile:
Можно пробовать обфусцировать скрипт (ну или его части отвечающие за проверку пароля), запароить пароль другим паролем... но всё ровно это не поможет, кто сильно захочет, сможет “выковырять” этот пароль.
 
Автор
A

Alexander

Новичок
Сообщения
105
Репутация
2
Спасибо! Но есть одна проблема. При нажатии на cancel и "закрыть" пишет:
Sorry pall, wrong password. Try again
Т.е. выскакивает такое сообщение, когда вводишь неправильный пароль. Просто закрыть программу не получается...
Сделал так:
Код:
$superpass  = 'qwerty'
While 1
    $i  = InputBox('Super script', 'Enter password', '', '*')
    If StringCompare($i, $superpass) = 0 Then
        MsgBox(0, '', 'ta da... password is right')
        ExitLoop
    Else
        exit
    EndIf
WEnd


Вместо:

Код:
$superpass  = 'qwerty'
While 1
    $i  = InputBox('Super script', 'Enter password', '', '*')
    If StringCompare($i, $superpass) = 0 Then
        MsgBox(0, '', 'ta da... password is right')
        ExitLoop
    Else
        MsgBox(0, '', 'Sorry pall, wrong password. Try again')
    EndIf
WEnd


Но мне нужно сообщение, что пароль неправильный и чтоб можно было закрыть программу.
 

aranea

Новичок
Сообщения
27
Репутация
4
Код:
$pass = '123'
$i  = InputBox('', 'Enter password', '', '*')
If StringCompare($i, $pass) = 0 Then
    MsgBox(0, '', 'Password is right')
    ; код программы
Else
    MsgBox(0, '', 'Wrong password')
    Exit
EndIf
 
Автор
A

Alexander

Новичок
Сообщения
105
Репутация
2
Спасибо! :smile:
Как я сам не догадался)))
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Код:
$superpass  = 'qwerty'
While 1
    $i  = InputBox('Super script', 'Enter password', '', '*')
    If @error OR $i = "" Then ExitLoop
	If StringCompare($i, $superpass) = 0 Then
        MsgBox(0, '', 'ta da... password is right')
        ExitLoop
    Else
        MsgBox(0, '', 'Sorry pall, wrong password. Try again')
    EndIf
WEnd
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Kaster
ИМХО так, вроде прикольнее:
Код:
$superpass   = 'qwerty'
While 1
    $i  = InputBox('Super script', 'Enter password', '', '*')
    If @error OR $i = "" Then ExitLoop
	Sleep(2000)	
    If StringCompare($i, $superpass) = 0 Then
        MsgBox(0, '', 'ta da... password is right')
        ExitLoop    
    EndIf
WEnd

Но, все же строка $superpass = 'qwerty'
настораживает. Ее могут увидеть в декомпиляторе, дизассемблере или отладчике?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Kaster
Прикол в том, что кроме всего вышеперечисленного есть еще перебор пароля.
Sleep (2000) вроде как должен уменьшить скорость перебора.
А на счет - почему убрал сообщение о не правильном пароле, - ну ... долго текст писать.
Просто много прочел про это как-то на досуге. (Гугль => способы защит программ от взлома. И там что-то вроде - не дать повода
исследователю вашей программы понять о не правильном вводе кода)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
Yuriy [?]
Прикол в том, что кроме всего вышеперечисленного есть еще перебор пароля.
Sleep (2000) вроде как должен уменьшить скорость перебора.
Можно ещё ограничить юзера N-ым количеством ввода пароля...

не дать повода
исследователю вашей программы понять о не правильном вводе кода
Тогда можно его вводить в заблуждение:

Код:
$sPass = 'qwerty'

$iCounter = 0
$iInputsLimit = 5

While 1
	$iCounter += 1
	
	$sInput = InputBox('Supper script', 'Enter password', '', '*')
	If @error Then Exit
	
	If StringCompare($sInput, $sPass) = 0 Then
		MsgBox(64, 'Accepted', 'ta da... password is right, you may continue using this software.')
		ExitLoop
	Else
		$sMainMsg = 'Sorry pall, your keyboard is damaged, or it is a wrong password.\n\n'
		$sTriesMsg = 'Try again.\n(Tries allowed: %i, Tries left: %i)'
		$sLimitMsg = _
			"That's it, you tried [%i] times to input password, it seems that you are trying to hack this software,\n" & _
			"or you just having a really serious memory problem.\n\nTry again later."
		
		If $iCounter = $iInputsLimit Then
			$sMainMsg &= $sLimitMsg
		Else
			$sMainMsg &= $sTriesMsg
		EndIf
		
		MsgBox(16, 'Denied', StringFormat($sMainMsg, $iInputsLimit, $iInputsLimit - $iCounter))
		
		If $iCounter = $iInputsLimit Then Exit
	EndIf
WEnd

MsgBox(64, 'Software', 'The software works now!')


:laugh:
 

ynbIpb

Скриптер
Сообщения
399
Репутация
109
А зачем хранить пароль? Храните MD5 хэш пароля и сравнивайте, хотя это не мешает пропатчить проверку и на любые сравнения выдавать положительный результат.
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
Код:
#include <string.au3>

;~ $sCryptedPass = _StringEncrypt(1, 'qwerty', 'qwerty')
$sCryptedPass = '9BA81FDF0B89502F8E2B599A'

$sPassInput = InputBox('Password', 'Enter your password (qwerty):', '', '*')
If @error Then Exit

If _StringEncrypt(0, $sCryptedPass, $sPassInput) = $sPassInput Then
	Execute(_StringEncrypt(0, _
	'E3DD1FA20B8B512F8F59599BA2BFDC054B10F068FDE104C0EE6' & _
	'0BC5B63C52E214CD5891A3DF915F03BBB24439C92632BEF9178' & _
	'484514F0D06D7AA2169B911BB8E2CF588470D2B7CA256DA4555' & _
	'CECAAE8039CF1DF9CE5190B2997EFD6CDBF97A99B9C0D088A00' , _
	$sPassInput))
Else
	MsgBox(0, 'False', '"' & $sPassInput & '" is false.')
EndIf



Добавлено:
Сообщение автоматически объединено:

Можно использовать Call(), Assign(), Enum(), Execute() и шифровать их содержимое.
Восстановить скрипт не зная пароля вероятно будет довольно сложно.
С другой стороны замедлится работа скрипта.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
dwerf [?]
Можно использовать Call(), Assign(), Enum(), Execute() и шифровать их содержимое
А зачем, оно и без этого хорошо шифрует... я как то не задумывался над этой возможностью, т.е получается что для расшифровки пароля нужен сам пароль, а у нас его нет, значит можно смело хранить его в скрипте (по крайней мере уже не так просто получить его) :laugh:
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
CreatoR [?]
А зачем, оно и без этого хорошо шифрует...
Типа обфускации, например есть 10 пользовательских функций, а какая из них вызывается в зашифрованом Call() не видно, без пароля только угадывать.
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
dwerf
Пример интересный!
Вот только шифрование основной части скрипта… :scratch:
Не будет ли всё это дело "тормозить"?
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
Garrett сказал(а):
Вот только шифрование основной части скрипта… Не будет ли всё это дело "тормозить"?
Наверное будет, чем больше текста шифруется, тем сильнее. Надо пробовать.
 

SyDr

Сидра
Сообщения
651
Репутация
158
А нельзя разделить скрипт на 2 половинки: 2 отдельных скрипта?
2-ая половинка - собственно сам скрипт (имеющий в начале некую метку). Этот скрипт шифруется с заданным паролем каким-нибудь стандартным проверенным методом.
1-ая половинка - скрипт, принимающий пароль. С указанным паролем пытаеться расшифровать 2-ую половинку. И если у него получается (метка получена в результате расшифровки) - запускает его.
При таком подходе пароль вообще НИГДЕ не хранится.
 
Верх