如何知道".exe"进程是用C++还是 C# 编写的?

How to know if a ".exe" process was written with C++ or C#?

本文关键字:还是 exe 何知道 进程 C++      更新时间:2023-10-16

可能的重复项:
如何判断 win32 应用程序是否使用 .NET 运行时

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

如果您尝试确定进程是否为 .NET 进程,我可以建议一个受 Dave Van den Eynde 在本主题中的回答启发的解决方案: 如何判断 win32 应用程序是否使用 .NET 运行时

"如果应用程序需要 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);
            }
        }

在这里,您可以找到如何完成此操作的详细信息: 确定 DLL 还是 EXE 是托管组件

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

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

如果你想以编程方式这样做,你可以把这个VB项目作为一个起点。

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