MarkShawn2020/macos-swift-binary-research
GitHub: MarkShawn2020/macos-swift-binary-research
一个可复用的 macOS Swift 二进制逆向研究 Skill,提供版本锁定的字节级补丁流程并以 Mole 应用为完整案例。
Stars: 1 | Forks: 0
# macOS Swift Binary Research
一个可复用的 macOS Swift 二进制研究 Skill,以及 Mole 1.11.0 Build 96
许可证状态案例。
这次研究从一篇针对 Mole 1.3.0 的旧教程出发。新版已经加入官方构建完整性
校验,并把“功能是否放行”和“界面显示什么许可证状态”拆成了不同路径。最终
结果不是简单复用旧偏移,而是重新建立样本身份、追踪 Swift 状态、用六处
版本锁定修改闭合状态,并以冷启动后的 `License Active` 作为验收。
## 仓库内容
.
├── README.md
├── docs/
│ ├── mole-1.11.0-case-study.md
│ └── publishing/
├── scripts/
│ └── patch-mole.mjs
└── skills/
└── analyze-macos-swift-binaries/
├── SKILL.md
├── agents/openai.yaml
├── references/
└── scripts/patch-app.mjs
- [`analyze-macos-swift-binaries`](skills/analyze-macos-swift-binaries/SKILL.md):
从样本识别、Universal Binary 坐标换算、Swift 状态追踪,到版本锁定清单、
隔离修改、重签名和冷启动验收的完整 Skill。
- [Mole 1.11.0 案例](docs/mole-1.11.0-case-study.md):旧教程为什么失效、
`LicenseGate` 与 `LicenseStatus` 如何分工,以及从“功能可用”到
“界面 Active”的关键转折。
- [发布稿](docs/publishing/):吾爱破解技术帖与会员申请模板、公众号长文和
小红书九张卡片,可从同一份研究资产派生。
- [`patch-mole.mjs`](scripts/patch-mole.mjs):Mole 1.11.0 Build 96
专用的一键副本、验证和安装脚本。
## 安装 Skill
git clone https://github.com/MarkShawn2020/macos-swift-binary-research.git
mkdir -p ~/.codex/skills
ln -s "$PWD/macos-swift-binary-research/skills/analyze-macos-swift-binaries" \
~/.codex/skills/analyze-macos-swift-binaries
调用示例:
使用 $analyze-macos-swift-binaries 检查这个 macOS Swift APP,
建立版本锁定的状态追踪和补丁验证报告。
## 通用工作流
先读取本地 APP 身份:
node skills/analyze-macos-swift-binaries/scripts/patch-app.mjs \
--inspect /path/to/Target.app
再使用经过人工研究建立的清单,生成隔离副本:
node skills/analyze-macos-swift-binaries/scripts/patch-app.mjs \
--manifest /path/to/patch.manifest.json \
--source /path/to/Target.app \
--output build/Target-research.app
脚本会先断言 Bundle ID、Version、Build、架构、可执行文件大小、SHA-256
和每个修改点的原始字节。任意字段变化都会停止写入。输出经过 ad-hoc 深度
签名,并再次验证清单与签名。
验证仓库结构、脚本语法和示例清单:
npm run check
## Mole 1.11.0 Build 96 案例
精确样本:
- Bundle ID:`com.tw93.MoleApp`
- Version / Build:`1.11.0 / 96`
- 架构:`x86_64 arm64`
- 原始 Universal Binary SHA-256:
`cc8ad1d6431e141613951e6ad926ee08401c882393d8bdf638e635ab64437a70`
### 修改点
| arm64 VA | Universal 文件偏移 | 原字节 | 新字节 | 作用 |
| --- | ---: | --- | --- | --- |
| `0x10024635C` | `0xD3E35C` | `08 40 80 52` | `28 20 80 52` | 初始化 `licensed=1`、`officialVerdict=1` |
| `0x100255A84` | `0xD4DA84` | `E8 17 9F 1A` | `28 00 80 52` | 状态刷新后保持 `licensed=1` |
| `0x10024BE8C` | `0xD43E8C` | `41 00 80 52` | `01 00 80 52` | 刷新分支 A:`trial` → `active(Date)` |
| `0x10024E7A0` | `0xD467A0` | `41 00 80 52` | `01 00 80 52` | 刷新分支 B:`trial` → `active(Date)` |
| `0x10024ECD4` | `0xD46CD4` | `41 00 80 52` | `01 00 80 52` | 刷新分支 C:`trial` → `active(Date)` |
| `0x10025622C` | `0xD4E22C` | `41 00 80 52` | `01 00 80 52` | 启动分支:`trial` → `active(Date)` |
前两处闭合 `LicenseGate`;后四处把 `LicenseStatus` 的试用构造路径改为
`active`。Swift 运行时元数据显示 `active` 的 payload 是
`Foundation.Date`。
### 使用
生成隔离副本:
node scripts/patch-mole.mjs
验证已有副本:
node scripts/patch-mole.mjs --verify build/Mole-1.11.0-patched.app
退出 Mole 后,生成并安装,同时在 `/Applications` 保留带时间戳的备份:
node scripts/patch-mole.mjs --force --install
### 已完成验收
- `codesign --verify --deep --strict` 通过
- 无 `MoleUnofficialBuildDetected`
- 运行时 `LicenseGate + 0x70` 为 `01 01`
- 主界面无 `Trial · Activate` 和试用购买引导
- 设置页显示 `License Active`
- 扫描可以进入 `Ready to clean`
- 修改后的可执行文件 SHA-256:
`734c77fd936b6afb86285f26324a86e33f7008b1539d7ef3e99754c9c33ea6ac`
验收停在清理确认前,没有执行永久清理。
## 来源与致谢
研究起点是 HackXK 发布的
[《Mole 许可证破解教程》](https://www.52pojie.cn/thread-2107848-1-1.html),
其中记录了 Mole 1.3.0 Build 5 的两处修改思路。本仓库针对 1.11.0 Build 96
重新定位,并补充官方构建校验、Swift enum 元数据、异步刷新路径、可见状态验收
和通用清单工具。
## License
[MIT](LICENSE)
标签:MITM代理, Swift, 二进制分析, 云安全运维, 云资产清单, 数字取证, 自动化脚本, 自定义脚本, 软件破解, 逆向工程, 防御加固