如何检查MacOS可执行文件(Mach-O)?

5
如何查看MacOS二进制文件的基本信息,特别是它使用了什么来构建、链接到哪些框架以及使用了哪些系统调用?
我尝试过使用nm和otool -L,但它们的输出只部分有用。
例如,有什么能表明一个二进制文件是使用xcode或golang编译器构建的吗?
注意:我不感兴趣逆向工程macos二进制文件,我只是想知道在已经包含在OOTB中的工具的帮助下更好地了解正在运行的系统。

2
我喜欢使用jtoolradare2来检查macOS文件。它们可以通过标志打印链接的动态库、系统函数调用等信息。 - rustyMagnet
1个回答

10

使用的编译器并不是一个简单的问题。一些编译器会嵌入有关自身的信息,有时您可以通过运行strings来找到这些信息,但不能保证成功。话虽如此,在Mac上的答案几乎总是clang,所以通常获取基础知识并不难。例如:

strings iTunes | grep clang
COMPILER=clang-9.0.0

但这只是运气而已(可能甚至不准确)。

IDA Pro 在这方面做得很好,是逆向工程的黄金标准工具。如果你认为这种东西很重要,那么IDA Pro是你的选择,但它很昂贵。

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

otool -L 不会告诉你使用了哪些静态库,所以“它构建了哪些框架”可能太过宽泛而无法回答。通常可以找到著名静态库(例如OpenSSL)的符号,但如果剥离了调试信息,就很难精确知道二进制文件中包含了什么。 (如果有调试信息,则文件路径将很容易获得,这可以告诉你更多关于如何构建的信息。)

没有简单的静态方法可以获取所有系统调用的列表,因为它们可能隐藏在库中。然而,nm 通常是你想要的工具。它包括许多不是“系统”调用的内容,因为它将包括来自外部源链接的每个符号(你可能需要类似于 nm -ju 的东西)。同样,我不确定你所说的“不太可读”,因为它只有一行一个符号。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接