elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  [APORTE] Hook global de teclado (sin DLL) VB .NET
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [APORTE] Hook global de teclado (sin DLL) VB .NET  (Leído 6,562 veces)
kub0x
Enlightenment Seeker
Moderador
***
Desconectado Desconectado

Mensajes: 1.486


S3C M4NI4C


Ver Perfil
[APORTE] Hook global de teclado (sin DLL) VB .NET
« en: 26 Marzo 2012, 22:52 pm »

Buenas .NET(adictos),

he observado que por este foro circulan peticiones de usuarios que desean introducirse en el mundo del hooking en Windows y he decidido codear una breve aplicación, comentada al detalle para su buen entendimiento y poder comprender las nociones básicas del Hooking.

La verdad que aprendí hace unos 2 días, me puse en C a codearlo pero .NET me tira más, ya después de leer la documentación de MSDN (abajo os dejo el link) y utilizar un poquito (la Web) Pinvoke para declarar las funciones del API ya pude completar el programa.

El programa simplemente establece un Hook de tipo LowLevelKeyBoard, captura las teclas interceptadas por el hook y finalmente las guarda una a una en un fichero de la carpeta actual.

Link Documentacion Hooks-> http://msdn.microsoft.com/en-us/library/windows/desktop/ms632589%28v=vs.85%29.aspx

Como no, comparto con vosotros el Source del programa. Está codeado bajo el Framework 4.0 y desarrollado en Visual Basic .NET (VS 2010)

Link de descarga -> http://www.mediafire.com/?4fbdmx5obwu5k10

Source:

Código
  1. Imports System.Runtime.InteropServices
  2. Imports System.IO
  3. Imports System.Threading
  4. Imports System.Windows.Forms
  5. Public Class Form1
  6.    Enum Constantes As Integer
  7.        WH_KEYBOARD_LL = 13
  8.        HC_ACTION = 0
  9.        WM_KEYDOWN = &H100
  10.        WM_KEYUP = &H101
  11.        WM_SYSKEYDOWN = &H104
  12.        WM_SYSKEYUP = &H105
  13.    End Enum '-> Constantes utilizadas en el Hook Global
  14.    <StructLayout(LayoutKind.Sequential)> _
  15.    Public Class KBDLLHOOKSTRUCT
  16.        Public vkCode As UInt32
  17.        Public scanCode As UInt32
  18.        Public flags As UInt32
  19.        Public time As UInt32
  20.        Public dwExtraInfo As UIntPtr
  21.    End Class '-> Estructura que contiene los mensajes interceptados por el Hook
  22. #Region "Declaraciones_API"
  23.    <DllImport("user32.dll")> _
  24.    Friend Shared Function SetWindowsHookEx(ByVal idHook As Integer, ByVal lpfn As HookProc, ByVal hInstance As IntPtr, ByVal threadId As Integer) As Integer
  25.    End Function
  26.  
  27.    <DllImport("user32.dll")> _
  28.    Friend Shared Function CallNextHookEx(ByVal hhk As IntPtr, ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As KBDLLHOOKSTRUCT) As Integer
  29.    End Function
  30.    <DllImport("kernel32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
  31.    Public Shared Function GetModuleHandle(ByVal lpModuleName As String) As IntPtr
  32.    End Function
  33.    <DllImport("user32.dll", SetLastError:=True)> _
  34.    Public Shared Function UnhookWindowsHookEx(ByVal hhk As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
  35.    End Function
  36. #End Region '-> Declaraciones de APIs para el uso de Hooks (SetWindowsHookEx...)
  37.    Enum HookType As Integer
  38.        WH_JOURNALRECORD = 0
  39.        WH_JOURNALPLAYBACK = 1
  40.        WH_KEYBOARD = 2
  41.        WH_GETMESSAGE = 3
  42.        WH_CALLWNDPROC = 4
  43.        WH_CBT = 5
  44.        WH_SYSMSGFILTER = 6
  45.        WH_MOUSE = 7
  46.        WH_HARDWARE = 8
  47.        WH_DEBUG = 9
  48.        WH_SHELL = 10
  49.        WH_FOREGROUNDIDLE = 11
  50.        WH_CALLWNDPROCRET = 12
  51.        WH_KEYBOARD_LL = 13
  52.        WH_MOUSE_LL = 14
  53.    End Enum '-> Tipos de Hooks para monitorizar mensajes
  54.    'Declaramos un delegado y le asignamos sus respectivos argumentos
  55.    Delegate Function HookProc(ByVal code As Integer, ByVal wParam As IntPtr, ByVal lParam As KBDLLHOOKSTRUCT) As Integer
  56.    Private CallbackDelegate As HookProc = Nothing
  57.    'Declaramos la variable Hook. Será la encargada de almacenar la direccion de memoria del Hook
  58.    Dim hook As IntPtr = IntPtr.Zero
  59.    'Procedimiento asociado al puntero AddressOf(CallBackDelegate)
  60.    Private Function HookprocHandler(ByVal code As Integer, ByVal wParam As IntPtr, ByVal lParam As KBDLLHOOKSTRUCT) As Integer
  61.        Try
  62.            'Code es la variable encargada de decir si existe un mensaje. Si code !=0 no habra nada.
  63.            If (code < 0) Then
  64.                'Damos paso al siguiente Hook y procedemos con el continuamiento del Sistema
  65.                Return CallNextHookEx(IntPtr.Zero, code, wParam, lParam)
  66.            Else
  67.                Dim sr As New StreamWriter(CurDir() & "\log.txt", True)
  68.                'Segun el código devuelto a la pulsación de la tecla (257,258)
  69.                Select Case wParam
  70.                    Case Constantes.WM_KEYDOWN, Constantes.WM_SYSKEYDOWN
  71.                        Dim key As Char = ChrW(lParam.vkCode) 'Imprimimos el caracter ASCII en pantalla
  72.                        sr.Write(key)
  73.                End Select
  74.                sr.Close()
  75.                Return CallNextHookEx(IntPtr.Zero, code, wParam, lParam)
  76.            End If
  77.        Catch ex As Exception
  78.        End Try
  79.        Return 1
  80.    End Function
  81.    Private Sub Iniciar_Hook()
  82.        Try
  83.            'Asociamos a dicho procedimiento un puntero hacia el controlador del Hook (HookProcHandler)
  84.            CallbackDelegate = New HookProc(AddressOf HookprocHandler)
  85.            If hook <> 0 Then
  86.                'Desinstalamos el Hook
  87.                UnhookWindowsHookEx(hook)
  88.                hook = IntPtr.Zero
  89.                btn_hook.Text = "Hookear Teclado"
  90.            Else
  91.                'Instalamos un Hook Global (LowLevelKeyBoard) y llamamos a la funcion HookProcHandler
  92.                'Los ultimos dos parametros indican el HINSTANCE y PID, se utilizarian en caso de Hook local _
  93.                'empleados en juegos y demás.
  94.                hook = SetWindowsHookEx(HookType.WH_KEYBOARD_LL, CallbackDelegate, 0, 0)
  95.                btn_hook.Text = "Desinstalar Hook"
  96.                FileSystem.Kill(CurDir() & "\log.txt")
  97.            End If
  98.        Catch ex As Exception
  99.        End Try
  100.  
  101.    End Sub
  102.    Private Sub btn_hook_Click(sender As System.Object, e As System.EventArgs) Handles btn_hook.Click
  103.        Iniciar_Hook()
  104.    End Sub
  105. End Class
  106.  

Espero que os haya gustado el aporte. Cualquier duda que pueda surgir con el tema posteadla aquí, no olvideis que esto es lo más básico, los hooks tienen muchísimo juego.

Un Saludo ;)


En línea

Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate

Maurice_Lupin


Desconectado Desconectado

Mensajes: 356

GPS


Ver Perfil WWW
Re: [APORTE] Hook global de teclado (sin DLL) VB .NET
« Respuesta #1 en: 11 Abril 2012, 14:52 pm »

Buen aporte, no hay muchos ejemplos del uso de la API en vb.net, esa web de pinvoke a mi tambien me ha ayudado mucho, pero lo malo es que la mayoria de ejemplos estan en C#, lo bueno es que el sharpdevelop convierte proyectos de C# a vb  ;D

Saludos.


En línea

Un error se comete al equivocarse.
kub0x
Enlightenment Seeker
Moderador
***
Desconectado Desconectado

Mensajes: 1.486


S3C M4NI4C


Ver Perfil
Re: [APORTE] Hook global de teclado (sin DLL) VB .NET
« Respuesta #2 en: 14 Abril 2012, 21:50 pm »

Buen aporte, no hay muchos ejemplos del uso de la API en vb.net, esa web de pinvoke a mi tambien me ha ayudado mucho, pero lo malo es que la mayoria de ejemplos estan en C#, lo bueno es que el sharpdevelop convierte proyectos de C# a vb  ;D

Saludos.

Gracias por tu comentario :) La verdad es que encontré bastantes ejemplos para .NET pero no tenía ni papa (entonces) sobre APIs :D Por cierto, lo probé junto a un par de módulos más en XP y no funciona.. También por lo que he leído sobre Hooks a bajo nivel de teclado, éstos no son recomendables emplearlos en Win7 (me funciona de maravilla).

Recomiendan el uso de Raw Input, cada uno verá como rinde su app junto con los hooks. Sobre todo porque no funciona en XP, pues ni idea, quizá deba implementarlo de diferente manera.

Saludos.
« Última modificación: 16 Abril 2012, 21:46 pm por kub0x » En línea

Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Hook winapi global ?
Programación C/C++
Destro- 2 2,087 Último mensaje 20 Septiembre 2012, 06:12 am
por Destro-
[APORTE] Ejemplo de un LL-Hook para el Mouse.
.NET (C#, VB.NET, ASP)
Eleкtro 7 4,378 Último mensaje 26 Septiembre 2014, 16:41 pm
por Eleкtro
Hook de un teclado especifico
Ingeniería Inversa
Xephiro 5 7,479 Último mensaje 9 Febrero 2024, 13:35 pm
por ouet73
duda, hook del teclado.
Programación C/C++
Drewermerc 2 2,555 Último mensaje 4 Agosto 2015, 04:44 am
por wiserlander
Hook teclado Python
Scripting
Sentex 2 2,309 Último mensaje 15 Septiembre 2017, 00:15 am
por Sentex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines