目录

1. 前言   1.1

2. Mach和XPC概述   1.2

3. Mach   1.3

1. Mach内核   1.3.1

2. Mach消息   1.3.2

4. XPC进程间通讯   1.4

1. NSXPCConnection   1.4.1

1. 举例   1.4.1.1

5. 附录   1.5

1. 参考资料   1.5.1

iOS逆向：Mach消息和XPC进程通信

- 最新版本： v0.6.0

- 更新时间： 20250127

简介

整理iOS逆向涉及到的，Mach消息和XPC进程间通信相关内容。便于搞懂，进程间的消息发送的相关逻辑。

源码+浏览+下载

本书的各种源码、在线浏览地址、多种格式文件下载如下：

HonKit源码

- crifan/ios_re_mach_xpc: iOS逆向：Mach消息和XPC进程通信

如何使用此HonKit源码去生成发布为电子书

详见：crifan/honkit_template: demo how to use crifan honkit template and demo

在线浏览

- iOS逆向：Mach消息和XPC进程通信 book.crifan.org

- iOS逆向：Mach消息和XPC进程通信 crifan.github.io

离线下载阅读

- iOS逆向：Mach消息和XPC进程通信 PDF

- iOS逆向：Mach消息和XPC进程通信 ePub

- iOS逆向：Mach消息和XPC进程通信 Mobi

版权和用途说明

此电子书教程的全部内容，如无特别说明，均为本人原创。其中部分内容参考自网络，均已备注了出处。如发现有侵权，请通过邮箱联系我  admin 艾特 crifan.com ，我会尽快删除。谢谢合作。

各种技术类教程，仅作为学习和研究使用。请勿用于任何非法用途。如有非法用途，均与本人无关。

鸣谢

感谢我的老婆陈雪的包容理解和悉心照料，才使得我 crifan 有更多精力去专注技术专研和整理归纳出这些电子书和技术教程，特此鸣谢。

其他

作者的其他电子书

本人 crifan 还写了其他 150+ 本电子书教程，感兴趣可移步至：

crifan/crifan_ebook_readme: Crifan的电子书的使用说明

关于作者

关于作者更多介绍，详见：

关于CrifanLi李茂 – 在路上

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2025-01-27 16:38:11

Mach和XPC概述

iOS逆向期间，会涉及到， Mach内核 的 Mach消息 和 XPC进程间通信

主要目标是：需要搞懂，一个消息，如何从A发送到B的整个流程和逻辑。

从而才能继续追踪代码运行逻辑，直至彻底搞懂底层相关代码逻辑。

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2025-01-27 16:23:35

Mach

TODO：

- 【整理】iOS底层机制：微内核Mach

- 【未解决】iOS逆向：NSXPCConnection发送mach消息event的逻辑

- 【未解决】iOS逆向相关：mach_msg发送消息后如何获取到返回的数据

- 【未解决】debugserver+lldb调试___lldb_unnamed_symbol2567$$akd的mach_msg真正发送消息的逻辑

- 【未解决】iOS逆向Apple账号：dispatch_mach_msg_get_msg

- 【整理】iOS逆向相关函数：mach_msg

- 【整理】iOS逆向相关定义：mach_msg_header_t

- 【已解决】iOS逆向相关：mach_msg和mig

- 【未解决】调试___lldb_unnamed_symbol2567$$akd的mach_msg之后如何获取和访问返回的数据

- 【未解决】iOS逆向Apple账号：_xpc_connection_mach_event

- 【已解决】iOS逆向相关函数：voucher_mach_msg_set

- 【整理】iOS中的XNU

- 【未解决】iOS逆向Apple账号：OS_dispatch_mach

- 【未解决】iOS逆向Apple账号：OS_dispatch_mach_msg

- 【未解决】debugserver+lldb调试___lldb_unnamed_symbol2567$$akd发送mach_msg之前的准备工作

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2025-01-27 15:23:59

Mach架构

- Mach

- 是什么：操作系统的内核

- 类型： Microkernel = 微内核

- 发展历史

- 最早：卡耐基梅隆大学开发

- 目标：取代 BSD 的 UNIX 核心

- 后来：Apple采用，作为 Darwin 的核心的 XNU 的其中一部分

- 历史版本

- 早期

- Mach v2.5

- 来自： Carnegie Mellon University = 卡耐基梅隆大学

- Mach v3.0

- 来自： Carnegie Mellon University = 卡耐基梅隆大学

- Mach v4

- 来自： University of Utah = 犹他大学

- 后来

- OSFMK  7.3

- OSFMK = Open Software Foundation Mach Kernel

- 来自： OSF = The Open Software Foundation

- （这个微内核）包含=组成

- 仅能处理最基本的操作系统职责

- 虚拟内存的管理= memory protection = Virtual Memory = Protected Memory

- virtual memory support

- support for large virtual address spaces, shared memory regions, and memory objects backed by persistent store

- support for pagers

- 任务管理

- 进程和线程的抽象

- Parallel Execution

- Preemptive Multitasking =preemptively scheduled threads

- 支持 SMP

- 任务调度

- IPC =进程间通信=进程间通信和消息传递机制

- messaging

- 概述：a messaging-centered infrastructure

- Message Passing = 消息传递

- RPC

- synchronization

- notification

- 特点

- 优点

- 服务进程容易扩展

- 得益于这种扩展性，使得

- Mach-O 能支持多架构文件

- 详见

- 可执行文件格式：Mach-O

- macOS能顺利的从 PowerPC 过渡到 Intel 再到 M1

- 服务进程出问题不会危及到 kernel

- 缺点

- 微内核的功能本来就少，其他 OS 功能是作为基础服务建设在用户模式下的。因为这个特性其内部任务的调用会有更频繁的内核态/用户态上下文切换，这会额外消耗时间。同时内核与服务进程之间的消息传递也会降低运行效率，所以这种设计通常会降低性能

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2025-01-27 15:29:51

Mach消息

- Mach Message = Mach消息 = Mach消息传递

- （Mach的 IPC 的）核心点

- Mach最基础的概念就是两个端点 Port 中交换的 message

- message

- 是什么：一个message就是msgh_size大小的blob, 带着一些flags，从一个端口发送到另一个端口

- 核心函数

- mach_msg()

- mach_msg_send()

- mach_msg_receive()

- mach_msg_trap()

- mach_msg_overwrite_trap()

- 架构

- Mach Message细节

相关定义

- <mach/message.h>

typedef struct {

mach_msg_header_t header;

mach_msg_body_t   body;

} mach_msg_base_t;

// 消息头是必须的，它定义了一个消息所需要的数据

typedef struct {

mach_msg_bites_t   msgh_bits;

mach_msg_size_t    msgh_size;

mach_port_t        msgh_remote_port;

mach_port_t        msgh_local_port;

mach_msg_size_t    msgh_reserved;

mach_msg_id_t      msgh_id;

} mach_msg_header_t;

mach_msg_return_t mach_msg(

mach_msg_header_t            msg,f

mach_msg_option_t            option,

mach_msg_size_t              send_size,

mach_msg_size_t              reveive_limit,

mach_port_t                  reveive_name,

mach_msg_timeout_t           timeout,

mach_port_t                  notify,

);

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2025-01-27 15:32:18

XPC进程间通讯

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2025-01-27 14:13:12

NSXPCConnection

TODO：

- iOS IPC NSXPCConnection launchd

- 【未解决】iOS逆向akd：NSXPCConnection的resume和active相关函数

- 【未解决】iOS逆向akd：NSXPCConnection的exportedInterface、exportedObject等内容

- 【已解决】iOS逆向：寻找name是com.apple.ak.auth.xpc的Server端的NSXPCConnection

- 【未解决】iOS逆向akd：NSXPCConnection中类__NSXPCInterfaceProxy_AKAnisetteProvisioningAndSigningDeamonInterface的函数fetchAnisetteDataAndProvisionIfNecessary:device:completion:的来源

- 【已解决】iOS逆向：frida调试hook类NSXPCConnection的setExportedObject

- 【未解决】iOS逆向Apple账号：从com.apple.ak.anisette.xpc的NSXPCConnection获取到AKAnisetteData的过程

- 【未解决】iOS逆向Apple账号：寻找NSXPCConnection解析调用shouldContinueWithAuthenticationResults:error:forContextID:completion:的地方

- 【未解决】iOS逆向：NSXPCConnection发送mach消息event的逻辑

- 【记录】iOS逆向Apple账号：重新用frida-trace追踪带NSXPCConnection的Apple账号的完整登录过程

- 【未解决】iOS逆向Apple账号：NSXPCConnection相关

- 【未解决】iOS逆向Apple账号：研究-[NSXPCConnection remoteObjectProxyWithErrorHandler:]返回类型是__NSXPCInterfaceProxy_AKAppleIDAuthenticationDaemonProtocol

- 【未解决】iOS逆向Apple账号：NSXPCConnection的AuthKit的akd如何生成AKAnisetteData

- 【未解决】iOS逆向Apple账号：-[NSXPCConnection _sendInvocation:orArguments:count:methodSignature:selector:withProxy:]

- 【已解决】iOS逆向Apple账号：-[NSXPCConnection remoteObjectProxyWithErrorHandler:]的hook代码断点加不上

- 【未解决】iOS逆向Apple账号：-[NSXPCConnection _sendSelector:withProxy:arg1:arg2:]

- 【记录】iOS逆向akd：com.apple.ak.auth.xpc的NSXPCConnection相关调用逻辑和内容

- 【规避解决】XCode实时调试NSXPCConnection的_XCT_fetchSnapshotForElement:attributes:parameters:reply错误

- 【未解决】iOS逆向Apple账号：__88-[NSXPCConnection _sendInvocation:orArguments:count:methodSignature:selector:withProxy:]_block_invoke_3

- 【已解决】iOS逆向akd：com.apple.ak.anisette.xpc的NSXPCConnection调用fetchAnisetteDataAndProvisionIfNecessary:device:completion:的过程

- 【已解决】iOS逆向Apple账号：用frida打印com.apple.ak.auth.xpc的NSXPCConnection的其他属性值

- 【未解决】iOS逆向akd：Preferences通过NSXPCConnection获取AnisetteData后触发了akd中什么函数去处理

- 【未解决】iOS逆向akd：NSXPCConnection的init初始化相关

- 【已解决】Xcode中Logos插件hook代码编译报错：Expected unqualified-id

XPC的NSXPCConnection的基本逻辑

- Client端：发送消息给Server端

- 举例

- <NSXPCConnection: 0x282adc640> connection to service with pid 125 named com.apple.ak.anisette.xpc

- 注：Server端的akd的PID=125

- remoteObjectProxy

- 含义： remote Object  的  Proxy == （Server端的）负责处理对应函数的所属的类 的 代理

- 举例

- <__NSXPCInterfaceProxy_AKAnisetteProvisioningAndSigningDeamonInterface: 0x2838ccb40>

- remoteObjectInterface

- 含义：Server端的所能处理哪些函数

- 举例

- Protocol:  AKAnisetteProvisioningAndSigningDeamonInterface

- 内部其实继承了2个protocol

- AKAnisetteProvisioningDaemonProtocol

- attestationDataForDevice:withRequest:completion:

- legacyAnisetteDataForDSID:device:completion:

- fetchAnisetteDataAndProvisionIfNecessary:device:completion:

- eraseAnisetteForDevice:completion:

- syncAnisetteWithSIMData:device:completion:

- provisionAnisetteForDevice:completion:

- AKAppleIDSigningDaemonProtocol

- signaturesForData:options:completion:

- absintheSignatureForData:completion:

- Server端= Listener端 ：监听别人发送来的消息

- 举例

- <NSXPCConnection: 0x105204680> connection from pid 17416 on mach service named com.apple.ak.anisette.xpc

- 注：Client端的Preferences的PID=17416

- exportedObject

- 说明：

- 会触发到： -[NSXPCConnection setExportedObject:] ，设置了后续将要用的 exportedObject

- 举例

- <AKAnisetteProvisioningService: 0x107412620>

- 其对应着的，内部conform了2个protocol

- AKAnisetteProvisioningDaemonProtocol

- AKAppleIDSigningDaemonProtocol

- 所以能支持Client端发来的消息（中的函数，然后去处理）

- exportedInterface

- 说明：

- 会触发到： -[NSXPCConnection setExportedInterface:]

- 举例

- <NSXPCInterface: 0x107420650>

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2025-01-27 16:16:23

举例

Client 端的 Preferences 发送给 Server 端的 akd

- 概述

- Client端的Preferences的NSXPCConnection：去发送XPC消息=调用函数

- -[__NSXPCInterfaceProxy_AKAnisetteProvisioningAndSigningDeamonInterface fetchAnisetteDataAndProvisionIfNecessary:device:completion:]

- Server端的akd的NSXPCConnection：去接收XPC消息=找到对应函数去处理

- -[AKAnisetteProvisioningService fetchAnisetteDataAndProvisionIfNecessary:device:completion:]

详解

先明白基础概念和此处所涉及到的内容：

- 当前的 NSXPCConnection

- serviceName = com.apple.ak.anisette.xpc

- Client端

- iOS的app： 设置 = Preferences

- 包名： com.apple.Preferences

- 二进制： /Applications/Preferences.app/Preferences

- Server端=Listener端

- AuthKit库的daemon服务程序： akd

- 二进制： /System/Library/PrivateFrameworks/AuthKit.framework/akd

此处最初的情况是：

- Client端的： Preferences  的 NSXPCConnection

- log信息

- <NSXPCConnection: 0x282adc640> connection to service with pid 125 named com.apple.ak.anisette.xpc

- 注：akd的PID=125

- remoteObjectProxy

- <__NSXPCInterfaceProxy_AKAnisetteProvisioningAndSigningDeamonInterface: 0x2838ccb40>

- remoteObjectInterface

- Protocol:  AKAnisetteProvisioningAndSigningDeamonInterface

- 此处po能查看到：所有的函数

- fetchAnisetteDataAndProvisionIfNecessary:device:completion:

- absintheSignatureForData:completion:

- attestationDataForDevice:withRequest:completion:

- syncAnisetteWithSIMData:device:completion:

- eraseAnisetteForDevice:completion:

- provisionAnisetteForDevice:completion:

- legacyAnisetteDataForDSID:device:completion:

- signaturesForData:options:completion:

- 从头文件中可以确认：其实是conform遵守了2个protocol，且对应的函数正好是2个protocol的函数

- AKAnisetteProvisioningDaemonProtocol

- attestationDataForDevice:withRequest:completion:

- legacyAnisetteDataForDSID:device:completion:

- fetchAnisetteDataAndProvisionIfNecessary:device:completion:

- eraseAnisetteForDevice:completion:

- syncAnisetteWithSIMData:device:completion:

- provisionAnisetteForDevice:completion:

- AKAppleIDSigningDaemonProtocol

- signaturesForData:options:completion:

- absintheSignatureForData:completion:

- Server端的： akd  的 NSXPCConnection

- log信息

- <NSXPCConnection: 0x105204680> connection from pid 17416 on mach service named com.apple.ak.anisette.xpc

- 注：Preferences的PID=17416

- exportedObject

- <AKAnisetteProvisioningService: 0x107412620>

- 而AKAnisetteProvisioningService这个类，是akd中才有的

- 且实现了conform了前面的2个protocol

- AKAnisetteProvisioningDaemonProtocol

- AKAppleIDSigningDaemonProtocol

- exportedInterface

- <NSXPCInterface: 0x107420650>

所以最终的调用的过程是：

- Client端Preferences中的NSXPCConnection，去调用  -[__NSXPCInterfaceProxy_AKAnisetteProvisioningAndSigningDeamonInterface fetchAnisetteDataAndProvisionIfNecessary:device:completion:]

即：

-[<__NSXPCInterfaceProxy_AKAnisetteProvisioningAndSigningDeamonInterface: 0x281c88aa0> fetchAnisetteDataAndProvisionIfNecessary:device:completion:

1

0

<__NSStackBlock__: 0x16dd79ec0

invoke = "__92-[AKAnisetteProvisioningController fetchAnisetteDataAndProvisionIfNecessary:withCompletion:]_block_invoke.51"

>

]

过程是：

- 会触发到：Server端的exportedObject的类： AKAnisetteProvisioningService

- 去调用对应的函数去处理

- -[AKAnisetteProvisioningService fetchAnisetteDataAndProvisionIfNecessary:device:completion:]

- 注：因为本身 AKAnisetteProvisioningService 就conform了对应的2个protocol： AKAnisetteProvisioningDaemonProtocol``、AKAppleIDSigningDaemonProtocol ，所以支持这些函数调用

最终是触发：

-[AKAnisetteProvisioningService fetchAnisetteDataAndProvisionIfNecessary:device:completion:]

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2025-01-27 16:20:48

附录

下面列出相关参考资料。

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2025-01-27 14:05:29

参考资料

- 【已解决】iOS逆向：XPC的NSXPCConnection获取数据的基本逻辑

- 【未解决】iOS逆向：通过查看NSXPCConnection的属性值搞清楚目标处理的类是哪个

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2025-01-27 16:15:16

Table of Contents

前言

Mach和XPC概述

Mach

Mach内核

Mach消息

XPC进程间通讯

NSXPCConnection

举例

附录

参考资料