4

我们以记事本为例。如何在我的应用程序中 100% 确定记事本是否正在运行?100% 我的意思是,如果有另一个名为“notepad.exe”的进程实际上不是真正的记事本而是仿制品,我不想检测它。只有真正的记事本。

我已经考虑过读取进程内存,但由于内存位移等原因,它比看起来要困难得多。

标准方式是按名称,对吗?但对我来说非常重要的是,它不是任何其他程序,因为我想与它进行交互,如果我发现一个错误的进程,这将导致严重失败。

有谁知道这样做的好方法?

PS:没有特定的编程语言可以做到这一点。如果可能的话,我更喜欢独立的解决方案。但如果需要,我会专门使用 .Net/C#。

4

3 回答 3

4

确保 99.9% 1确定您正在查看正确的可执行文件的唯一方法是验证文件的数字签名。例如,您要确保有问题的 notepad.exe 由“Microsoft Corporation”签名。

我会做这样的事情:

  1. 获取正在运行的进程列表。
  2. 过滤到感兴趣的名称(notepad.exe
  3. 获取每个进程的图像[可执行文件]路径。
  4. 验证 Authenticode 签名是否有效且受信任。
  5. 将签名者的名称与预期值进行比较。
  6. 成功!您可以非常确定这是正确的文件。

这种方法避免了诸如必须提前知道文件的位置(这几乎是不可能的——记事本安装在两个位置)、它的哈希值应该是什么(显然会改变)或奇怪的用户行为(替换带有其他文本编辑器的记事本)。

1 - 当然,不可能 100% 确定。有人真正确定可以使用预期的签名者名称对可执行文件进行自签名,并将证书添加到他们机器的根存储区,从而使签名看起来有效。

于 2012-06-11T18:16:13.080 回答
2

好吧,我还没有遇到过这种问题,但是您可以首先通过按名称搜索来检查进程是否正在运行(在您的情况下,这将是 notepad.exe),解析Process.GetProcesses()列表,然后获取 Process.StartInfo.FileName 和看看这是否是记事本可执行文件的路径,这样就可以了,对吧?

于 2012-06-11T17:51:19.073 回答
0

您对我们要运行的可执行文件到底了解多少?如果您知道可以用作“黑客”的文件大小。使用@josh3736 的方法,但是通过将文件大小与您知道的文件大小进行比较来替换第 4 点和第 5 点[不同的版本会有不同的大小,但如果没有太多,您可以对它们进行硬编码]。计算 Md5-Hashtag 看起来更专业,但做的事情基本相同。

** 如果您的进程有 GUI:您可以使用 EnumWindows 让孩子们获得编辑框等。找到适合您的“notepad.exe”的东西并检查它是否存在。

于 2012-06-11T18:34:07.433 回答