许多 CLI 程序都记录了标志和选项的语法,通常在手册页中或使用-h
or--help
标志可用。但是通常有一些非常有用、非常强大的选项是故意未记录的,但我发现查找这些选项非常困难且耗时。
请注意,出于我最初的目的,我专门寻找在 Darwin 上执行此操作的方法(i/mac[h][ ]OS [X],或者这些天所谓的任何东西......),我会接受特定于该平台的答案。但真正理想的是可以跨平台和架构工作的东西。
所以我想知道是否有任何工具或轻松自动化的方法可以在我拥有的无数开发、调试和系统工具中找到程序的隐藏标志(但我不熟悉),或者至少是否有特定的一个或多个二进制可执行文件中的模式,人们可以依靠它来自动化“通过”二进制文件以找到可能的候选者的过程。
我知道对于大致相同数量的语言和平台,有 ±100 亿个选项解析函数、库和技术;getopt
并getopt_long
与许多其他人一起想到,通常称为涉及一个或多个术语组合的事物opt[s]
orarg[s]
和get
or parse
。因此,再次限制我的问题的范围,我今天特别寻找的是 Apple 产品上的实用程序的隐藏选项,所以如果它对我的目的有帮助(限制可接受答案的范围),让我们假设目标程式):
- 是用 [Objective-]C[++] 语言家族编写的(不过 Swift 也有加分!)。
- 可能是代码设计的,并且可能会或可能不会被剥离调试信息。
- 不是故意混淆的。
- 我们至少
r-x
可以访问该程序,因此我们可以制作一个可以修改的副本。 - 因此,我们可以自己剥离或删除签名,等等;但是,由于代码设计的限制,我们可能无法执行这些修改版本的二进制文件。这是一个软要求,因为我们可以禁用签名要求,但最好不要。
- 同样,出于同样的原因,我们可能无法从其他地方执行任意代码/未签名的应用程序,我正在寻找的最佳答案不涉及很多额外的软件。至少,请不要只是告诉我去购买 IDA Pro 的副本。
- 我们可能,但可能没有,可以访问源代码(duh)。
我目前执行此操作的过程通常包括:
- 复制可执行文件。
- 删除无关的东西,比如代码签名,我通常也
strip
会这样做。 - 围绕已知选项的上下文进行搜索,手动搜索并尝试可能的候选人。
也就是说,我发现了一些有用的选项,例如xip -x和pkgutil --expand-full,例如:
cp -H $(⁅which¦xcrun -f⁆ ⁅xip¦pkgutil⁆) /tmp/⁅xip¦pkgutil⁆
codesign --remove-signature /tmp/⁅xip¦pkgutil⁆
strip /tmp/⁅xip¦pkgutil⁆
strings ⁅-a -⁆ /tmp/⁅xip¦pkgutil⁆ | grep -C10 ⁅sign¦expand⁆
(很明显,花哨的 Unicode 表示变化。)
但到目前为止,我发现这些东西的确切位置几乎没有押韵或理由。之后的所有试验和错误。此外,对于基于 C++ 的东西(比如基于 LLVM 的工具,其中一些有-print-all-options
选项,但有些没有),它更具挑战性。
我真的很想找到一种方法来列出所有Apple 系统实用程序等的所有选项的完整列表。或者至少是类似的东西。可能的?