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

本文关键字:消息 SendMessage 应用程序 Keylogger | 更新日期: 2023-09-27 17:50:59

我正在创建一个c#应用程序,使用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);
    }

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

你这样做是不安全的;SendMessage调用有多种方式可以被任何想要这样做的人监视。

SetWindowsHookExWH_CALLWNDPROCWH_CALLWNDPROCRET将让攻击者监控发送到给定线程的所有消息,或者他们可以监控整个系统的所有消息,只是过滤掉那些前往SendMessage目标的消息。

或者,攻击者可以将自己注入您的接收进程,使用WriteProcessMemory将DLL名称写入接收进程,然后使用CreateRemoteThreadLoadLibrary将DLL加载到目标进程中。在此之后,监视进程的消息应该是相当微不足道的。

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

这篇CodeProject文章记录了所有这三种监视方法。不可否认,它有点老了,但方法应该仍然相关,特别是SetWindowsHookEx

攻击者还可以直接挂钩各种Windows api;这很困难,而且有些风险,但根据您数据的敏感性,攻击者可能会发现这是一种值得采用的方法。

老实说,试图保护你的数据是非常困难的。你可以看看KeePass是如何保证密码安全的;它有一个设置(至少在1。x分行;KeePass 2。X是一个完全不同的应用程序),"只允许粘贴一次,防止剪贴板间谍",这可能对你有一些好处。从KeePass得到另一个提示,你也可以看看Windows的数据保护API。

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

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

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

的可读性。没有多少人能够单独识别0x000C,尽管可以根据上下文猜测消息是什么。