Pythonでキーロガーの作り方|タイピングの履歴を保存していく方法を解説

スポンサーリンク

今日の記事では、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

サンプル出力

Pipeline Keylogger
Pipeline Keylogger

このように、のような特殊なキーでもキーボード出力をうまくキャプチャしてプリントすることができます


まとめ

これでキーロガーが簡単に動作するようになりましたね。

これを基に、あなたのキーロガー・アプリケーションにもっと多くの機能を実装することも可能です。


タイトルとURLをコピーしました