【问题标题】:Find Programming Language Used查找使用的编程语言
【发布时间】:2022-01-14 14:35:13
【问题描述】:

找出应用程序是用什么编程语言编写的最简单的方法是什么? 我想从程序 exe 文件中知道它的 vb 或 c++ 或 delphi 或 .net 等。

【问题讨论】:

  • 记得5年前,我发现一个API调用需要窗口句柄,会返回窗口的类名。我注意到如果程序是用 VB 编写的,那么任何对象的类名都应该以“thunder”开头。如果它是用 Delphi 编写的,则类名通常带有“T”。我不确定是否仍然如此。

标签: windows computer-forensics


【解决方案1】:

试试PEiD

当然,如果他们使用打包机,则需要先进行一些拆包 :)

【讨论】:

  • 它还存在吗?如果是这样,你从哪里得到它(没有 softstsonic 的恶意软件)?
  • 成功了,有趣的是这个应用程序的名字在葡萄牙语中的意思是“放屁”...:P
  • PEiD v0.95 (2008.11.03) 从上述位置成功下载并在 Windows 7 Pro 64 下运行。但是,PEiD 对大多数但不是全部的 .exe 和 .dll 文件显示Not a valid PE file在我的系统上。我的猜测是 PEiD 适用于较旧的二进制文件,但不适用于较新的二进制文件。
  • 对我来说效果很好:-)
  • PE Detective 更好
【解决方案2】:

启动它并检查它与 Process Explorer 一起使用的运行时 DLL。

如果这不能立即显示出来,请在网络上搜索对这些 DLL 的引用。

大多数反汇编程序(包括我认为的 Olly)都可以轻松地向您显示 EXE 或 DLL 中包含的文本,这有时也可以提供线索。 Delphi 类型通常以 T 为前缀,就像在 TMyClass 中一样。

如果它是一个没有 DLL 引用且没有文本的小型可执行文件,那么您可能是 SOL。那时,您需要寻找特定编译器的惯用语,这主要是猜测。

【讨论】:

    【解决方案3】:

    检测程序是用什么语言编写的是一门艺术。这是可能的,但没有硬性规定。这需要大量经验(而且还会引出“你为什么要……”的问题,但这里有一些关于如何去做的想法。

    您正在寻找的是“签名”。签名可以是编译器包含的某个字符串,对正在使用的编程工具中非常常见的 API 的引用,或者甚至是正在使用的工具中常见的编程风格,在包含的字符串中可见在应用程序中。

    此外,应用程序的部署方式也有多种风格:部署目录中的各种配置文件、dll 和程序集,甚至图像、目录或图标。

    包装在自启动可执行文件中的 Java 应用程序将包含对 java 库的引用,并且可能在同一目录中包含某些库或文件,表明它是 java。

    如其他答案所示,托管程序集也会显示某些迹象:您可以在 Reflector 等中打开它。虽然 c# 和 VB 在编译后可以“互换”是正确的,但它们并不相同。如果您使用Reflector 反汇编VB 代码,您会经常看到程序集引用了Microsoft.VisualBasic.dll 程序集。您将能够区分 Mono 应用程序,因为它们很可能包含对单声道程序集的引用。

    许多编译器以某种方式组装和链接代码,并留下足迹。例如,使用“strings: tab in Process Explorer”检查一个窗口可执行文件,您会看到很多字符串。使用这些您可以确定 exe 中的编程风格、调用的方法、错误或跟踪方法。

    例如,编译器使用不同的本地化机制:Microsoft 将本地化字符串存储在 XML 文件或资源文件中。其他编译器将使用不同的策略。

    另一个例子是 c++ name manglingCodeWarrior 编译器使用与 Visual Studio 不同的算法来破坏调用的成员变量和函数的名称。

    我想你可以写一本关于准确确定任何可执行文件的血统的书。这个主题可能会被称为“编程考古学”。

    【讨论】:

    • 在没有 cmets 的情况下投反对票?是否有任何反对者有建设性的反馈?
    • Re:“编程考古学”,现在有一门正式的科学名为Software archaeology(我不提这个)。
    • 太棒了。
    【解决方案4】:

    您可以尝试使用Depends 查看它有哪些运行时依赖项,这可能会提供一些线索。

    【讨论】:

      【解决方案5】:

      最简单的方法是询问程序的开发人员。它不需要任何知识和实用程序。

      【讨论】:

      • 我猜他是否正在寻找一种工具来发现这一点,他很难与开发人员联系。
      • 似乎是一个愚蠢的答案,但这实际上是“黑客”的工作方式。 “社会工程”被称为...+1
      【解决方案6】:
      • Determine Delphi Application
      • 使用 eda_preview270.exe(来自here)或其他一些间谍工具并检查窗口类名称。如果他们读起来像 TButton 或 TfrmBlubb,那么它就是一个 VCL 应用程序。如果其中有“Afx”,则可能是 MFC。

      【讨论】:

        【解决方案7】:

        编译语言(我的意思是没有脚本语言,或 Java、.NET 等)被编译为 CPU 汇编指令,这本质上是一种单向转换。通常不可能确定程序是用哪种语言编写的。但是,使用依赖遍历器,您可能会确定程序正在加载哪个运行时库(如果有),从而确定它使用哪种语言(例如 MS Visual C++ 9使用 msvcr90.dll)。

        【讨论】:

        • 尽管您始终可以链接到旧版本的 CRT。
        • 我想是的。不过,你会知道它是 VC++。
        【解决方案8】:

        您可以通过尝试使用 ildasm.exe 工具打开来检查是否为 .net 程序集

        【讨论】:

        • 但是 .Net 中的不同语言呢?
        • phoenix - 无法确定。 C# 和 VB.NET 编译后可以互换。
        • 是的,无法确定,因为所有 .net 语言都将代码编译为相同的 IL 语言
        • 我认为 VB 在其 IL 可执行文件中留下了一些奇怪的东西。 C# 和其他 IL 语言不关心的东西,因为 VB 很奇怪。
        • 可互换但不相同。例如VB实现了c#“?”运算符作为对 Iif() 的函数调用。 VB 在很多方面都包含 Microsoft.VisualBasic。
        【解决方案9】:

        一般来说,你不能。

        如果你能把它加载到Reflector,你就知道它是一个托管程序集。

        【讨论】:

          【解决方案10】:

          这是个好问题。没有任何通用的方法可以说明,但我敢打赌,大多数编译器和库都会在生成的 EXE 文件中留下标记。如果你想花很多时间在上面,你可以收集一堆用已知语言编写的 EXE 并扫描常见的字符串。我会想象你会找到一些。

          Dependancy Walker,其他人提到这将是寻找明显依赖关系的好方法,例如 MSVCRT 的版本等

          【讨论】:

            【解决方案11】:

            我会尝试通过“字符串”程序运行 .exe 以获得各种提示。

            【讨论】:

              【解决方案12】:

              如果我没记错的话,PE Explorer Disassembler 提供了一些关于创建给定非 .net 和 java 二进制文件的编译器的信息,对于 .net,请使用 ReflectorILDAsm 工具

              【讨论】:

                【解决方案13】:

                我发现(至少在电脑游戏中)最简单的方法是查看嵌套在游戏主文件夹中的“redist”文件夹。对于一些在自己编程方面更有经验的人来说可能很明显,但此文件夹中 MSI 的特定目的是允许 setup.exe 文件自动安装游戏本身的先决条件。 例如: 在 Empire Total War 中,有一个名为“vcredist_x86-sp1.exe”的 MSI。这表明游戏/程序是用 Microsoft 的“Visual C 2005”在 .NET Framework 中编写的(通常)。 事实上,如果您打开 MSI/EXE,安装程序应立即指出它所使用的语言和版本。 我熟悉的原因是因为我在 .NET Framework 中使用 C# 和 VB 编写代码,并且我们为我们的业务应用程序自动安装了先决条件。 希望这会有所帮助!

                【讨论】:

                  【解决方案14】:

                  PE Detective 最适合我。

                  【讨论】:

                    猜你喜欢
                    • 2016-03-06
                    • 1970-01-01
                    • 2011-06-29
                    • 2021-07-28
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-03-30
                    • 1970-01-01
                    相关资源
                    最近更新 更多