【问题标题】:Creating a software patcher in mac在 mac 中创建软件修补程序
【发布时间】:2017-07-01 07:02:56
【问题描述】:

我是一名 IOS 开发人员,我知道目标 C。我想创建一个独立的 mac 应用程序,其唯一功能是修补同一 mac 中可用的另一个应用程序。

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

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

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

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

【问题讨论】:

  • 这听起来像是在 App Store 中永远不会被批准的行为。
  • @David 我不打算在应用商店发布我的应用。

标签: objective-c macos assembly disassembly


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

[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 将被重写

【讨论】:

  • 非常感谢您的回答。步骤 1、2 和 4 很清楚。如果您提供一些示例代码来实现步骤 3,将会更有帮助。例如如何打开可执行程序集(在目标 c 中)并找到插入补丁的确切位置。
  • @JafferSheriff,只需将可执行文件(当然不是捆绑包,而是位于内部的非常可执行文件,在 ./Content/MacOS 中)视为包含二进制数据的文件。这真的没有你想的那么复杂。编辑了我的答案。
  • 感谢我做到了,非常感谢您的宝贵帮助:)
猜你喜欢
  • 2015-09-07
  • 2011-04-13
  • 2021-04-27
  • 2010-11-25
  • 2015-06-09
  • 2011-09-11
  • 1970-01-01
  • 1970-01-01
  • 2019-06-07
相关资源
最近更新 更多