Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Zitox en 25 Junio 2015, 22:07 pm



Título: Capturar teclas y mostrarlas en un Textbox o ListBox
Publicado por: Zitox en 25 Junio 2015, 22:07 pm
Buenas mi duda es la siguiente, hace poco eh terminado un proyecto que lo que hace es averiguar la IP de la pc donde se ejecuto el .exe y mandarla por email a un correo que yo indique.

Ahora quiero cambiar eso y lo que quiero hacer es que, lea las pulsaciones del teclado, y las muestre en un textbox o listbox. Lo de mandarlo por email ya se como hacerlo, pero se me complico esa parte.

Muchas gracias!



Título: Re: Capturar teclas y mostrarlas en un Textbox o ListBox
Publicado por: El Benjo en 26 Junio 2015, 07:21 am
Con la API mediante la función GetAsyncKeyState() puedes hacerlo.

http://www.pinvoke.net/default.aspx/user32.getasynckeystate (http://www.pinvoke.net/default.aspx/user32.getasynckeystate)


Título: Re: Capturar teclas y mostrarlas en un Textbox o ListBox
Publicado por: Eleкtro en 26 Junio 2015, 10:39 am
Ahora quiero cambiar eso y lo que quiero hacer es que, lea las pulsaciones del teclado, y las muestre en un textbox o listbox.

1. ¿Dentro, o fuera de la ventana de la aplicación?.

2. ¿Tecnología Windows Forms, o WPF?.

Doy por entendido que pretendes capturar las pulsaciones del teclado de manera global, ya que la app no parece ética... y... ¿donde está tú código?, aquí no se hacen tareas.

Necesitarás crear un Hook de bajo nivel del teclado, no es muy complejo, pero si tedioso, ya que necesitasrás P/Invokear bastante y si no te documentas bien sobre las funciones y el callback del teclado te puedes perder un poco.

Aparte de eso, si quieres que sea perfecto también necesitarías obtener y aplicar el layout del teclado actual (para interceptar correctamente teclas cómo la Ç o la Ñ) e implementar tu propia lógica con ello, e identificar los modificadores de tecla, que aparte de con la WinAPI, también los puedes identificar con las dos classes de WPF que menciono al final del todo de este post.

Te indico más o menos lo necesario para desarrollar un keylogger normalito:

Funciones:
SetWindowsHookEx (https://msdn.microsoft.com/en-us/library/windows/desktop/ms644990%28v=vs.85%29.aspx) + WH_KEYBOARD_LL Hook Type (https://msdn.microsoft.com/en-us/library/windows/desktop/ms644959%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396#wh_keyboard_llhook)
CallNextHookEx (https://msdn.microsoft.com/en-us/library/windows/desktop/ms644974%28v=vs.85%29.aspx)
UnhookWindowsHookEx (https://msdn.microsoft.com/en-us/library/windows/desktop/ms644993%28v=vs.85%29.aspx)

Estructuras:
KBDLLHOOKSTRUCT (https://msdn.microsoft.com/en-us/library/windows/desktop/ms644967%28v=vs.85%29.aspx)

Callbacks/Delegados:
KeyboardProc (https://msdn.microsoft.com/en-us/library/windows/desktop/ms644984%28v=vs.85%29.aspx)

Mensajes de ventana:
WM_KEYDOWN (https://msdn.microsoft.com/en-us/library/windows/desktop/ms646280%28v=vs.85%29.aspx)
WM_KEYUP (https://msdn.microsoft.com/en-us/library/windows/desktop/ms646281(v=vs.85).aspx)
WM_SYSKEYDOWN (https://msdn.microsoft.com/en-us/library/windows/desktop/ms646286(v=vs.85).aspx)
WM_SYSKEYUP (https://msdn.microsoft.com/en-us/library/windows/desktop/ms646287(v=vs.85).aspx)

Utilidades adicionales (que puedes usar en WinForms también):
System.Windows.Input.KeyInterop Class (https://msdn.microsoft.com/en-us/library/system.windows.input.keyinterop%28v=vs.110%29.aspx) (para convertir un código de tecla virtual a tecla, y viceversa)
System.Windows.Input.KeyBoard Class (https://msdn.microsoft.com/en-us/library/system.windows.input.keyboard%28v=vs.110%29.aspx) (sustituye al P/Invoking de varias funciones como la mencionada en el comentario de arriba, GetAsyncKeyState, y tiene otros miembros muy útiles, la class Input en general)

Tienes faena :xD, en realidad te costaría mucho más aprenderlo, que poner en práctica lo aprendido, no es dificil y además con todos los ejemplos que puedes encontrar por Google, ánimo...

PD: Aparte hay una técnica mejor que la tradicional, RAWINPUT (que requieren gran cantidad de P/Invoking también), pero he preferido detallar la tecnica del hooking ya que te resultará más sencilla que esto:
About Raw Input (https://msdn.microsoft.com/en-us/library/windows/desktop/ms645543%28v=vs.85%29.aspx)

Citar
The raw input model is different from the original Windows input model for the keyboard and mouse. In the original input model, an application receives device-independent input in the form of messages that are sent or posted to its windows, such as WM_CHAR, WM_MOUSEMOVE, and WM_APPCOMMAND. In contrast, for raw input an application must register the devices it wants to get data from. Also, the application gets the raw input through the WM_INPUT message.

There are several advantages to the raw input model:

    An application does not have to detect or open the input device.
    An application gets the data directly from the device, and processes the data for its needs.
    An application can distinguish the source of the input even if it is from the same type of device. For example, two mouse devices.
    An application manages the data traffic by specifying data from a collection of devices or only specific device types.
    HID devices can be used as they become available in the marketplace, without waiting for new message types or an updated OS to have new commands in WM_APPCOMMAND.

Saludos!