如何在macOS的arm64e进程中注入dylib并执行已编译代码
Frida 支持原生dylib加载,完全匹配你的需求
你对Frida的认知有偏差,它的JavaScript交互能力只是上层封装,底层本身就支持直接注入已编译的arm64e架构dylib到目标进程:
- 只需要调用
Module.load()接口传入dylib的本地绝对路径,Frida就会自动在目标进程空间完成dylib的加载、符号重绑定全流程,最终执行效果和你原来用mach_inject注入完全一致 - 你原有dylib的业务代码不需要做任何修改,仅需通过Frida的基础注入能力触发加载即可,后续逻辑完全走原生代码的执行流程
基于原生Mach API自行实现arm64e适配
如果你不想引入Frida的依赖,也可以基于苹果公开的Mach API自行实现注入逻辑,和mach_inject的核心逻辑一致,仅需额外适配arm64e的PAC(指针验证机制):
- 第一步通过
task_for_pid()获取目标进程的task端口,该操作需要关闭SIP,或者给你的工具授予com.apple.security.cs.debugger调试权限 - 在目标进程的地址空间中分配可读写内存,写入你的dylib的本地存储路径
- 调用
thread_create_running()在目标进程内创建新线程,线程入口指向系统dlopen的地址,传入你写入的dylib路径作为参数,需要注意的是arm64e架构下要使用ptrauth_sign_unauthenticated等系统接口给函数指针添加PAC签名,绕过指针校验逻辑 - 现有多个开源注入类项目已经完成了arm64e的适配,你可以参考相关实现改造自己的原有工具
针对Dock进程的轻量免注入方案
如果你的工具面向普通用户发布,不想强制要求用户关闭SIP,还可以用环境变量劫持启动的方式实现dylib加载:
- 修改Dock进程对应的启动plist配置,添加
DYLD_INSERT_LIBRARIES环境变量指向你的dylib路径 - 重启Dock后系统会自动加载你的dylib,不需要做线程创建、内存写入这类注入操作,兼容性更强,适配全系列Apple Silicon设备
内容的提问来源于stack exchange,提问作者Bri Bri
相关产品推荐
相关产品推荐

