如何在二进制可执行文件中查找隐藏或未记录的选项/标志?

时间:2018-06-26 10:53:51

标签: macos flags mach-o darwin undocumented-behavior

许多CLI程序都已记录了有关标志和选项的语法,通常可在手册页中使用或使用-h--help标志。 但是通常有很多非常有用,非常强大的选项,这些选项是无意记录的,但是我发现查找这些选项非常困难且耗时。

  

请注意,出于这里的最初目的,我正在特别寻找在达尔文(i / mac [h] [] OS [X]或目前所说的其他方式...)上进行此操作的方法,将接受特定于该平台的答案。但是真正理想的东西是可以跨平台和体系结构工作的东西。

所以我想知道是否有任何工具或易于自动化的方法在我拥有的众多开发,调试和系统工具(但我不熟悉)中找到程序的隐藏标志,或者至少二进制可执行文件中有一种特定的模式,人们可以依靠它来自动执行“遍历”二进制文件以查找可能的候选对象的过程。

我知道对于大约相同数量的语言和平台,有±100亿个选项解析功能,库和技术;想到getoptgetopt_long以及许多其他术语,通常称为“事物”,它们涉及一个或多个术语opt[s]arg[s]get的组合或parse。再次重申一下,在这里限制我的问题的范围是,今天我要特别寻找的是Apple产品上发现的实用程序的隐藏选项,因此如果对我有帮助(限制可接受的答案的范围),请假定目标程序:

  • 是用[Objective-] C [++]语言家族编写的(尽管Swift也有加分!)。
  • 可能是经过代码签名的,可能已经剥夺了调试信息,也可能没有被剥夺。
  • 不会故意混淆。
  • 我们至少有r-x访问该程序的权限,因此我们可以制作一个可以修改的副本。
  • 因此,我们可以自己剥离或去除签名,等等。但是,由于代码签名的限制,我们可能无法执行这些修改后的二进制版本。这是一项软要求,因为我们可以禁用签名要求,但理想情况下不能。
  • 同样,由于同样的原因,我们可能无法从其他地方执行任意代码/未签名的应用程序,因此我寻找的最佳答案并不涉及很多额外的软件。至少请不要仅仅告诉我去买IDA Pro的副本。
  • 我们也许可以,但可能没有,可以访问源代码(duh)。

我目前执行此操作的过程通常包括:

  • 复制可执行文件。
  • 删除诸如代码签名之类的无关紧要的东西,我通常也会strip这么做。
  • 在已知选项的上下文中摸索,手动寻找并尝试可能的候选人。

也就是说,我发现了一些有用的选项,例如xip -xpkgutil --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的系统实用程序等所有选项进行完整列表。 或至少接近那个。可能吗?

0 个答案:

没有答案