百趣云 百趣云的博客

Cycript 运行时调试:像操作浏览器 Console 一样操作 iOS App

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 的选择

维度CycriptFrida
交互体验原生 OC 语法,探索极顺JS 语法,OC 调用要写 ObjC.classes
环境要求越狱 + 注入 substrate越狱/非越狱(gadget)均可
工程化弱(脚本能力有限)强(完整 JS 生态、RPC)
维护状态停更较久,新 iOS 兼容性差活跃维护

现实的组合:越狱老设备上用 Cycript 做交互式探索(摸清类结构和方法行为),确定的 hook 逻辑用 Frida 落地(工程化、可复用)。新 iOS 上 Cycript 跑不起来就直接 Frida 的 REPL(frida -U -p 进交互模式)替代。

总结

  1. Cycript = iOS 进程的交互式 Console,运行时对象全部可操作
  2. 核心路径:UI 层级 → 控制器 → 方法 → 管理类,纯运行时追调用链
  3. 现场 swizzling 验证猜想,反馈最快
  4. 探索用 Cycript,工程化用 Frida,新老设备各取所需

交流微信:run1255

By 百趣云 阅读量:4 On