简介:iOS渗透工具.zip 是一套面向移动应用安全测试人员与逆向工程学习者的工具集合,聚焦于 iOS 应用的安全审计场景,帮助使用者在合规前提下分析应用结构、备份提取与重签名测试。压缩包共 8 个文件,约 1.32MB,以 txt 说明文档、Python 脚本、classdumpz 与 clutch 可执行工具及一个跨平台 class-dump 压缩包为主,覆盖从信息提取到应用重签名的多个环节。其中 classdumpz 用于导出已编译类与方法头文件,便于理解应用结构与潜在弱点;Clutch 可从越狱设备备份并提取 IPA;两个 Python 重签名脚本则支持以不同身份运行应用,绕过部分环境限制;README 与说明文本提供安装、配置与使用提示。目前已有 75 人学习,适合具备一定 iOS 基础、希望系统了解渗透测试工具链的安全研究者参考。
1. iOS渗透工具.zip:从砸壳到重签,一套能跑通的本地分析链路
拿到一个叫「iOS渗透工具.zip」的压缩包,很多人第一反应是解压看里面有什么。但真正做过 iOS 应用分析的人都知道,工具本身不值钱,值钱的是把 Clutch 砸壳、class-dump 导头文件、resignIPA 重签这三件事串成一条能复现的流水线。这个标题背后对应的不是某个具体仓库,而是一类需求:手上有一台已授权的测试设备,想对目标 IPA 做静态结构分析和动态调试前的准备工作。适合谁?做移动端安全评估的、搞竞品分析的、以及需要验证自家 App 加固效果的同学。不适合谁?想拿工具去搞未授权设备的人,这条路走不通也不该走。下面按「环境准备 → 砸壳 → 导头文件 → 重签 → 排错」的顺序,把每一步的命令、参数和翻车点讲清楚。
2. 环境准备与工具链选型:为什么是 Clutch、class-dump 和 resignIPA
2.1 三类工具各自解决什么问题
iOS 应用分析的第一步不是打开工具,而是搞清楚每个工具在链路里的位置。App Store 下载的 IPA 是加密的,直接拖进 Hopper 或 IDA 只能看到一堆乱码,所以需要砸壳工具把解密后的可执行文件 dump 出来。Clutch 就是干这个的,它通过调试接口在运行时把解密后的内存段写回磁盘。砸完壳拿到明文 Mach-O 之后,class-dump 负责解析 Objective-C 的运行时元数据,把类名、方法名、属性导出成可读的头文件。最后 resignIPA 解决的是「改完的东西怎么装回设备」的问题——原签名失效了,必须用本地证书重新签一遍。
这三步的顺序不能乱。先砸壳再导头文件,因为加密状态下 class-dump 读不到有效数据;先重签再安装,因为任何对 IPA 内容的修改都会破坏原始签名。常见做法是把三个工具放在同一个工作目录下,用脚本串起来,避免手动传路径时出错。
2.2 设备与系统版本的前置检查
工具能不能跑起来,一半取决于设备状态。Clutch 需要设备已越狱,并且安装了 OpenSSH 和 MobileSubstrate。class-dump 在 macOS 本地运行,不依赖设备。resignIPA 需要本地钥匙串里有有效的开发者证书和对应的 Provisioning Profile。
先确认设备连接正常:
# 检查设备是否被识别 idevice_id -l # 查看设备系统版本和架构 ideviceinfo | grep -E "ProductVersion|CPUArchitecture"idevice_id -l列出当前连接的设备 UDID,如果为空说明 USB 连接或驱动有问题。ideviceinfo输出的ProductVersion决定后续工具兼容性——比如 iOS 14 以上对 Clutch 的兼容性就明显下降,很多情况下需要换用 frida-ios-dump。CPUArchitecture用来确认是 arm64 还是 arm64e,后者在重签时对 entitlements 要求更严。
提示:如果设备是 iOS 16 以上且没有越狱,Clutch 这条路基本走不通,建议直接转向基于 frida 的动态 dump 方案,本文的 class-dump 和重签部分仍然适用。
2.3 工具获取与目录结构约定
假设你已经拿到了工具包,解压后建议按下面的结构组织,后续命令都基于这个约定:
mkdir -p ~/ios-analysis/{tools,ipas,dumps,headers} # tools/ 放 Clutch、class-dump、resignIPA 的可执行文件 # ipas/ 放原始 IPA # dumps/ 放砸壳后的 IPA # headers/ 放导出的头文件把 Clutch 推到设备上:
# 将 Clutch 二进制推送到越狱设备的可执行路径 scp tools/Clutch root@<device_ip>:/usr/bin/Clutch ssh root@<device_ip> "chmod +x /usr/bin/Clutch"<device_ip>替换成设备的局域网地址,默认 root 密码在越狱环境中通常是 alpine,首次登录后应立即修改。chmod +x赋予执行权限,漏掉这一步会报Permission denied。class-dump 和 resignIPA 放在本地tools/目录即可,用的时候给绝对路径或加入 PATH。
3. 用 Clutch 砸壳:命令、参数与失败时的判断逻辑
3.1 砸壳前的进程确认
Clutch 的工作原理是 attach 到目标进程,所以目标 App 必须正在运行。先在设备上手动打开目标 App,然后通过 SSH 执行:
# 列出当前可砸壳的进程 ssh root@<device_ip> "Clutch -l"输出会列出所有已安装且正在运行的应用,每行前面有编号。找到目标 App 的 Bundle ID,比如com.example.targetapp。如果列表里没有目标应用,说明进程没起来或者 Clutch 没检测到,先确认 App 在前台运行。
3.2 执行砸壳与输出路径
# 按 Bundle ID 砸壳 ssh root@<device_ip> "Clutch -b com.example.targetapp" # 或者按列表编号砸壳 ssh root@<device_ip> "Clutch -i 3"-b参数接受 Bundle ID,-i接受列表编号,两者选一个即可。砸壳成功后,Clutch 会把解密后的 IPA 输出到设备的/var/mobile/Documents/Dumped/目录下,文件名格式是目标名-版本号-砸壳时间.ipa。把这个文件拉回本地:
scp root@<device_ip>:/var/mobile/Documents/Dumped/*.ipa ~/ios-analysis/dumps/拉回来之后先验证一下文件完整性:
# 检查 IPA 是否可解压,以及可执行文件是否已解密 unzip -l ~/ios-analysis/dumps/target.ipa | head -20 # 用 otool 检查 cryptid,1 表示仍加密,0 表示已解密 unzip -o ~/ios-analysis/dumps/target.ipa -d /tmp/target_check otool -l /tmp/target_check/Payload/*.app/* | grep -A4 LC_ENCRYPTION_INFOcryptid为 0 才说明砸壳成功。如果还是 1,常见原因是 Clutch 版本与系统不匹配,或者目标 App 有反调试保护。这时候可以换 frida-ios-dump,命令是python dump.py com.example.targetapp,原理类似但兼容性更好。
3.3 砸壳失败的三种典型表现
第一种,Clutch 卡在Dumping XX不动。原因通常是 App 体积大或者设备内存不足,解决方法是关掉其他后台应用,或者改用-i逐个尝试。第二种,报Could not find specified process。原因是 Bundle ID 写错或者进程已退出,重新打开 App 再试。第三种,砸壳后 IPA 能解压但可执行文件仍是加密的。这种情况多半是 App 集成了越狱检测,检测到环境异常后拒绝解密,需要配合绕过插件处理。
注意:砸壳操作只应在你自己拥有或已获得明确授权的设备上进行。对他人设备或未授权应用执行此类操作,可能违反相关法律法规。
4. class-dump 导头文件:参数调优与结果验证
4.1 基本命令与架构匹配
砸壳完成后,把 IPA 解压拿到.app目录,找到里面的可执行文件。class-dump 需要针对正确的架构运行:
# 解压砸壳后的 IPA unzip -o ~/ios-analysis/dumps/target.ipa -d ~/ios-analysis/dumps/extracted # 查看可执行文件包含的架构 lipo -info ~/ios-analysis/dumps/extracted/Payload/*.app/target # 导出头文件 ~/ios-analysis/tools/class-dump \ -H \ -o ~/ios-analysis/headers/target \ ~/ios-analysis/dumps/extracted/Payload/*.app/target-H表示生成头文件,-o指定输出目录。如果可执行文件是 fat binary(包含多种架构),class-dump 默认处理所有架构,也可以用-arch arm64只处理指定架构。导出完成后,headers/target/下会出现大量.h文件,每个文件对应一个类。
4.2 过滤与聚焦:别被几千个头文件淹没
一个中等规模的 App 导出的头文件可能有两三千个,直接翻根本不现实。常见做法是先按关键字过滤:
# 搜索包含特定关键字的类名 grep -rl "Login" ~/ios-analysis/headers/target/ | head -20 # 搜索特定方法的声明 grep -rn "validatePassword" ~/ios-analysis/headers/target/grep -rl只输出文件名,适合快速定位;grep -rn输出行号和内容,适合确认方法签名。另一个技巧是结合class-dump的-A参数导出所有信息(包括地址),但这样文件会更大,一般只在需要定位具体实现时才用。
4.3 头文件里该看什么
导出的头文件里,重点关注三类信息:类继承关系(能看出用了哪些框架)、方法签名(能看出业务逻辑的入口)、属性声明(能看出数据结构)。比如看到@interface LoginManager : NSObject下面有- (BOOL)validateToken:(NSString *)token,就知道登录校验的入口在这里。如果头文件里出现大量CDUnknownBlockType,说明用了大量 block 回调,静态分析难度会上升,需要结合动态调试。
提示:class-dump 对 Swift 的支持有限,Swift 的类名和方法名会被 mangled,需要用
swift-demangle还原。如果目标 App 是纯 Swift 写的,class-dump 的输出价值会打折扣。
5. resignIPA 重签:证书、entitlements 与安装验证
5.1 重签的完整命令链路
重签的本质是用本地证书替换 IPA 里的签名信息。resignIPA 通常是一个脚本或工具,核心步骤包括解压、替换 embedded.mobileprovision、用 codesign 重新签名、重新打包。手动执行的话:
# 解压原始 IPA unzip -o target.ipa -d resign_work # 替换描述文件 cp ~/certs/dev.mobileprovision resign_work/Payload/target.app/embedded.mobileprovision # 签名所有 framework 和 dylib find resign_work/Payload/target.app/Frameworks -name "*.framework" -exec codesign -f -s "iPhone Developer: Your Name (TEAMID)" {} \; # 签名主可执行文件 codesign -f -s "iPhone Developer: Your Name (TEAMID)" --entitlements entitlements.plist resign_work/Payload/target.app # 重新打包 cd resign_work && zip -qr ../target_resigned.ipa Payloadcodesign -f强制覆盖已有签名,-s指定证书名称,必须和钥匙串里的完全一致。--entitlements指定权限文件,如果原 App 用了特殊权限(比如推送、钥匙串共享),需要从原始描述文件里提取对应的 entitlements,否则重签后可能闪退。
5.2 证书与描述文件的匹配检查
重签失败最常见的原因是证书和描述文件不匹配。先用命令确认:
# 查看描述文件里的 Team ID 和 App ID security cms -D -i ~/certs/dev.mobileprovision | grep -A2 "TeamIdentifier" # 查看本地可用签名证书 security find-identity -v -p codesigningsecurity cms -D解码描述文件,输出的TeamIdentifier必须和证书里的 Team ID 一致。security find-identity列出所有可用的签名身份,如果列表为空说明证书没导入或者已过期。免费开发者证书只有 7 天有效期,过期后需要重新签名,这是很多人踩过的坑。
5.3 安装到设备与验证
重签完成后,用ideviceinstaller或 Xcode 安装:
# 卸载旧版本 ideviceinstaller -U com.example.targetapp # 安装重签后的 IPA ideviceinstaller -i target_resigned.ipa安装成功后,在设备上打开 App,如果能正常启动说明重签链路走通了。如果闪退,先看设备日志:
idevicesyslog | grep -i "target"日志里如果有invalid signature或entitlements相关报错,说明签名或权限配置有问题,回到 5.1 检查 codesign 的参数。
6. 避坑与排查:砸壳、导头文件、重签各阶段的真实翻车记录
6.1 Clutch 报错Failed to dump但无具体信息
现象:执行Clutch -b后只输出一行Failed to dump,没有更多细节。原因:Clutch 的日志级别默认较低,且部分错误被吞掉。解决:加上-v参数开启详细输出,或者查看设备上的/var/log/syslog过滤 Clutch 相关行。如果还是没线索,换 frida-ios-dump,它的错误信息更完整。
6.2 class-dump 导出为空目录
现象:命令执行成功但headers/下没有任何文件。原因:可执行文件是加密的(砸壳没成功),或者 class-dump 版本不支持当前 Objective-C 运行时。解决:先用otool -l确认cryptid为 0,再检查 class-dump 版本是否支持 arm64e。如果是 Swift 为主的项目,class-dump 本来就导不出多少东西,改用nm或strings辅助分析。
6.3 重签后安装报A valid provisioning profile for this executable was not found
现象:ideviceinstaller安装时报描述文件无效。原因:embedded.mobileprovision 没有替换成功,或者描述文件里的 App ID 和实际 Bundle ID 不匹配。解决:解压重签后的 IPA,确认Payload/target.app/embedded.mobileprovision的修改时间和内容是否正确。用security cms -D解码后检查application-identifier是否和 App 的 Bundle ID 一致。
6.4 重签后 App 能装但打开闪退
现象:安装成功,点击图标后立即闪退。原因:entitlements 缺失或错误,常见于使用了推送、HealthKit、钥匙串共享等权限的 App。解决:从原始 IPA 的描述文件中提取 entitlements,用codesign --entitlements重新签名。提取命令是security cms -D -i original.mobileprovision > original.plist,然后从 plist 里找到Entitlements字典。
6.5 设备重启后 Clutch 失效
现象:第一次砸壳成功,设备重启后再执行 Clutch 报错。原因:越狱环境在重启后可能没有完全恢复,MobileSubstrate 没有加载。解决:重新执行越狱引导流程,确认 Cydia 或 Sileo 能正常打开,再重试 Clutch。如果用的是不完美越狱,每次重启都需要重新引导。
7. 把链路脚本化:一个可复用的分析流水线技巧
手动执行上面每一步,做一次两次还行,做多了容易漏参数。我一般会写一个 shell 脚本把砸壳、拉取、解压、导头文件、重签串起来,只留 Bundle ID 和证书名两个变量。核心思路是用set -e让脚本在任何一步失败时立即停止,避免带着错误状态往下跑。
#!/bin/bash set -e BUNDLE_ID="$1" CERT_NAME="$2" DEVICE_IP="$3" WORK_DIR=~/ios-analysis # 砸壳 ssh root@$DEVICE_IP "Clutch -b $BUNDLE_ID" # 拉取最新砸壳产物 scp root@$DEVICE_IP:/var/mobile/Documents/Dumped/*.ipa $WORK_DIR/dumps/ LATEST_IPA=$(ls -t $WORK_DIR/dumps/*.ipa | head -1) # 解压并导头文件 unzip -o "$LATEST_IPA" -d $WORK_DIR/dumps/extracted APP_PATH=$(find $WORK_DIR/dumps/extracted/Payload -name "*.app" -maxdepth 1 | head -1) EXEC_NAME=$(defaults read "$APP_PATH/Info" CFBundleExecutable) $WORK_DIR/tools/class-dump -H -o $WORK_DIR/headers/$BUNDLE_ID "$APP_PATH/$EXEC_NAME" # 重签 cp ~/certs/dev.mobileprovision "$APP_PATH/embedded.mobileprovision" codesign -f -s "$CERT_NAME" "$APP_PATH/$EXEC_NAME" cd $WORK_DIR/dumps/extracted && zip -qr $WORK_DIR/dumps/resigned.ipa Payload echo "Done: $WORK_DIR/dumps/resigned.ipa"set -e是关键,少了它脚本会在砸壳失败后继续跑重签,最后得到一个看似成功但实际无效的 IPA。defaults read从 Info.plist 里读可执行文件名,比硬编码更稳。ls -t按时间排序取最新文件,避免拉到旧的砸壳产物。
这个脚本我用了大概半年,最大的教训是:不要相信「上次能跑这次也能跑」。iOS 系统更新、证书过期、越狱环境变化,任何一个变量都会让链路断掉。所以每次跑之前先花两分钟确认设备连接、证书有效期和 Clutch 可用性,比事后排查省事得多。另外,entitlements 的处理脚本里没写,因为不同 App 差异太大,建议手动确认一次后把对应的 plist 固定下来。希望帮到你。
本文还有配套的精品资源,点击获取