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

如何检查macos可执行文件(mach-o)?

  •  -1
  • ccpizza  · 技术社区  · 6 年前

    如何查看有关MacOS二进制文件的一些基本信息,特别是用于构建该文件的内容、链接到的框架以及使用的系统调用?

    我试过了 nm otool -L 但它们的输出只是部分有用。

    例如,什么可以表明二进制文件是用xcode或golang编译器构建的?

    铌。我对反向工程macos二进制文件不感兴趣。我只想知道在我的系统上运行的是什么,只使用已经包括ootb的工具。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Rob Napier    6 年前

    使用的编译器不是一个简单的问题。有些编译器会嵌入关于它们自己的信息,有时可以通过运行 strings ,但不能保证。也就是说,Mac上的答案几乎总是 clang ,所以通常不难得到基本的信息。例如:

    strings iTunes | grep clang
    COMPILER=clang-9.0.0
    

    但那只是运气(甚至可能不准确)。

    IDA Pro 在这方面做得很好,是逆向工程工作的金标准。如果这类事情对你很重要,那么ida pro就是一个工具。它很贵。

    要获取它在运行时链接的框架列表, otool -L 是你想要的工具。我不明白你说的“不太可读”是什么意思,它只是打印出所有的框架,每行一个。很难想象比这更具可读性。你在这里找什么?

    耳蜗-L 不会告诉您使用了哪些静态库,因此“它是针对哪些框架构建的”可能太宽泛而无法回答。通常可以找到知名静态库(例如openssl)的符号,但要确切地知道二进制文件中包含了什么并不容易,特别是在调试信息被剥离的情况下。(如果有调试信息,那么文件路径往往是可用的,这可以告诉您关于它是如何构建的更多信息。)

    没有简单的静态方法可以得到 全部的 系统调用,因为这些调用可能隐藏在库中。 nm 不过,一般都是你想要的。它包含了很多不是“系统”调用的东西,因为它将包括从外部源链接的每个符号(您可能希望 nm -ju )再说一次,我不确定你说的“不太可读”是什么意思,它是每行一个符号。

    为了在运行时获取系统调用列表,请使用 dtruss . 它将输出每一个系统调用,并关注实际的“系统”调用(即syscall)。