如何检查 MacOS 可执行文件 (Mach-O)?
How to inspect a MacOS executable file (Mach-O)?
如何查看有关 MacOS 二进制文件的一些基本信息,特别是用于构建它的内容、链接的框架以及使用的系统调用?
我尝试了 nm
和 otool -L
,但它们的输出只有部分有用。
例如,什么表示二进制文件是使用 xcode 或 golang 编译器构建的?
注意。我对逆向工程 macos 二进制文件不感兴趣。我只想使用已经包含在 OOTB 中的工具更好地了解我的系统上的 运行 是什么。
使用的编译器不是一个小问题。一些编译器嵌入了关于它们自己的信息,有时您会通过 运行ning 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
。它将输出每个系统调用,并将专注于实际的“系统”调用(即系统调用)。
如何查看有关 MacOS 二进制文件的一些基本信息,特别是用于构建它的内容、链接的框架以及使用的系统调用?
我尝试了 nm
和 otool -L
,但它们的输出只有部分有用。
例如,什么表示二进制文件是使用 xcode 或 golang 编译器构建的?
注意。我对逆向工程 macos 二进制文件不感兴趣。我只想使用已经包含在 OOTB 中的工具更好地了解我的系统上的 运行 是什么。
使用的编译器不是一个小问题。一些编译器嵌入了关于它们自己的信息,有时您会通过 运行ning 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
。它将输出每个系统调用,并将专注于实际的“系统”调用(即系统调用)。