【问题标题】:How to know if a ".exe" process was written with C++ or C#? [duplicate]如何知道“.exe”进程是用 C++ 还是 C# 编写的? [复制]
【发布时间】:2011-12-08 15:12:31
【问题描述】:

可能重复:
How do I tell if a win32 application uses the .NET runtime

有一种方法可以手动识别特定的“.exe”进程是用 C++(非托管代码)还是用 C#(托管代码)编写的?

【问题讨论】:

  • 我已经可以说有办法了,因为 Process Explorer 做到了。现在我们必须找到方法:p
  • 尝试用 [Reflector][1] 敲击 exe 看看会出现什么。 [1]:stackoverflow.com/questions/214764/…
  • 请注意,用 VB.NET 编写的程序生成的可执行文件“类型”与用 C# 编写的程序相同,您只能猜测用于创建非托管应用程序的程序。正如其他人提到的,您可以区分非托管代码和托管代码。
  • 通过编写自己的代码或使用其他工具?
  • 您希望以编程方式还是手动操作?

标签: c# c++ exe


【解决方案1】:

如果您想确定 进程 是否是 .NET 进程,我可以建议一个从 Dave Van den Eynde 在此主题中的回答中得到启发的解决方案:How do I tell if a win32 application uses the .NET runtime

“如果一个应用程序需要 mscoree.dll 才能运行,它就是一个 .NET 可执行文件。”。

鉴于此,您检查进程的模块以查看是否列出了 mscoree。

        foreach (var process in Process.GetProcesses())
        {
            if (process.Modules.OfType<ProcessModule>().Any(m => m.ModuleName.Equals("mscoree.dll", StringComparison.OrdinalIgnoreCase)))
            {
                Console.WriteLine("{0} is a .NET process", process.ProcessName);
            }
        }

【讨论】:

  • “mscoree.dll”是否是 C# 托管代码二进制文件的主要 dll 资源?我可以相信没有使用相同 dll 的 C++ 二进制文件吗?
  • 它不是托管库,但这个dll中的所有内容都与.NET Framework相关。它不保证该进程是一个纯 .NET 应用程序,但至少它托管了一些 .NET 代码。例如,如果您在 Microsoft Word 中加载 .NET 插件,则此 dll 将出现在模块中,即使 Word 本身不是 .NET 应用程序。
  • 为什么使用 C# 编写的控制台应用程序在使用这种方式检查时不显示为托管应用程序?
  • 虽然这是一个很好的答案,但使用 == 比较字符串可能会产生误导,因为某些进程模块名称是 MSCOREE.DLL。将== 更改为m.ModuleName.Equals("mscoree.dll", StringComparison.InvariantCultureIgnoreCase) 是更安全的选择。
  • @stt106 好点,谢谢。我已经编辑了答案
【解决方案2】:

您可以在这里找到详细的操作方法:Determining Whether a DLL or EXE Is a Managed Component

【讨论】:

  • 链接描述正确方式
【解决方案3】:

您可以在该文件上运行 peverify 或 ildasm(可从 Visual Studio 命令行环境获得),如果它不是托管代码,它将给您一个错误。请注意,在某些情况下,当他们使用加密 IL 并隐藏 CLR 引导加载程序的保护系统时,这将失败,但大多数程序没有这种保护。

【讨论】:

    【解决方案4】:

    如果它是 .NET .exe(或 .dll),它将依赖于 mscoree.dll,您可以通过使用 Dependency Walker 或类似的东西检查它来查看它。

    如果您想以编程方式执行此操作,可以将 this VB project 作为起点。

    不过,这并不能肯定地告诉你语言。您无法将 C# 与 VB.NET(或其他 .NET 语言)程序或 C++ 与 C 程序(或其他非 .NET 语言)区分开来。有些事情可以排除一种或另一种是唯一使用的语言,或者使一种或另一种更有可能。甚至可能有非托管代码以某种奇怪的方式使用 mscoree.dll。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-24
      • 2016-10-07
      • 2019-06-02
      相关资源
      最近更新 更多