iOS逆向基础:越狱环境搭建、Theos工具链、Cycript与Frida基础

说实话,iOS逆向的门槛比Android要高不少。为什么?因为苹果的生态是封闭的,系统权限管得死死的。你想在iPhone上跑自己的代码,第一步就是得把这道墙拆掉——也就是越狱。

我刚开始接触iOS逆向那会儿,光搭环境就折腾了两天。后来发现,其实只要理清几个关键点,这事儿没那么玄乎。今天咱们就把越狱环境、Theos工具链、Cycript和Frida这几个基础模块讲透。

越狱环境搭建

越狱,说白了就是获取iOS系统的root权限。苹果官方不给你这个权限,我们就得自己想办法。常见的越狱工具有unc0ver、checkra1n、Taurine等。

我个人习惯用checkra1n,因为它基于checkm8漏洞,是硬件级别的,苹果没法通过系统更新封堵。不过它只支持A7到A11芯片的设备,也就是iPhone 5S到iPhone X。

注意:越狱前一定要备份数据。我曾经有一次越狱失败,手机直接变砖,折腾了一整天才救回来。

越狱后的第一件事,是安装Cydia或Sileo——这两个是越狱设备的包管理器。通过它们,你可以安装各种逆向工具和插件。

常用的越狱后必备工具包:

  • OpenSSH:远程连接你的iPhone
  • MTerminal:在手机上直接跑终端命令
  • Filza:文件管理器,浏览系统文件
  • adv-cmds:提供ps、kill等命令

Theos工具链

Theos是什么?它是一个跨平台的iOS开发工具链,专门用来编写越狱插件(tweak)。你可以在Mac或Linux上写代码,然后编译成.dylib动态库,注入到目标App里。

安装Theos很简单,几条命令搞定:

export THEOS=~/theos
git clone --recursive https://github.com/theos/theos.git $THEOS
bash $THEOS/bin/install-theos.pl

装完之后,用nic.pl创建新项目。它会问你几个问题:项目名称、包名、作者、要注入的App bundle ID等。

一个典型的Theos项目结构长这样:

MyTweak/
├── Makefile          # 编译配置
├── Tweak.x           # 核心代码,hook逻辑写在这里
├── control           # 包信息,版本号、依赖等
└── layout/           # 额外文件,比如资源、配置文件

写一个最简单的hook,拦截UIAlertView的显示:

%hook UIAlertView
- (void)show {
    NSLog(@"有人要弹窗了!");
    %orig; // 调用原始方法
}
%end

编译命令是make package,生成.deb安装包。然后用scp传到手机上,通过Cydia安装。

小技巧:在Makefile里加上THEOS_DEVICE_IP = 你的手机IP,然后直接用make package install,一键编译+安装+重启SpringBoard。省事不少。

Cycript基础

Cycript是一个JavaScript和Objective-C的混合解释器。你可以把它理解成iOS版的Chrome开发者工具——只不过操作的是真机上的App。

用法很简单:SSH连上手机,输入cycript -p 进程名,就进入交互模式了。

举个例子,我想看看微信当前显示的ViewController是什么:

cycript -p WeChat
// 进入交互模式后
UIApp.keyWindow.rootViewController
// 返回:

Cycript的语法很灵活,你可以直接调用Objective-C的方法:

// 获取所有子视图
[[UIApp keyWindow] recursiveDescription].toString()
// 遍历所有view
var views = [[UIApp keyWindow] subviews]
views[0].frame
// {origin:{x:0, y:0}, size:{width:375, height:812}}

我经常用Cycript做两件事:一是快速定位界面元素,二是动态调用私有API。比如想看看某个类有哪些方法:

var methods = class_copyMethodList(objc_getClass("UIView"), null)
for (var i = 0; i < methods.length; i++) {
    console.log(method_getName(methods[i]))
}
核心思路:Cycript适合快速验证想法,但别用它做复杂的逻辑。它本质上是解释执行,性能不行。真要写工具,还是得用Theos或Frida。

Frida基础

Frida是目前最流行的动态插桩框架。它支持iOS、Android、Windows、macOS,跨平台能力很强。和Cycript不同,Frida是用JavaScript写hook逻辑,但底层是C++实现的,性能好得多。

安装Frida:

pip install frida-tools
# 手机上安装frida-server
# 从github下载对应架构的deb包,用dpkg安装

启动frida-server:

ssh root@你的手机IP
./frida-server -l 0.0.0.0:27042 &

然后在本机写一个简单的hook脚本:

// hook.js
if (ObjC.available) {
    var className = "UIAlertView";
    var methodName = "- show";
    var hook = ObjC.classes[className][methodName];
    Interceptor.attach(hook.implementation, {
        onEnter: function(args) {
            console.log("UIAlertView show被调用了");
            console.log("消息内容: " + ObjC.Object(args[2]).toString());
        }
    });
}

运行:

frida -U -f com.tencent.xin -l hook.js --no-pause

Frida最强大的地方在于,你可以动态修改函数的返回值、参数,甚至替换整个函数实现。比如我想让某个App的登录验证永远返回成功:

var LoginManager = ObjC.classes.LoginManager;
Interceptor.attach(LoginManager["- verifyLogin:"].implementation, {
    onLeave: function(retval) {
        console.log("原始返回值: " + retval);
        // 把返回值改成true
        var newRet = ptr(1);
        retval.replace(newRet);
        console.log("已篡改为: true");
    }
});
注意:Frida的iOS支持需要越狱环境。不过从iOS 14.5开始,苹果对越狱的打击越来越严,很多新设备暂时没法越狱。这种情况下,可以考虑用Frida的Gadget模式,把frida-gadget.dylib注入到IPA包里再重签名安装。

知识体系总览

下面这张图把今天讲的内容串起来了。你想想看,整个iOS逆向的起点就是越狱,然后通过Theos写插件、Cycript做动态调试、Frida做插桩分析。这三样工具各有所长,配合使用效果最好。

iOS逆向基础:工具链与核心流程 越狱环境搭建 Theos 工具链 Cycript 动态调试 Frida 插桩框架 特点 • 编译tweak插件 • 生成.deb安装包 • 支持Logos语法 • 一键部署到设备 特点 • JS+OC混合语法 • 实时查看UI层级 • 调用私有API • 适合快速验证 特点 • 跨平台支持 • 动态修改返回值 • 函数Hook/替换 • Gadget模式免越狱 三者配合使用:Theos写插件 → Cycript快速验证 → Frida深度分析

嗯,到这里你应该对iOS逆向的基础工具有了整体认识。越狱是前提,Theos是主力开发工具,Cycript适合快速探查,Frida则是深度分析的利器。我个人建议初学者先从Cycript入手,因为它上手最快,能让你立刻看到效果。等熟悉了Objective-C的运行时机制,再切换到Theos和Frida。

我曾经在分析一个社交App的加密协议时,就是先用Cycript定位到加密函数,然后用Frida hook住它,把输入输出都打印出来,最后用Theos写了个插件把加密逻辑绕过了。三个工具各司其职,缺一不可。

避坑指南:越狱后的设备不要装太多插件,尤其是那些修改系统行为的。插件之间可能冲突,导致无限重启。我有一台iPhone 6s就是装了太多插件,最后只能进DFU模式重刷系统。

好了,这一章的内容就到这里。工具只是手段,真正的功夫在于你对iOS运行时机制的理解。多动手,多踩坑,慢慢就熟练了。