Что нового

[Мышь, клавиатура] [HotKeySet] Последовательность нажатий которая принимается, как пароль.

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
Прочитав кучу рассказов о Хакерах и не только в далеком прошлом. Встречал такую вещь, что у них на компьютере стоит хитрая программка распознающая свой/чужой. И при запуске компьютера если не ввести секретный код, то жесткий с системой сразу форматируется или наоборот если ввести... =) (окно ввода не появлется... т.е. сделано на хоткеях)
Есть замечательная функция Hotkeyset, но она распознает или только 1 клавишу или сочетание с ALT, CRTL, SHIFT... А хочется полноценный пароль хотя бы в 4-6 символов.

Попробовал реализовать через последовательность функций. Проблема в том, что рано или поздно ты все нажмешь эти клавиши и после при нажатии конечной клавиши будет опять срабатывать последняя функция.
Пример:
Код:
Hotkeyset("{A}", "keyB")

Func keyB()
$A=1
Hotkeyset("{B}", "keyC")
Endfunc

Func keyC()
$B=1
Hotkeyset("{C}", "keyD")
Endfunc

Func keyD()
$C=1
If $A=1 and $B=1 then
_unlock()
Endif 
EndFunc

Func _unlock()
;XXXX
;XXXX
;XXXX
EndFunc

Можно первое:
Воспользоваться: AdlibRegister в него загнать функцию которая будет сбрасывать переменные в 0 раз 1000 ms. Но тут проблема если вводишь под конец 1000ms цикла то обнуляются все переменные.
Также пробовал сделать, что-то подобное:
Код:
Func keyC()
$B=1
Hotkeyset("{C}", "keyD")
Sleep(1000)
If $C=0 then
$A=0
$B=0
EndIf
Endfunc
Получается, что даже если сбросил переменные в 0, то Hotkeyset стал доступен... и если нажать правильно следующую клавишу, то откроется следующий хоткей...
Далее додумал:
Код:
Func keyC()
If $A=1 then
$B=1
Hotkeyset("{C}", "keyD")
EndIf
sleep(1000)

If $D=0 then
$A=0
$B=0
$C=0
EndIf
Endfunc
Получилось пока не нажмешь нужную последовательность Хоткеев за 1000ms срабатывать не будет...


1. Остался вопрос возможно ли, как-нибудь отменить Hotkeyset()? Кроме как через _ScriptRestart().
2. Так же, как реализовать, чтобы при нажатии на любую другую клавишу шел сброс... т.е. ошибся последовательностью и нажал не ту клавишу и все сбрасывает до начала...
3. Так же возможно у кого-нибудь есть мысли, как всю эту функцию прописать более правильно или изящно в 1-2 строчки.
4. Как можно сделать так, чтобы и HotKey срабатывал и оригинальная клавиша нажималась.

Буду рад за любые мысли и комментарии. :IL_AutoIt_1:
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 596
Репутация
938
В много строчек, хотя можно просто в цикле все описать в одном, мне просто лень :smile:
Код:
#include "Misc.au3"
Global $dll = DllOpen("user32.dll"), $Timer, $TimerDiff
While 1
	$var = W8()
	If $var = 1 Then
		MsgBox(0,0,"Access granted")
	EndIf
WEnd

Func W8()
	Local $Timer, $TimerDiff
	If _IsPressed("48", $dll) Then ;h
		ToolTip("H")
		$Timer = TimerInit()
		While $TimerDiff < 1000
			If _IsPressed("45", $dll) Then ;e
				ToolTip("HE")
				$Timer = TimerInit()
				While $TimerDiff < 1000
					If _IsPressed("4c", $dll) Then ;l
						ToolTip("HEL")
						$Timer = TimerInit()
						While $TimerDiff < 1000
							If _IsPressed("4c", $dll) Then ;l
								ToolTip("HELL")
								$Timer = TimerInit()
								While $TimerDiff < 1000
									If _IsPressed("4f", $dll) Then ;o
										ToolTip("HELLO")
										$Timer = TimerInit()
										While $TimerDiff < 1000
											If _IsPressed("57", $dll) Then ;w
												ToolTip("HELLOWhellow")
												Return 1
											Else
												;
											EndIf
											$TimerDiff = TimerDiff($Timer)
										WEnd
									Else
										;
									EndIf
									$TimerDiff = TimerDiff($Timer)
								WEnd
							Else
								;
							EndIf
							$TimerDiff = TimerDiff($Timer)
						WEnd
					Else
						;
					EndIf
					$TimerDiff = TimerDiff($Timer)
				WEnd
			Else
				;
			EndIf
			$TimerDiff = TimerDiff($Timer)
		WEnd
	Else
		;
	EndIf
	ToolTip("")
EndFunc

Не помню какой командой, можно просто записывать в переменную все подряд нажатые клавиши за нужный период и в конце сравнивать результат с нужным текстом и решать, жить пользователю или не жить.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
zlo-kazan
Не нужно так выделять текст, тот кто решит тебе помочь и без этого прочитает первое сообщение.

Belfigor [?]
В много строчек, хотя можно просто в цикле все описать в одном, мне просто лень
Ужас!
Именно поэтому я и сделал _IsPressedEx UDF.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 596
Репутация
938
Ах да, вот ее то я и имел ввиду
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
Такая идея промелькнула:
Делаем окно за пределами экрана, на нём input и кнопку с $BS_DEFPUSHBUTTON, input фокусируем.
При старте пользователь может ввести пароль и нажать enter.
Если пользователь не знает об этом скрытом окне и делает что-то другое, тогда окно потеряет фокус, на это реагируем как на неверный пароль.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
dwerf [?]
Такая идея промелькнула
Неплохая идея:

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>

Global $sPassword = "qwerty"

$hGUI = GUICreate("", 230, 20, -9999, -9999, $WS_POPUP, $WS_EX_TOOLWINDOW)
$nInput = GUICtrlCreateInput("", 0, 0, 200, 20)
$nButton = GUICtrlCreateButton("OK", 202, 0, 26, 20, $BS_DEFPUSHBUTTON)
GUISetState(@SW_SHOW, $hGUI)

While 1
	$nMsg = GUIGetMsg()
	
	If Not WinActive($hGUI) Or ControlGetFocus($hGUI) <> "Edit1" Then
		WinActivate($hGUI)
		GUICtrlSetState($nInput, $GUI_FOCUS)
	EndIf
	
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nButton
			$sPass = GUICtrlRead($nInput)
			
			If $sPass == $sPassword Then
				MsgBox(262144+64, 'Wellcome!', 'Hello my dear master-hacker!')
				GUIDelete($hGUI)
				Exit
			Else
				_System_Destroy()
			EndIf
	EndSwitch
WEnd

Func _System_Destroy()
	;!!!
	MsgBox(262144+16, 'Fenito!', 'Oops, you are not my master, you are not sefisticated hacker as he is!' & @CRLF & 'I''m gona kill myself now, goodby...', 10)
	GUIDelete($hGUI)
	Exit
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
Или вариант с IsPressedEx:

Код:
#include <IsPressedEx.au3>

Global $sPassword = "qwerty"
Global $sBuffer = ""

HotKeySet("^+e", "_Quit")
 
While 1
	$vRet = _IsPressedEx("[:ALLKEYS:]")
	
    If $vRet Then
		$sBuffer &= __KeyGetType($vRet, 0)
		
		If $sBuffer = $sPassword Then
			MsgBox(262144+64, 'Wellcome!', 'Hello my dear master-hacker!')
			Exit
		ElseIf StringLen($sBuffer) >= StringLen($sPassword) Then
			_System_Destroy()
		EndIf
		
		Sleep(100)
	EndIf
	
    Sleep(10)
WEnd

Func _Quit()
    Exit
EndFunc

Func _System_Destroy()
	;!!!
	MsgBox(262144+16, 'Fenito!', 'Oops, you are not my master, you are not sefisticated hacker as he is!' & @CRLF & 'I''m gona kill myself now, goodby...', 10)
	Exit
EndFunc


задержка между нажатиями не меньше чем 100 мс, иначе не сработает.
 
Автор
zlo-kazan

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
Belfigor
Работает. :laugh: Почти, как задумывал, смущает только появляющийся текст рядом с мышкой. А работает с любой раскладкой... классно... :smile:

CreatoR
Учел. Исправил.

CreatoR сказал(а):
Именно поэтому я и сделал _IsPressedEx UDF.
Спасибо. Сейчас буду разбираться с библиотекой.

dwerf
Хорошая идея.

CreatoR
Получилось в разы проще для понимания.

Появился еще вопрос, как узнать, что скрипт запустился при прогрузке системы. Или звук, какой-нибудь добавить бульк, как скайп или beep.


Кстати мысль продолжилась... использовать не только, как пароль, а вместо HotKeySet(). Т.е. получается вместо хитрого сочетания клавишь Ctrl+Alt+P глобальная команда pingdns при которой идет:

Код:
Func ping_dns()
Run("C:\Windows\system32\cmd.exe")
sleep(500)
send("8.8.8.8")
send("{ENTER}")
EndFunc

Думаю запомнить что-то осмысленное будет легче чем хитрое сочетание клавиш... :smile: И функций можно больше запихать чем в Жесты мышкой
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
Вариант с HotStrings:

Код:
#include <HotStrings.au3>

Global $sPassword = "qwerty"
Global $bPassword_OK = False

HotKeySet("^+e", "_Quit")
_HotString_SetString($sPassword, "_HotStringCall_Proc")

While 1
    Sleep(10)
	
	If $bPassword_OK Then
		MsgBox(262144+64, 'Wellcome!', 'Hello my dear master-hacker!')
		Exit
	ElseIf StringLen($sBuffer) >= StringLen($sPassword) Then
		_System_Destroy()
	EndIf
WEnd

Func _HotStringCall_Proc($sParam)
	$bPassword_OK = True
EndFunc

Func _System_Destroy()
	;!!!
	MsgBox(262144+16, 'Fenito!', 'Oops, you are not my master, you are not sefisticated hacker as he is!' & @CRLF & 'I''m gona kill myself now, goodby...', 10)
	Exit
EndFunc

Func _Quit()
	Exit
EndFunc
 
Верх