代码之家  ›  专栏  ›  技术社区  ›  Tim

从二进制文件确定源语言?

  •  16
  • Tim  · 技术社区  · 16 年前

    responded

    是否有可能仅从二进制文件中确定程序编写的语言?

    • 从交互的角度来看(控制台行为、任何GUI外观等),两者是相同的。
    • 你和语言之间没有解释器或其他东西——只有原始的可执行二进制文件。

    8 回复  |  直到 9 年前
        1
  •  16
  •   Kelly S. French    16 年前

    长答案:

    如果你查看二进制文件,你可以找到已链接的库的名称。在TextPad中打开cmd.exe很容易在十六进制偏移量0x270处找到以下内容:msvcrt.dll、KERNEL32.dll、NTDLL。DLL、USER32.DLL等。msvcrt是Microsoft“C”运行时支持函数。KERNEL32、NTDLL和USER32.dll是特定于操作系统的库,它们根据跨平台开发环境对两者的隔离程度,告诉您目标平台或构建平台。

    撇开这些线索不谈,大多数c/c++编译器都必须将函数的名称插入二进制文件中,表中存储了所有函数(或入口点)的列表。C++“篡改”函数名以对参数及其类型进行编码,从而支持重载方法。可以混淆函数名称,但它们仍然存在。函数签名将包括可用于跟踪系统或程序中使用的内部调用的参数的数量和类型。在偏移量0x4190处是“SetThreadUILanguage”,可以搜索它以了解有关 development environment 。我在偏移0x1ED8A处找到了入口点表。我可以很容易地看到printf、exit和scanf等名称;以及__p_mode、__p_comode和__initenv

    x86处理器的任何可执行文件都将有一个数据段,其中包含程序中包含的任何静态文本。回到cmd.exe(偏移量0x42C8)的是文本“S.o.f.t.w.a.r.e.P.o.l.i.c.即S.M.i.c.r.o.S.o.f.t.w.i.n.d.o.w.S.y.S.t.e.M.”。字符串所需的字符数是通常所需的两倍,因为它是使用双宽字符存储的,可能是为了国际化。错误代码或消息是这里的主要来源。

    ,可以从二进制文件中确定源语言。

        2
  •  10
  •   Parappa    16 年前

    我不是编译器黑客(我希望有一天),但我认为你可以在二进制文件中找到信号,表明是什么编译器生成了它,以及使用了一些编译器选项,比如指定的优化级别。

    然而,严格来说,你所要求的是不可能的。可能是有人拿着笔和纸坐下来,计算出与他们想写的程序相对应的二进制代码,然后在十六进制编辑器中键入这些内容。基本上,他们将在没有汇编工具的情况下进行汇编编程。同样,您可能永远无法确定一个本机二进制文件是用直接汇编程序编写的,还是用带有内联汇编程序的C编写的。

        3
  •  2
  •   Christian Casutt    13 年前

    那么这些工具呢:

    PE Detective

    PEiD

        4
  •  1
  •   James Black    16 年前

    printf 例如,Objective-C和gnu C在这里应该有所不同。

    您已排除所有字节码语言,因此此问题将不会像预期的那样常见。

        5
  •  1
  •   S.Lott    16 年前

    what

    此外,通常还有一个指向各种库功能的“地图”。这也是一个很大的暗示。

    当库链接到可执行文件中时,二进制文件中通常会包含一个带有名称和偏移量的映射。这是创建“独立于位置的代码”的一部分。你不能简单地将各种目标文件“硬链接”在一起。您需要一个映射,并且在将二进制文件加载到内存中时必须进行一些查找。

        6
  •  0
  •   alternative    16 年前

    不,字节码与语言无关。不同的编译器甚至可以采用相同的代码源并生成不同的二进制文件。这就是为什么你看不到可以处理二进制文件的通用反编译器。

        7
  •  0
  •   David    16 年前

    命令“string”可用于获取有关使用了哪种语言的提示(例如,我只是在我编写的C应用程序的剥离二进制文件上运行它,它找到的第一个条目是可执行文件链接的库)。

        8
  •  0
  •   Jason Machacek    16 年前