【问题标题】:How to uniquely identify a process on windows?如何唯一标识Windows上的进程?
【发布时间】:2012-06-11 17:39:48
【问题描述】:

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

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

标准方法是按名称,对吗?但对我来说,真的很重要,因为我想与它交互,因为我想与它交互,如果我发现一个错误的进程将会失败。

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

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

【问题讨论】:

  • 您是否担心某个进程故意试图欺骗您的程序?换句话说,这是一个安全问题吗?还是你只是想不犯错?
  • @AdrianMcCarthy 实际上,这只是关于不犯错误,但这并不意味着它是一个不太相关的问题。另一方面,这意味着 inteded 赝品不是很相关。
  • 我并不是要暗示这个问题不相关。我只是想更好地了解需要什么样的解决方案。

标签: windows process


【解决方案1】:

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

我会这样做:

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

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

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

【讨论】:

  • 唯一的问题可能是我正在寻找的应用程序没有签名,但很高兴我从来没有遇到过这种情况。
  • 是的。如果没有数字签名,您将不得不回退到收集已知哈希列表,这显然会在为您的任何目标可执行文件发布补丁后立即中断。我想您还可以检查文件的元数据(产品名称/公司/等),但这很容易伪造,也不能保证存在。
【解决方案2】:

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

【讨论】:

  • 如果我知道可执行文件的位置但我不知道,那将是一个很好的解决方案,所以 +1 但这对我来说不是一个真正的解决方案。 (确实位置可能会改变。对于记事本,它实际上不起作用,但对于其他一些,尤其是便携式版本的程序。)
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-19
    • 2018-10-10
    • 2015-04-06
    相关资源
    最近更新 更多