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);
}
你这样做是不安全的;SendMessage
调用有多种方式可以被任何想要这样做的人监视。
SetWindowsHookEx
与WH_CALLWNDPROC
或WH_CALLWNDPROCRET
将让攻击者监控发送到给定线程的所有消息,或者他们可以监控整个系统的所有消息,只是过滤掉那些前往SendMessage
目标的消息。
或者,攻击者可以将自己注入您的接收进程,使用WriteProcessMemory
将DLL名称写入接收进程,然后使用CreateRemoteThread
和LoadLibrary
将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,尽管可以根据上下文猜测消息是什么。