【问题标题】:Is There a Way to Tell What Language Was Used for a Program?有没有办法判断程序使用了什么语言?
【发布时间】:2010-12-30 23:54:34
【问题描述】:

我下载并安装了一个桌面程序。它从 .exe 文件运行。

.exe 文件中是否有某种方法可以告诉您使用哪种编程语言编写程序?

有什么工具可以帮助解决这个问题吗?

哪些语言可以确定,哪些不能?


好的,这是我正在寻找的两种东西:

  1. Tips to Determine Whether an App is Written in Delphi or Not

  2. Bruce McGee 的这个 "IsDelphi" program 将查找硬盘上所有使用 Delphi、Delphi for .Net 或 C++ Builder 构建的应用程序。

【问题讨论】:

  • John/Roger:实际上,当我在另一个程序中看到一个我认为对我来说很好的功能时,我的问题就发生了。如果我知道它是用什么语言编写的,我会更容易找到该功能是如何实现的。
  • 这是一个正当的理由。不要关闭它。
  • 什么功能?了解实现语言并没有太大帮助,但是结合您已经在使用或您已经知道的语言/工具包询问该特定功能更有可能得出您可以使用的答案。
  • 仅仅因为您认为 OP 没有充分的理由去做他正在做的事情并不意味着它“与编程无关”。这对我来说似乎是一个完全合理的问题。这个问题的有趣(并且与编程非常相关)部分是您是否可以实际推断出这一点以及如何推断,而不是工具是否存在。说真的,这里不是每个人都是应用程序开发人员。有不止一种编程类型和不止一种“有用”的定义。
  • 为什么要质疑这个问题?如果他想知道,那么他想知道,而且由于它涉及软件,因此对于 Stack Overflow 来说这是一个合适的问题。我不知道凯斯勒先生的动机,但我有时想知道某些东西是用什么语言写的,我敢肯定还有许多其他语言。

标签: windows delphi programming-languages executable reverse-engineering


【解决方案1】:

我使用WinDowse(一个用 Delphi 编写的小型免费软件实用程序)来监视程序的窗口。例如,如果您查看“类”选项卡表,您会发现控件的“类”名称。

例如:

  • TFormXX、TEditYY、TPanelZZZ 用于 delphi 应用程序
  • WindowsForms10.XXXX.yyy,用于 .NET 应用程序
  • wxWindowsXXX 用于 wxWindows 应用程序
  • 用于 MFC/VC++ 应用程序的 AfxWndXX(我认为)

我认为这是查找应用信息的最快方式(尽管不是最准确)。

【讨论】:

  • 感谢 Paolo,WinDowse 看起来是一个非常有用的程序。如果我能给出第二个被接受的答案,你就知道了。
【解决方案2】:

我理解你的好奇心。

您可以通过查找链接器添加的几个特定资源来识别 Delphi 和 C++ Builder 应用程序及其 SKU。特别是 RC Data\DVCLAL 和 RC DATA\PACKAGEINFO。 XN Resource Editor 使这更容易,但它可能会阻塞压缩的 EXE。

EXE 压缩器使事情变得有些复杂。他们可以隐藏或打乱资源的内容。用UPX 压缩的程序很容易用HEX editor 来识别,因为PE 头中的前两个部分被命名为UPX0 和UPX1。您可以使用该应用程序来解压这些。

使用 .Net 编译的应用程序不难检测。 Delphi 的最新版本甚至包括一个 IsAssembly 函数,或者您可以在 PE 标头中进行一些探索。查看 IsDelphi 中的 IsManaged 函数。

判断使用了哪种 .Net 语言比较棘手。默认情况下,VB.Net 包含对 Microsoft.VisualBasic 的引用,而 VCL.Net 应用程序包含 Borland 特定的引用。但是,VCL.Net 已不支持 Delphi Prism,您可以将 VB 程序集的引用添加到任何托管语言。

我没有看过一些使用签名来识别编译器的应用程序,所以我不知道它们的工作情况如何。

我希望这会有所帮助。

【讨论】:

  • 谢谢布鲁斯。很高兴我在问题中添加了 Delphi 标签。
【解决方案3】:

首先,看看它加载了哪些运行时库。 C 程序通常不会加载 Visual Basic 的库。

此外,请检查可执行文件中的信息字符串。在大多数可执行文件中,这已接近尾声。如果程序使用字符串常量,那么可能会有关于它们如何存储的线索。

【讨论】:

  • 符号和调用约定也会泄露它,以及 ebp/rbp 如何与调用堆栈一起使用。
【解决方案4】:

一个好的disassembler,当然还有对底层 CPU 架构的出色理解,通常可以帮助您识别正在运行的运行时库。除非 exe 已被仔细“剥离”符号和/或以其他方式屏蔽,否则在运行时库中看到的符号名称通常会为您提供编程语言提示,因为不同语言的标准指定不同的名称,以及编译器和随附的供应商运行时库通常非常遵守这些标准。

当然,如果不了解各种可能的语言及其库标准,您将无法到达那里 - 如果代码的作者有意掩盖信息,那么他们也不会太难做到。

【讨论】:

    【解决方案5】:

    如果您有大量来自已知编译器的样本,我认为这将是机器学习的绝佳应用。我相信所谓的“监督学习”在这里是相关的。不幸的是,我对这个话题几乎一无所知——只知道我在会议上听到了一些令人印象深刻的结果。

    您可以深入研究逆向工程工作会议的会议记录,看看是否有其他人对这个问题感兴趣。

    【讨论】:

      【解决方案6】:

      假设这是一个适用于 Windows 的应用程序...

      Reflector 是否将其识别为 .NET 程序集?然后是 MSIL,99% 要么是 VB 要么是 C#,但你可能永远不知道哪个,也没关系。

      是否需要解释器(如 Java?)?然后是 Java(或任何解释器。)

      检查它需要哪些运行时 DLL。

      它是否需要 VB 运行时 dll?恭喜,VisualStudio 6.0 或更早版本的 VB。

      是否需要 Delphi dll?恭喜,德尔福。

      你做到这一步了吗? C/C++。假设 C++,除非它需要 msys 或 cygwin dll,在这种情况下,C 可能有 25% 的机会。

      恭喜,这对于绝大多数 Windows 软件来说都是正确的。但这实际上可能对您没有帮助,因为在所有这些语言中都可以完成许多相同的事情。

      【讨论】:

      • 这是我一直在寻找的规则集。有什么可以更详细地说明这一点吗?
      • 嗯,不,这就是重点。我只是从几个基本想法中得出这个结论。如果它具有特定于外部语言的要求,例如 .NET 框架、解释器或特定于语言的运行时库,那可以为您提供线索。否则,可能需要多年使用各种编译器的经验才能弄清楚是什么编译器以任何真正的准确性创建了代码。如果没有外部库,您最好根据二进制文件的年龄将其称为 C 或 C++。
      • 我给你一个用汇编写的样本怎么样?检测程序集:主要不引用任何 C 运行时 dll 并且其中没有 stdlib 字符串(“请求运行时以不寻常的方式终止它”)。
      • 如果它是 .Net(或 Java)字节码,我不会说“......但你可能永远不知道哪个,也没有关系” - 有很多语言可以运行这些平台。 Delphi Prism、VB、C# / Scala、Groovy、Clojure 或 AspectJ 具有不同的功能集。
      • @mjustin:我现在意识到我不够清楚,但我并不打算将其作为 100% 包容性 100% 准确的演练。 (例如,对于 .NET,我说过 99% 的情况下它会是 VB 或 C#,这几乎是准确的,一旦它在 MSIL 中,它来自哪里都无关紧要,它都会反过来回到 C#。)我的观点是,对于绝大多数示例,一些基本规则通常是正确的,但除此之外,可能需要多年的经验才能准确了解二进制文件是从哪种语言编译而来的。
      【解决方案7】:

      IDA Pro 免费版 (http://www.hex-rays.com/idapro/idadownfreeware.htm) 可能会有所帮助。即使你不懂汇编语言,如果你将 EXE 加载到 IDA Pro 中,那么它的初始进度输出可能(如果有任何迹象)包括它对使用哪个编译器的最佳猜测。

      【讨论】:

        【解决方案8】:

        从 dumpbin 的各种选项开始。符号名称,如果不仔细擦除,会给你各种提示,告诉你它是 C、C++、CLR 还是别的什么。

        【讨论】:

          【解决方案9】:

          其他工具使用签名来识别用于创建可执行文件的编译器,例如 PEiD、CFF Explorer 等。

          他们通常会扫描可执行文件的入口点与签名。

          来自CFF Explorer

          签名浏览器可以让您了解一个签名是如何构造的。

          【讨论】:

            【解决方案10】:

            它看起来像 V6 的 VC++ 链接器 adds a signature 到您可以解析的 PE 标头。

            【讨论】:

              【解决方案11】:

              我建议PEiD(免费软件,封闭源代码)。拥有 Delphi for Win32 的所有签名,还可以告诉你使用的是哪个打包程序(如果有的话)。

              【讨论】:

                猜你喜欢
                • 2013-09-04
                • 2021-11-11
                • 1970-01-01
                • 1970-01-01
                • 2017-08-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-11-18
                相关资源
                最近更新 更多