macOS下跨应用操纵运行中程序UI元素的技术方案问询
macOS 跨应用修改其他运行中应用UI的实现方案
在接受关闭系统完整性保护(SIP)的前提下,macOS 存在成熟的技术路径实现你提到的三类操作,覆盖公开API与私有API范围,具体方案按能力边界分类如下:
基础UI属性修改(无需关闭SIP,需辅助功能权限)
使用系统公开的无障碍(Accessibility)框架即可完成只读文本修改、禁用按钮强制启用的需求,不需要注入目标进程:
- 核心接口为 HIServices 子框架下的
AXUIElement系列函数,调用前需要用户在系统隐私设置中为你的应用开启辅助功能权限 - 遍历目标应用的进程、窗口、UI元素树拿到对应元素的
AXUIElementRef后,调用AXUIElementSetAttributeValue即可修改元素属性:- 对只读文本字段,设置
kAXValueAttribute为目标字符串即可替换显示内容 - 对禁用按钮,设置
kAXEnabledAttribute为true即可强制解除禁用状态
- 对只读文本字段,设置
- 该方案的局限是无法向目标窗口新增原生控件,只能操作目标应用已存在的UI元素。
全能力UI修改(需关闭SIP,支持新增控件)
要实现向目标窗口新增控件的需求,必须通过代码注入让你的逻辑运行在目标进程的地址空间内,成熟路径如下:
- 注入手段:关闭SIP后可以绕过系统对
task_for_pid接口的权限限制、代码签名校验,通过mach端口注入的方式,让目标进程加载你自行编译的动态库(dylib)插件,是类SIMBL插件加载框架的通用实现逻辑 - 进程内操作能力:注入完成后你的代码和目标应用运行在同一地址空间,可以直接调用AppKit全量接口:
- 直接获取目标窗口的
NSWindow实例、遍历整个NSView层级,无视业务侧的只读、禁用逻辑,直接修改NSTextField的stringValue属性、设置NSButton的enabled属性为YES - 可以直接初始化自定义的
NSButton、NSTextField等控件,调用addSubview:接口挂载到目标窗口的视图层级上,完全实现新增控件的需求
- 直接获取目标窗口的
- 针对开启了强硬化运行时(Hardened Runtime)、自带反注入/反调试保护的应用,还需要额外绕过签名校验、反调试检测才能正常注入。
私有API补充方案
如果不想做代码注入,还可以使用CoreGraphics框架的未公开私有接口(CGSPrivate系列),实现跨进程的窗口覆盖绘制、UI元素劫持,但稳定性远低于进程内注入方案,仅适合做轻量的UI层叠加,不适合深度修改原生控件的交互逻辑。
提醒:关闭SIP会显著降低系统安全防护等级,这类操作仅建议在专门用于技术研究、调试的隔离环境下进行,不要在日常工作、存储敏感数据的主力系统上长期关闭SIP执行这类操作。
内容的提问来源于stack exchange,提问作者Sparkette
相关产品推荐
相关产品推荐

