我怎样才能将一些按键转换为其他按键?

时间:2009-10-10 15:53:08

标签: c# intercept keylogger

我对考试作弊有很好的想法。我的学校使用非常旧的IDE(想想Turbo Pascal,Turbo C ++和其他80年代的IDE),我想做的就是:

  • 在后台启动我的程序

  • 拦截按键,而不是直接将它们发送到屏幕上,我想从预先配置的文本文件中读取一个字符,然后将其作为按下的键发送。这样,无论你写什么,该文件中的文本都会写在屏幕上。

我找到了关于记录密钥的Stephen Toub's文章,我认为这将成为构建此“tool”的良好开端。是否有更好的替代方法来拦截系统中按下的所有键而不是SetWindowsHookEx?代码是否会被防病毒程序标记为可疑程序?如果是这样,还有什么我可以用来实现这一点而不被防病毒软件标记?是否需要管理员权限?

我知道你们中的一些人会说如果我对学习的兴趣与避免学习一样多,我会做得很好,但我想尝试一下。

编辑:我添加了赏金,我对捕获键击的一些技术很感兴趣(我对低级挂钩或高级东西不感兴趣 - 基本的东西很好),主要是方法名称和一些链接到文档。我还想知道它们是否会像防病毒一样出现恶意软件。

4 个答案:

答案 0 :(得分:2)

SetWindowsHookEx是最佳选择。我被告知有些防病毒程序会标记它,但是我使用它创建了一个小应用程序并用AVG扫描它,没有返回任何病毒警报。

答案 1 :(得分:2)

并不是说我的作弊很好,但我们理解你的请求。我不认为没有进入API钩子是可能的,因为.Net包装WIN32 API我不认为他们已经包装了你想要的方法。

为了完整起见,我们只是添加一些细节:

不幸的是,您必须进入WIN32 API:http://msdn.microsoft.com/en-us/library/ms645530(VS.85).aspx

WM_SYSKEYDOWN 通知可用于获取击键,但它需要观察窗口的句柄,因此它将涉及* GetWindow ** API来获取窗口的句柄你想要监控。

尝试使用 SendInput keybd_event [http://msdn.microsoft.com/en-us/library/ms646304(VS.85).aspx]函数来模拟击键。

谷歌“WIN API查看器”,用于轻松搜索和查看所述API的实用程序,还有.Net代码的版本。

这是需要大量试验和错误的事情之一,我希望我能为您提供更明确的答案。

答案 2 :(得分:2)

GOD!前几天我刚刚找到了完美的课程..花了一些时间才找到原始资料来源:

http://www.codeproject.com/KB/cs/globalhook.aspx

我单独使用此(和SendKeys)完全满足您的需要,您需要使用Handle = true来阻止原始密钥消息。

SendKeys有点难看......如果您愿意,可以寻找替代品......但SendKeys会为您效劳。

使用SendKeys,它就像:

    private void HookManager_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.D){
            e.Handled = true;
            SendKeys.Send("F");
        }
    }

我实际上也使用这种方法来确定什么样的prccess'窗口是焦点,所以如果你在另一个应用程序上,应用程序将什么都不做:

    /// <summary>
    /// The GetForegroundWindow function returns a handle to the foreground window.
    /// </summary>
    [DllImport("user32.dll")]
    static extern IntPtr GetForegroundWindow();

    static bool IsProcessFocused(string processname)
    {
        if (processname == null || processname.Length == 0)
        {
            throw new ArgumentNullException("processname");
        }

        Process[] runninProcesses = Process.GetProcessesByName(processname);
        IntPtr activeWindowHandle = GetForegroundWindow();

        foreach (Process process in runninProcesses)
        {
            if (process.MainWindowHandle.Equals(activeWindowHandle))
            {
                return true;
            }
        }

        // Process was not found or didn't had the focus.
        return false;
    }

答案 3 :(得分:1)

据我所知,keylog最可靠的方法是建立系统范围的中断(我认为INT17h?),但考虑到你的帖子被标记为C#,这个级别相当低。去搜索相关工具......你会找到很多......