Cycript 是什么:OC 的交互式 REPL
Cycript 是一个能 attach 到 iOS 进程的交互式解释器,语法是 JavaScript 和 Objective-C 的混合体。attach 之后,整个 App 的运行时对象图都是你的 Console——枚举对象、调方法、改属性、甚至现场创建新对象,全部即时生效。
# 越狱设备上
cycript -p TargetApp # attach 到进程
cycript -p 1234 # 或按 PID进入 REPL 后的第一感受:
cy# UIApp.keyWindow.rootViewController
#"<MainViewController: 0x123456>"
cy# [SignManager sharedInstance]
#"<SignManager: 0x789abc>"
cy# [[SignManager sharedInstance] getSign:@"test"]
#"a8f5c3d2..."直接调用 App 内部对象的私有方法——签名函数就这么被借用了。
核心玩法速查
枚举与探索:
// 当前界面层级(找目标页面的控制器)
UIApp.keyWindow.recursiveDescription().toString()
// 查看对象的所有方法
*SignManager // 打印 isa 和方法列表
// 或
[SignManager instances] // 内存中的所有实例
// 查看对象属性
var sm = [SignManager sharedInstance]
sm->isa // 类指针
Object.keys(sm) // 属性列表调用与修改:
// 调私有方法
[sm getSign:@"input"]
// 改属性(比如直接改 UI)
UIApp.keyWindow.rootViewController.view.backgroundColor = [UIColor redColor]
// 现场定义函数复用
function getSign(s) { return [[SignManager sharedInstance] getSign:s] }
getSign(@"test1"); getSign(@"test2")精髓一:从界面反查代码的经典路径
逆向一个陌生 App,最快的路径是"从看得见的界面追到看不见的代码":
// 1. 当前显示的是什么控制器
UIApp.keyWindow.rootViewController
#"<LoginViewController: 0x...>"
// 2. 看这个控制器的方法(找按钮回调)
*LoginViewController
// 输出里有 - loginButtonTapped:
// 3. 直接触发它的回调(模拟点击)
[[LoginViewController instances][0] loginButtonTapped:nil]
// 4. 顺藤摸瓜:回调里调了什么管理类,一层层追这条路径不需要任何静态分析,纯运行时探索,十分钟就能摸清一个模块的调用链。
精髓二:hook 也能现场写
Cycript 不只是 REPL,还能现场做 method swizzling:
// 给 getSign 方法加日志(现场 hook)
var oldImpl = SignManager.prototype['- getSign:'];
SignManager.prototype['- getSign:'] = function(arg) {
var result = oldImpl.call(this, arg);
console.log('getSign(' + arg + ') = ' + result);
return result;
}虽然工程化 hook 还是推荐 Frida/tweak,但探索阶段在 REPL 里现场 swizzle 验证猜想,反馈速度是最快的。
精髓三:Cycript vs Frida 的选择
| 维度 | Cycript | Frida |
|---|---|---|
| 交互体验 | 原生 OC 语法,探索极顺 | JS 语法,OC 调用要写 ObjC.classes |
| 环境要求 | 越狱 + 注入 substrate | 越狱/非越狱(gadget)均可 |
| 工程化 | 弱(脚本能力有限) | 强(完整 JS 生态、RPC) |
| 维护状态 | 停更较久,新 iOS 兼容性差 | 活跃维护 |
现实的组合:越狱老设备上用 Cycript 做交互式探索(摸清类结构和方法行为),确定的 hook 逻辑用 Frida 落地(工程化、可复用)。新 iOS 上 Cycript 跑不起来就直接 Frida 的 REPL(frida -U -p 进交互模式)替代。
总结
- Cycript = iOS 进程的交互式 Console,运行时对象全部可操作
- 核心路径:UI 层级 → 控制器 → 方法 → 管理类,纯运行时追调用链
- 现场 swizzling 验证猜想,反馈最快
- 探索用 Cycript,工程化用 Frida,新老设备各取所需
交流微信:run1255