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安装。
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]))
}
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");
}
});
知识体系总览
下面这张图把今天讲的内容串起来了。你想想看,整个iOS逆向的起点就是越狱,然后通过Theos写插件、Cycript做动态调试、Frida做插桩分析。这三样工具各有所长,配合使用效果最好。
嗯,到这里你应该对iOS逆向的基础工具有了整体认识。越狱是前提,Theos是主力开发工具,Cycript适合快速探查,Frida则是深度分析的利器。我个人建议初学者先从Cycript入手,因为它上手最快,能让你立刻看到效果。等熟悉了Objective-C的运行时机制,再切换到Theos和Frida。
我曾经在分析一个社交App的加密协议时,就是先用Cycript定位到加密函数,然后用Frida hook住它,把输入输出都打印出来,最后用Theos写了个插件把加密逻辑绕过了。三个工具各司其职,缺一不可。
好了,这一章的内容就到这里。工具只是手段,真正的功夫在于你对iOS运行时机制的理解。多动手,多踩坑,慢慢就熟练了。