在 mac 中创建软件补丁程序

Creating a software patcher in mac

我是一名 IOS 开发人员并且我知道 objective C。我想创建一个独立的 mac 应用程序,其唯一功能是修补同一 mac.

中可用的另一个应用程序

假设我的应用程序文件夹中有一个名为 X 的应用程序。此应用程序 X 有一些不良行为。所以我试图修改这种行为。我在 Hopper 反汇编器的帮助下分析了应用程序的可执行文件,我开始知道我必须更改从 00000001003e3790 开始的汇编指令。我更改了那些汇编指令并生成了新的可执行文件。然后我用新的可执行文件替换了旧的,然后这种不希望的行为现在似乎消失了。

由于大多数人都希望消除这种不良行为,因此我决定编写一个补丁程序并将该补丁程序分发给他们。

那么如何在我的修补程序应用程序中修改应用程序 X 的可执行文件中可用的汇编指令,然后用我修改后的版本替换原始指令?

如果有人在正确的方向上帮助我,那就太好了。

  1. 一般来说,你应该向用户询问app bundle的位置,以防在/Applications/中找不到。
  2. 您需要检查该捆绑包中的目标可执行文件是否具有与修补之前的可执行文件相同的散列值(可能是 CRC、MD5、SHA — 您的名字)。
  3. 如果哈希值匹配,则打开文件进行写入,并寻找存储错误指令的预硬编码位置;您可以通过在十六进制编辑器中搜索修补文件以找到以修补字节开头的足够长的字节字符串来确定该位置。
  4. 最后,您要用您的重写(a.k.a. 补丁)目标字节并关闭文件。

[UPD.] [3] 的示例代码。

这不需要任何与 ObjC 相关的机制,并且可以仅使用普通 libc:

来构建和 运行
long PatchSomething(char *name, char *data, size_t offs, size_t size) {
    long file = open(name, O_WRONLY);
    if (file != -1) {
        lseek(file, offs, SEEK_SET);
        write(file, data, size);
        close(file);
    }
    return file != -1;
}

其中:

  • name 是要修补的文件名
  • data是要写入的数据
  • offs 是要放置数据的文件偏移量
  • size为数据大小;文件中正好 size 个旧字节将被重写