Что нового

Секретное слово в приложении для вызова функции

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Пример вызывает зарегистрированную функцию если же ввод с клавиатуры совпадает с зарегистрированной комбинаций, например может понадобится для доступа пользователю к настройкам вашей программы, так же можно реализовать смену секретного слова...

Код:
#include <WinAPI.au3>

Global $aHookRegister[2], $aCombinList[1][4]

Func CombinationRegister()
	$aHookRegister[0] = DllCallbackRegister('__hock_Proc', 'long', 'int;wparam;lparam')
	$aHookRegister[1] = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($aHookRegister[0]), _WinAPI_GetModuleHandle(''))
	If $aHookRegister[1] Then
		AdlibRegister('__compare_keys', 1)
		Return 1
	EndIf
	Return 0
EndFunc

Func CombinationUnregister()
	If $aHookRegister[1] Then
		_WinAPI_UnhookWindowsHookEx($aHookRegister[1])
	EndIf
	If $aHookRegister[0] Then
		DllCallbackFree($aHookRegister[0])
	EndIf
        AdlibUnRegister('__compare_keys')
EndFunc

Func AddCombinationEvent($aKeyList, $sProc)
	If IsArray($aKeyList) And UBound($aKeyList) And Not Ubound($aKeyList, 2) Then
		$aCombinList[0][0] += 1
		ReDim $aCombinList[$aCombinList[0][0] + 1][UBound($aCombinList, 2)]
		$aCombinList[$aCombinList[0][0]][0] = $aKeyList
		$aCombinList[$aCombinList[0][0]][1] = $sProc
		$aCombinList[$aCombinList[0][0]][2] = 0
		For $i = 0 To UBound($aKeyList) -1
			$aCombinList[$aCombinList[0][0]][3] += $aKeyList[$i]
		Next
		Return 1
	EndIf
	Return 0
EndFunc

Func __hock_Proc($nCode, $wParam, $lParam)
	Local $ttKeyHook, $aTemp

	$tKeyHook = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)

	If ($wParam = 256) Then
		For $i = 1 To $aCombinList[0][0]
			If DllStructGetData($tKeyHook, 'vkCode') == 0x10 And DllStructGetData($tKeyHook, 'vkCode') == 0x14 Then
				ContinueLoop
			EndIf
			If __compare($aCombinList[$i][0], DllStructGetData($tKeyHook, 'vkCode')) Then
				$aCombinList[$i][2] += DllStructGetData($tKeyHook, 'vkCode')
			Else
				$aCombinList[$i][2] = 0
			EndIf
		Next
	EndIf

	Return _WinAPI_CallNextHookEx(0, $nCode, $wParam, $lParam)
EndFunc

Func __compare_keys()
	For $i = 1 To $aCombinList[0][0]
		If $aCombinList[$i][2] == $aCombinList[$i][3] Then
			Call($aCombinList[$i][1])
			$aCombinList[$i][2] = 0
		EndIf
	Next
EndFunc

Func __compare($aKeys, $vkCode)
	For $i = 0 To UBound($aKeys) -1
		If ($aKeys[$i] = $vkCode) Then
			Return 1
		EndIf
	Next
	Return 0
EndFunc
;                    H     E     L     L     O
Global $aHello[5] = [0x48, 0x45, 0x4C, 0x4C, 0x4F] ; Virtual-Key Codes - http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx

;                     A     U     T     O     I     T
Global $aAutoIt[6] = [0x41, 0x55, 0x54, 0x4F, 0x49, 0x54]

If CombinationRegister() Then

	$hForm = GUICreate('', 400, 300)
	GUISetState()

	AddCombinationEvent($aHello, '__hello')
	AddCombinationEvent($aAutoIt, '__autoit')

	While 1
		Switch GUIGetMsg()
			Case -3
				CombinationUnregister()
				Exit
		EndSwitch
	Wend

EndIf

Func __hello()
	ConsoleWrite('Hello' & @CRLF)
EndFunc

Func __autoit()
	MsgBox(0, '', 'I love AutoIt :)')
EndFunc


Попробуйте запустить скрипт и ввести на клавиатуре слово autoit. Конечно пример не идеален и есть свои баги, например если несколько раз ввести на клавиатуре слово Hello, то слово AutoIt не сработает, не могу понять из-за чего.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
В справке к _WinAPI_SetWindowsHookEx как раз то что вы сделали.
 

Black_Hole

Знающий
Сообщения
126
Репутация
11
срабатывает при любом наборе, даже если активное окно у другой программы(строка адреса браузера), для расширенных настроек вариант запуска с ключом возможно будет интереснее
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Black_Hole

Вообще эту возможность я хочу включить в свою программу, надоели HotKey, ещё нужно выбрать так чтоб ни чего больше на этих клавишах не было повешено, у меня скрипт примитивный, убивает WinLock'еров, ищет записи о них в реестре, ищет пути их расположения и удаляет, казалось бы ни чего сложного, всё просто, но пару знакомых уже спасало и требуют новую версию.... в этой программе хочу сделать 2 окна, 1 - настройки, 2 - информация о процессе и файле который нужно закрыть/удалить, набрал зарегистрированное слово например (KillLocker) для завершения процесса WinLock'a и выскочило дочернее окно (чьим предком будет являться окно WinLock'ера) с полной информацией о WinLock'ере а далее пользователь сам будет решать, пощадить или удалить...
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
ivsatel

Да но эта программа (судя по описанию) восстанавливает автозагрузку, а моя убивает даже когда WinLock заблокировал ПК, но спасает только от примитивных WinLock'еров, есть такие которые создают новый рабочий стол и в нём производят некие действия...

P.S. хотя и таких можно убить.
 

erlik

Продвинутый
Сообщения
317
Репутация
84
OffTopic:
Для убийства winlocker'ов еще непридумали инструмента лучше чем AntiWinlocker (загрузочная версия).
В моем личном зачете примерно 500 убранных с его помощью баннеров абсолютно всех типов. :smile:
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
erlik

В моём более 100 убранных в ручную (примитивных), и 200 - 300 с помощью стороннего ПО в том числе и самописного :smile:

P.S. Даже приходилось самому писать WinLock'еры исключительно ради понимания их работы и ликвидации.

erlik [?]

Так он ещё и платный.... :-X (ещё один вымогатель)

OffTopic:

Кстати, мне интересно, как сделать загрузочный образ со своей программой
 

Black_Hole

Знающий
Сообщения
126
Репутация
11
Viktor1703

Как вариант: При нахождении курсора в координатах (x=0, y=0) более 5-10 секунд сворачивать(убивать) активное окно, решает проблему с 99% локеров. (если имя программы совпадает с ключом в автозагрузке - удалить ключ)
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Black_Hole

Есть уже такой вариант, только при зажатии ЛКМ на 3 сек. над определённым окном, появляется моё окно с информацией о окне, расположении, файла, название процесса и записями в реестре, а далее пользователь сам выберет что ему надо, проблема в том что это работает и на окнах самой системы, т.е. Desktop, TaskManager, Папки и т.д., если не информировать пользователя, то так можно прибить и explorer.exe...
 

erlik

Продвинутый
Сообщения
317
Репутация
84
Viktor1703
OffTopic:
Я использую его бесплатную версию 2-годичной давности (тогда автор еще денег за свое детище не просил). Впрочем цена то в общем то копеечная - 500 рублей.
Вручную убирать нецелесообразно так как время лишнее тратится, к тому ж 'AntiWinlocker CD\USB' автоматом практически ничего не делает - только путь до файла зловреда показывает, а дальше все равно нужно ветки реестра смотреть через встроеный редактор удаленного реестра, через файловый менеджер файл удалять, загрузочный сектор при необходимости восстанавливать. На все минут пять обычно уходит,так как все нужные инструменты встроены. AntiWinlocker это такой SDK многократно упрощающий процедуру ручного поиска, чем мне и нравится в отличие от всяких антисмс и т.д. Тут все равно нужно голову включать, чтобы правильно все сделать.
... Кстати у установочной версии программы была такая фишка как запуск процесса поиска зловреда в заблокированном компе на касание мышкой четырех стороной экрана :smile:
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
erlik [?]
На все минут пять обычно уходит

У меня всего несколько секунд на то чтобы сделать выбор и программа сама всё сделает, конечно же AntiWinlocker на много круче моей программы, но я не ставил для себя задачу сделать что - то подобное ему, просто хотел защитится от WinLock'еров и быстро убрать их из системы. Не думаю что обычный не опытный пользователь будет ходить по ветвям реестра и искать нужную запись :smile:
 

erlik

Продвинутый
Сообщения
317
Репутация
84
Viktor1703
OffTopic:
Не думаю что обычный не опытный пользователь будет ходить по ветвям реестра
Так ему и не надо - пускай все делают професcионалы. Это их (мой в том числе) хлеб :smile:
просто хотел защитится от WinLock'еров
От портящих загрузочную запись, увы, таким образом не защитишься и не систему не вылечишь.
Потому то ценны именно 'многостаночники' типа описанной проги. И как я уже писал - достойной альтернативы пока нет. Но это мое как говорится ИМХО.
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
OffTopic:
erlik [?]
От портящих загрузочную запись, увы, таким образом не защитишься и не систему не вылечишь.

Я пока таких не встречал и как не странно, мне не лень будет переустановить систему :smile:
 
Верх