计划执行与检查节点
executing-plans
按既定实施计划完成工作,保持过程检查和反馈。
re-ios-jb【效率与协作】iOS 越狱逆向环境:越狱检测识别与绕过、tweak 分析与开发。 触发词:越狱、jailbreak、tweak、Theos、LLDB 远程
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
越狱/动态分析属动态执行,受控设备 + 网络隔离([[re-analyze/platform-tips]] 最高原则)。静态(tweak 二进制分析)免沙箱。所有工具先验证再使用。
# 官方一键脚本(推荐)
sudo /bin/sh -c "$(curl -fsSL https://static.palera.in/scripts/install.sh)"
# 或 GitHub releases(palera1n/palera1n)手动下载二进制
curl -LO https://github.com/palera1n/palera1n/releases/download/v2.0.2/palera1n-linux-x86_64
chmod +x palera1n-linux-x86_64 && sudo mv palera1n-linux-x86_64 /usr/bin/palera1n
palera1n --help;越狱后设备上出现 Sileo(rootless 包管理器)export THEOS=~/theos
git clone --recursive https://github.com/theos/theos.git $THEOS
echo "export THEOS=~/theos" >> ~/.zprofile && echo "export PATH=$THEOS/bin:$PATH" >> ~/.zprofile
brew install ldid xz;Linux 需 sudo apt install dpkg-dev fakeroot(Debian/Ubuntu)等打包依赖curl -LO https://github.com/theos/sdks/archive/master.zip 解出 *.sdk 放 $THEOS/sdks$THEOS/bin/update-theos(滚动发布)$THEOS/bin/nic.pl 能列出 New Instance Creator 模板https://build.frida.re 安装 frida;或 ssh root@<设备IP> 后安装pip install frida-toolsfrida-ps -U 列出设备进程xcode-select --install(自带);Linux apt install lldb / dnf install lldb / pacman -S lldbbrew install usbmuxd;Linux 的 iproxy 在 libimobiledevice-utils 包(Debian/Ubuntu/Fedora)/libimobiledevice 包(Arch),仅装 usbmuxd 不含 iproxy:apt install usbmuxd libimobiledevice-utils / dnf install usbmuxd libimobiledevice-utils / pacman -S usbmuxd libimobiledevicelldb --version;iproxy 2222 22 后 ssh -p 2222 root@127.0.0.1 能登录设备按顺序执行,每步产物(设备信息、hook 清单、tweak 分析笔记)记录证据路径 + sha256(见 [[re-triage]]),供报告引用。
越狱环境搭建(设备 / 工具链):
# 设备:DFU 模式进入 palera1n
sudo systemctl stop usbmuxd && sudo usbmuxd -f -p & # 部分环境需重启 usbmuxd
sudo palera1n # rootless 默认,无需旗标(v2 选项集 [-DEhpvVdsSLRnPI] 无 -l)
# 越狱后:Sileo 装 OpenSSH → 转发 → 登录
iproxy 2222 22 &
ssh -p 2222 root@127.0.0.1 # 默认密码 alpine(rootless 后立即改)
/var/jb)越狱检测识别与绕过:
/Applications/Cydia.app、/usr/sbin/sshd、/var/jb、cydia:// 等),[[re-ghidra]]/[[re-ida]] 沿 xref 找检测函数// hook.js —— 记录 App 检查了哪些越狱特征路径
['access', 'stat', 'lstat', 'open', 'dlopen'].forEach(function(n) {
var f = Module.findGlobalExportByName(n); // Frida 17+:旧写法 Module.findExportByName(null, n) 已移除
if (f) Interceptor.attach(f, { onEnter: function(a) {
var p = (n === 'dlopen') ? a[0] : a[0].readCString(); // 读 C 字符串用 NativePointer 实例方法(Memory 下无 readCString)
if (p && (p.indexOf('Cydia') >= 0 || p.indexOf('/var/jb') >= 0 || p.indexOf('jb') >= 0))
console.log(n, '->', p, 'ret_pending');
}});
});
fork() 后父进程、沙箱外写测试(/private/)、越狱检测库(jailbreak detection SDK);绕过 = 对每个检测点改返回值(frida 或写 tweak),见坑 3tweak 分析(MobileSubstrate/Substrate hook):
# 已有 tweak 的 deb:解包看动态库 + 过滤 plist
dpkg-deb -x tweak.deb /tmp/tweak/ # Linux/macOS 装 dpkg 或用 ar 解
find /tmp/tweak -name "*.dylib" -o -name "*.plist"
cat /tmp/tweak/Library/MobileSubstrate/DynamicLibraries/*.plist # Filter:hook 哪些进程
%hook ClassName 会保留类名字符串)→ [[re-ghidra]]/[[re-ida]] 定位MSHookMessageEx(OC 方法)改类方法实现指针;MSHookFunction(C 函数)改函数头跳转——反编译里找 MSHookMessageEx/MSHookFunction 调用点,参数(目标类/方法/新实现地址)即 hook 清单%hook/%orig 的 Logos 语法展开后就是上述调用(理解 Logos 利于看懂编译产物)动态调试(lldb 远程 attach):
iproxy 1234 1234 & # 转发调试端口
# 设备端:目标 App 启动后,root 下运行 debugserver 附加
# 主机侧:
lldb
(lldb) platform select remote-ios
(lldb) process connect connect://127.0.0.1:1234
(lldb) process attach --pid <pid> # 或按进程名
(lldb) image lookup -n '-[ViewController viewDidLoad]' # 符号查找([[re-lldb]])
(lldb) breakpoint set -n ptrace # 反调试函数断点(见坑 4)
-U -f <bundleID> spawn 模式补早期逻辑脱壳与分析([[re-ios]] 联动):
otool -l 查 cryptid 1)→ 先按 [[re-ios]] 步骤 5 脱壳(FairPlay 解密,backend 按目标 iOS / Frida 世代选),脱壳后回步骤 2-3 做静态/var/jb 前缀下;对策——明确 rootless 与 rootful 的区别:rootless 下依赖、tweak、frida 都在 /var/jb,写系统分区内容不生效;需要写系统分区的老工具要确认 rootless 兼容或改用 rootful 模式(旧 iOS 才支持)frida --version 完全一致([[re-frida]] 坑 1);越狱过程先备份,DFU 失败可重来frida -U -f <bundleID>),按步骤 2 的 hook 清单逐项绕过;检测库的分析用静态先定位(strings + xref),动态只做验证;绕过方案先记录再实施([[re-analyze/platform-tips]] 受控设备)ptrace(PT_DENY_ATTACH))、sysctl 的 P_TRACED 标志、getppid 等反调试手段;对策——断点先打在 ptrace/sysctl 上改返回值(步骤 4 示例),或用 Theos 写 anti-anti-debug tweak 全局绕过;越狱设备上部分检测还针对 debugserver 进程名,必要时改名/隐藏