为 mac 应用程序创建修补程序

逆向工程 拆卸 部件 操作系统
2021-07-03 12:16:20

我有一个签名的 mac 应用程序,但我没有该应用程序的源代码。我知道一些汇编指令的地址位置,我需要更改这些指令以使这个应用程序以某种方式工作。所以我正在尝试编写一个补丁程序,它应该能够读取原始 mac 应用程序的程序集并更改这些地址并生成没有签名的新 mac 应用程序。

这个修补程序应该是一个独立的 mac 应用程序。修补程序应修补原始应用程序并生成修改后的应用程序。

我怎样才能做到这一点?我只需要一些指导来编写这个修补程序。

1个回答

这有几个方面:

  • 如果应用程序没有受到某种包装的保护
    • 您只需要在调试器(应用程序运行时)或静态反汇编器(otool、料斗反汇编器、ida 反汇编器)的帮助下找到要修补的位置
    • 了解您的补丁占用了多少字节(例如使用在线工具
    • 了解您在原始应用程序中有多少空间。每个反汇编器都会向您展示或使用上述工具
    • 使用任何十六进制编辑器 ( hex fiend ) 用您从 (1) 获得的字节修补文件。
    • 如果补丁有足够的空间,你应用它,左边的空间用nop指令填充
    • 如果没有,您需要通过以下方式找到该空间:
      • 将您的补丁分成几个部分(功能之间或本节末尾总是有洞穴)
      • 或分配您自己的部分并填写您的代码。在这种情况下,您还需要编辑文件添加器以说明新部分。
  • 如果应用程序以任何方式打包或保护免于修补,那么您不能像那样在磁盘上修补它。您需要将其解压缩,按照上述说明进行修补并重新打包(或不重新打包)。
    • 或者您可以在这种情况下创建运行时修补程序,这会更复杂。

更新:

要自动进行磁盘修补,可以使用一种非常简单的方法,该方法基于一些模式匹配和一些启发式方法:

  • 借助反汇编器尝试在补丁区之前找到一些可区分的字节
  • 对补丁区域之后的区域做同样的事情
  • 如果合适,请为补丁本身找到相同的内容:
    • 例如,如果存在控制流更改,请尝试针对某种模式分析该更改的目标。

以上所有内容都足以(希望)适应版本更改并确保您在正确的位置进行更改。这样的修补程序可以很容易地用 Python 编码。对于反汇编,您可以使用具有 Python 绑定的Capstone库。

考虑到这一点,你填写 make OSX 抱怨这个修补的应用程序,因为它不会再被签名。