今日の記事では、PythonでKeyLoggerを作るというエキサイティングなことをします。
キーボードをモニターして、タイピングの履歴を見たり、どのようにタイプしているかを分析したいと思ったことはありませんか?その第一歩は、キーボードモニターツール、つまりKeyLoggerを構築することです。
これが悪意のある方法で使用される可能性があることは十分承知していますが、自分のマシンをコントロールしているのはあなた自身であると仮定しています。
さぁ、始めましょう
必要なモジュールのインストール
最初のステップは、適切なツールが揃っていることを確認することです! Python 3と一緒に、キーボードからの入力を読み取るためのpynputモジュールもインストールする必要があります。
pip installコマンドでインストールしましょう。
pip install pynput |
キーボードを制御することもできますが、今回はキーボードに入力された内容を単純に監視して記録します。
このモジュールは、キーボードを監視するために、オペレーティングシステムに依存するバックエンドエンジンを使用するだけです。
例えば、Linux を使っているならば、バックエンドとして使う xorg
サーバーがあるかもしれません。
このモジュールはバックエンドエンジンと対話し、キーボードからの入力を取り込みます。
パイプラインは以下の図のようになります。
import pynput.keyboard as Keyboard
|
その結果、このモジュールは異なるオペレーティングシステムでも動作するようになります。
Pythonで次のようなKeyLoggerを設計します。
- キーが押されるのを待つだけのメインループを作成します。
- キーが押されたことをリスナーが検出すると、すぐにそれをコンソールに表示します。
では、コードを書き始めましょう。
Pythonでキーロガーを実装する
Pythonで pynput.keyboard
クラスを使用するキーロガーを書いてみます。
まず、必要なインポートを行います。
with Keyboard.Listener(on_press = on_press, on_release = on_release) as listener:
listener.join()
|
キーボードをリッスンするために、2種類のイベントを監視することにします。
- Key Presses – キーが押されるたびに。
キープレス – キーが押されるたびに * キーリリース – キーが離されるたびに
さて、pynput
はすでに私たちの生活をとても簡単にしてくれています。
キーが押されたときと放されたときのロジックを処理する2つの関数を定義する必要があるだけです。
これらの関数を定義し、pynput
を使用してキーボードリスナーに引数として渡す必要があります。
リスナーを作成するためのフォーマットは以下の通りです。
def on_press(key):
# Callback function whenever a key is pressed
try :
print (f 'Key {key.char} pressed!' )
except AttributeError:
print (f 'Special Key {key} pressed!' )
def on_release(key):
print (f 'Key {key} released' )
if key = = Keyboard.Key.esc:
# Stop the listener
return False
|
たった2行のコードです! ここでは on_press()
と on_release()
という2つのコールバック関数があり、適宜呼び出されます。
2行目は、リスナーのスレッドが実行を終了するのを Threading.join()
メソッドを使って待つだけです。
では、この2つの関数も定義してみましょう。
import pynput.keyboard as Keyboard
def on_press(key):
# Callback function whenever a key is pressed
try :
print (f 'Key {key.char} pressed!' )
except AttributeError:
print (f 'Special Key {key} pressed!' )
def on_release(key):
print (f 'Key {key} released' )
if key = = Keyboard.Key.esc:
# Stop the listener
return False
with Keyboard.Listener(on_press = on_press, on_release = on_release) as listener:
listener.join()
|
ここでは、まず key.char
を使って、押されたり離されたりしているキーを表示します。
特殊なキーが押された場合は、 key.char
が有効な ASCII 値ではないので、代わりに key
を表示しなければなりません。
同様に、 キーが押されるまで、 on_release(key)
も同じようにします。
そして、単に False
を返せば、リスナーは自動的に停止し、プログラムは終了します!
ここまでがプログラムの完成形です。
Key q pressed! Key 'q' released Key w pressed! Key 'w' released Special Key Key.shift pressed! Key A pressed! Key 'A' released Key Key.shift released Key a pressed! Key 'a' released Special Key Key.shift pressed! Key A pressed! Key 'A' released Key Key.shift released Special Key Key.shift pressed! Key @ pressed! Key '@' released Key Key.shift released Special Key Key.shift pressed! Key $ pressed! Key '$' released Key Key.shift released Special Key Key.shift pressed! Key ) pressed! Key ')' released Key Key.shift released Special Key Key.shift pressed! Key > pressed! Key '>' released Key Key.shift released Key . pressed! Key '.' released Special Key Key.esc pressed! Key Key.esc released |
サンプル出力
このように、のような特殊なキーでもキーボード出力をうまくキャプチャしてプリントすることができます
この記事もチェック:Pythonのpyfigletモジュールを使ってASCIIアートを作成する方法
まとめ
これでキーロガーが簡単に動作するようになりましたね。
これを基に、あなたのキーロガー・アプリケーションにもっと多くの機能を実装することも可能です。