我正在创建一个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);
}
答案 0 :(得分:2)
你在做什么并不安全;有多种方法可以让任何想要这样做的SendMessage
电话进行监听。
WH_CALLWNDPROC
或WH_CALLWNDPROCRET
的 SetWindowsHookEx
会让攻击者监控发送到给定线程的所有邮件,或者他们可以监控系统中的所有邮件,只过滤掉那些邮件到你的SendMessage
目标。
或者,攻击者可以将自己注入您的收件人进程,使用WriteProcessMemory
将DLL名称写入收件人进程,然后CreateRemoteThread
和LoadLibrary
将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。