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



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

我尝试了nmotool -L但它们的输出仅部分有用。

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

铌。我对逆向工程macos二进制文件不感兴趣。我只是想更好地了解仅使用已包含的OOTB工具在我的系统上运行的内容。

使用的编译器不是一个微不足道的问题。一些编译器嵌入了有关自己的信息,您有时会通过运行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运行应用程序。它将在进行时输出每个系统调用,并将专注于实际的"系统"调用(即系统调用(。

最新更新