Keylogger应用程序能够看到通过SendMessage()发送的消息吗?

时间:2014-03-20 03:18:16

标签: c# windows keylogger

我正在创建一个c#app,使用SendMessage()函数在记事本中发送消息。我已成功将字符串传递给记事本。字符串是非常重要的,我想知道键盘记录​​程序是否可以看到此消息?

如果是,您对我如何安全地发送字符串有任何其他想法吗?

以下是我使用的示例代码。

    [DllImport("user32.dll", EntryPoint = "FindWindowEx")]
    public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string   lpszClass, string lpszWindow);

    [DllImport("User32.dll")]
    public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);


    Process[] notepads = Process.GetProcessesByName("notepad");
    if (notepads.Length == 0) return;
    if (notepads[0] != null)
    {
        IntPtr child = FindWindowEx(notepads[0].MainWindowHandle, new IntPtr(0), "Edit", null);
        SendMessage(child, 0x000C, 0, TextBox1.Text);
    }

1 个答案:

答案 0 :(得分:2)

你在做什么并不安全;有多种方法可以让任何想要这样做的SendMessage电话进行监听。

带有WH_CALLWNDPROCWH_CALLWNDPROCRET

SetWindowsHookEx会让攻击者监控发送到给定线程的所有邮件,或者他们可以监控系统中的所有邮件,只过滤掉那些邮件到你的SendMessage目标。

或者,攻击者可以将自己注入您的收件人进程,使用WriteProcessMemory将DLL名称写入收件人进程,然后CreateRemoteThreadLoadLibrary将DLL加载到目标中处理。在那之后,监控进程的消息应该是相当简单的。

为避免使用DLL,攻击者还可以使用WriteProcessMemory将代码直接写入目标进程的内存空间,然后CreateRemoteThread进行调用。

所有这三种监测方法都记录在案in this CodeProject article。它确实有点旧,但方法应该仍然相关,尤其是SetWindowsHookEx

攻击者也可以hook various Windows APIs directly;这很困难,风险也很大,但根据数据的敏感性,攻击者可能会觉得这是一种有价值的方法。

诚实地,尝试保护您的数据将非常困难。您可以查看KeePass如何保护密码安全;它有一个设置(至少在1.x分支; KeePass 2.x是一个完全不同的应用程序)“允许只粘贴一次并防止剪贴板间谍”,这可能对你有所帮助。从KeePass获取另一个提示,您还可以查看Windows“Data Protection API

作为旁注,您可能想要替换

SendMessage(child, 0x000C, 0, TextBox1.Text);

SendMessage(child, WM_SETTEXT, 0, TextBox1.Text);

为了便于阅读。虽然可以根据上下文猜测消息是什么,但并不是很多人会自己识别0x000C。