macOS MIG - Mach Interface Generator
MIG被创建用于简化Mach IPC代码的生成过程。它基本上生成了所需的代码,以便服务器和客户端根据给定的定义进行通信。即使生成的代码看起来很丑陋,开发人员只需导入它,他的代码将比以前简单得多。
示例
创建一个定义文件,这里是一个非常简单的函数:
subsystem myipc 500; // Arbitrary name and id
userprefix USERPREF; // Prefix for created functions in the client
serverprefix SERVERPREF; // Prefix for created functions in the server
#include <mach/mach_types.defs>
#include <mach/std_types.defs>
simpleroutine Subtract(
server_port : mach_port_t;
n1 : uint32_t;
n2 : uint32_t);现在使用 mig 生成服务器和客户端代码,这些代码将能够相互通信以调用 Subtract 函数:
在当前目录中将创建几个新文件。
在文件**myipcServer.c和myipcServer.h中,您可以找到结构SERVERPREFmyipc_subsystem**的声明和定义,该结构基本上定义了根据接收到的消息ID调用的函数(我们指定了起始编号为500):
在`myipcServer.h`文件中,我们定义了一个名为`myipcServer`的类,该类包含了处理Mach RPC请求的方法。
根据前面的结构,函数**myipc_server_routine将获取消息ID**并返回要调用的适当函数:
在这个例子中,我们只在定义中定义了一个函数,但如果我们定义了更多函数,它们将位于**SERVERPREFmyipc_subsystem**数组内,第一个函数将被分配给ID 500,第二个函数将被分配给ID 501...
实际上,可以在**myipcServer.h中的subsystem_to_name_map_myipc**结构中识别这种关系:
最后,使服务器工作的另一个重要函数将是**myipc_server,这个函数实际上会调用**与接收到的id相关联的函数:
检查前面突出显示的行,访问要通过ID调用的函数。
以下是创建一个简单服务器和客户端的代码,其中客户端可以调用服务器的Subtract函数:
二进制分析
由于许多二进制文件现在使用MIG来公开mach端口,了解如何识别使用了MIG以及MIG在每个消息ID上执行的功能是很有趣的。
jtool2可以从Mach-O二进制文件中解析MIG信息,指示消息ID并识别要执行的函数:
先前提到负责根据接收到的消息ID调用正确函数的函数是myipc_server。然而,通常情况下你不会有二进制文件的符号(函数名称),因此有趣的是查看反编译后的样子,因为它总是非常相似的(此函数的代码与暴露的函数无关):
这是在不同版本的Hopper free中反编译的相同函数:
实际上,如果你转到函数**0x100004000,你会找到routine_descriptor结构体的数组。结构体的第一个元素是函数实现的地址**,结构体占用0x28字节,因此每0x28字节(从字节0开始)你可以获得8字节,这将是将被调用的函数的地址:


这些数据可以通过使用此Hopper脚本提取。
加入 💬 Discord 群组 或 telegram 群组 或 关注 我们的 Twitter 🐦 @carlospolopm。
通过向 HackTricks 和 HackTricks Cloud github 仓库提交 PR 来分享您的黑客技巧。
最后更新于