拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

iOS渗透工具实战:砸壳、class-dump与重签名全流程

iOS渗透工具实战:砸壳、class-dump与重签名全流程 简介iOS渗透工具.zip 是一套面向移动应用安全测试人员与逆向工程学习者的工具集合聚焦于 iOS 应用的安全审计与渗透测试场景适合具备一定安全基础、希望系统接触 iOS 应用分析流程的读者。压缩包共 8 个文件约 1.32MB以 txt 说明文档、Python 脚本、zip 跨平台工具包及 classdumpz、clutch 等可执行组件为主涵盖头文件提取、应用备份提取、IPA 重签名等典型环节。其中 classdumpz 用于导出已编译类与方法头文件帮助理解应用结构Clutch 可从越狱设备备份并提取 IPA两个 Python 脚本负责 IPA 重签名便于在测试环境中绕过部分运行限制README 与文本文件则提供安装、配置及使用提示。目前已有 75 人学习下载读者可借此搭建一套相对完整的 iOS 安全分析工具链快速上手应用结构梳理、备份提取与重签名等核心操作为后续深入逆向与漏洞排查打下基础。1. 拿到 iOS渗透工具.zip 先别急着解压这套工具到底解决什么问题很多人第一次拿到 iOS渗透工具.zip第一反应是双击解压然后挨个点开看。我建议先停一下因为这套东西不是「一键渗透」的按钮而是一条从 IPA 到可读代码的流水线。压缩包里实际躺着的是 Clutch、classdumpz、resignIPA.py、resignIPA2.py、Mac_Linux_Win_class-dump-z.zip 以及几个说明文本覆盖了 iOS 应用安全分析里最核心的三段砸壳拿 IPA、导出头文件看结构、重签名装回设备跑起来。它适合做应用安全审计、逆向工程入门、CTF 移动题准备以及需要理解第三方 SDK 行为的开发。不适合想找「点一下就拿数据」的人因为每一步都有环境依赖和版本坑。下面按真实操作顺序拆开讲参数怎么给、哪里会翻车都落到命令上。2. 砸壳与导出Clutch 和 classdumpz 的配合逻辑2.1 为什么必须先砸壳再 class-dump从 App Store 下载的 IPA 是加密的Mach-O 的__TEXT段被 FairPlay DRM 包住直接跑 class-dump 只能看到一堆乱码或空输出。Clutch 的作用就是在越狱设备上把解密后的内存镜像 dump 成新的 IPA这一步俗称「砸壳」。砸壳完成后classdumpz 才能从解密后的 Mach-O 里读出 Objective-C 的类名、方法签名和属性。顺序不能反反了就是白干。Clutch 的常见用法是把它推到设备上执行或者直接在设备终端里跑。它内部会枚举已安装应用找到目标 bundle 后调用mach_vm_region遍历内存把解密页写回文件。这里有个细节Clutch 对 Swift 混编的应用支持一般如果目标大量用 Swift砸出来的 IPA 里 Swift 符号可能不全这时候常见做法是换用 frida-ios-dump 之类的方案补位但那是另一套工具不在这个包里。2.2 Clutch 砸壳的实操步骤先把 Clutch 二进制推到越狱设备的可执行路径赋权后运行。不同越狱环境路径不一样我一般放/usr/bin/下。# 将 Clutch 推送到设备假设已通过 SSH 连接 scp Clutch rootdevice_ip:/usr/bin/Clutch ssh rootdevice_ip chmod x /usr/bin/Clutch # 列出设备上所有已安装应用找到目标 bundle id ssh rootdevice_ip /usr/bin/Clutch -i # 按编号砸壳输出 IPA 默认落在 /var/mobile/Documents/Dumped/ ssh rootdevice_ip /usr/bin/Clutch -d 3 # 把砸好的 IPA 拉回本地 scp rootdevice_ip:/var/mobile/Documents/Dumped/*.ipa ./dumped/-i是 list installed输出里会带编号和 bundle id记下你要的那个编号。-d后面跟编号执行 dumpClutch 会打印解密进度和最终 IPA 路径。如果卡在某个百分比不动多半是目标应用有反调试或内存校验常见做法是先关掉设备的调试检测插件再重试。拉回来的 IPA 用unzip -l看一眼确认Payload/下的可执行文件大小正常没被截断。2.3 classdumpz 导出头文件与参数说明classdumpz 是 class-dump 的变体跨平台版本在 Mac_Linux_Win_class-dump-z.zip 里。解压后按系统选对应二进制。它的核心参数是-H生成头文件和-o输出目录。# 从砸壳后的 IPA 中提取可执行文件 unzip -o dumped/TargetApp.ipa -d extracted/ APP_BIN$(find extracted/Payload -maxdepth 2 -type f -perm 111 | head -n 1) # 用 classdumpz 导出头文件到 headers 目录 ./classdumpz -H -o ./headers $APP_BIN # 查看导出了多少个类 ls ./headers | wc -l-H表示生成.h文件每个类一个文件。-o指定输出目录目录不存在会自动建。$APP_BIN是 Mach-O 可执行文件路径注意不是.app目录本身。导出后headers里就是可读的类声明方法名、属性、协议一目了然。如果输出为空先确认 IPA 是否真的砸过壳——用otool -l看__TEXT段的cryptid值为 1 说明还加密着值为 0 才是解密状态。提示classdumpz 对 arm64e 的支持取决于编译版本遇到导出不全时优先检查二进制架构是否匹配。3. 重签名resignIPA.py 与 resignIPA2.py 怎么选、怎么跑3.1 两个脚本的差异与选型包里给了 resignIPA.py 和 resignIPA2.py 两个版本不是重复文件。resignIPA.py 通常是基础流程解压 IPA、替换 embedded.mobileprovision、用 codesign 重签、再打包。resignIPA2.py 一般在此基础上加了 entitlements 处理和更细的签名顺序控制比如先签 Frameworks 再签主二进制。选哪个取决于你的 IPA 里有没有嵌套的 framework 或 app extension。有嵌套就用 resignIPA2.py否则 resignIPA.py 够用。判断方法很简单解压后看Payload/App.app/Frameworks/是否存在。重签名的前提是你有一个有效的开发者证书和对应的 provisioning profile。证书在钥匙串里profile 从开发者后台导出。这一步绕不开没有证书就没法签。3.2 重签名完整命令流程# 查看本机可用签名身份 security find-identity -v -p codesigning # 用 resignIPA2.py 重签指定证书名和 profile python3 resignIPA2.py \ --ipa ./dumped/TargetApp.ipa \ --cert Apple Development: youremail.com (XXXXXXXXXX) \ --profile ./profiles/dev.mobileprovision \ --output ./resigned/TargetApp_resigned.ipa # 验证签名结果 codesign -dv --verbose4 ./resigned/Payload/TargetApp.app--cert填security find-identity输出里的完整名称引号不能省因为名字里有空格和括号。--profile指向你的.mobileprovision文件。--output是重签后的 IPA 路径。脚本内部会做这几件事解压原 IPA、删掉旧的_CodeSignature、拷入新 profile、对每个 Mach-O 执行codesign -f -s、最后zip回包。验证时看codesign -dv输出的Authority是不是你的证书TeamIdentifier是否匹配。如果脚本报resource fork, Finder information, or similar detritus not allowed是解压时带了 macOS 扩展属性用xattr -cr清一遍再签。如果报 entitlements 不匹配说明原 IPA 的 entitlements 里有你的 profile 不支持的权限比如get-task-allow或特定 keychain group需要在脚本里替换 entitlements plist。3.3 签名失败的排查顺序签名失败不要瞎试按固定顺序查先确认证书没过期security find-identity里有效身份数量大于零再确认 profile 里包含目标设备的 UDID真机安装时然后确认 bundle id 和 profile 的 App ID 匹配通配符 profile 能签大部分但带特定 entitlement 的会失败最后看嵌套二进制是否都签了find Payload -type f -perm 111列出来逐个核对。这四步走完九成签名问题都能定位。4. 避坑与常见问题这套工具最容易翻车的地方4.1 砸壳后 class-dump 输出为空现象Clutch 显示 dump 成功但 classdumpz 导出的 headers 目录是空的。原因IPA 里的可执行文件仍然是加密状态Clutch 在某些越狱环境如 rootless 越狱下路径权限不对写回的文件没真正解密。解决用otool -l检查cryptid确认是 0如果不是换 Clutch 版本或改用其他 dump 方案重新砸壳。4.2 重签名后安装提示「无法验证应用」现象IPA 签完推到设备安装时弹无法验证。原因profile 里没有目标设备 UDID或者证书类型是 Distribution 而非 Development。解决确认 profile 是 Development 类型且包含设备 UDID重新导出 profile 后再签。企业证书场景另说但个人调试必须走 Development。4.3 resignIPA2.py 报权限错误现象脚本执行到 codesign 步骤报Operation not permitted。原因macOS 对脚本调用的二进制有 quarantine 属性或者脚本本身没有执行权限。解决chmod x resignIPA2.py并对解压目录执行xattr -cr再重跑。4.4 classdumpz 在 Linux 上跑不起来现象Mac_Linux_Win_class-dump-z.zip 里的 Linux 二进制执行报No such file or directory。原因二进制依赖的动态库缺失或者架构不匹配比如下的是 x86 版本跑在 arm 机器上。解决file命令看架构ldd看依赖缺库就补架构不对就换对应版本。实在不行在 Mac 上跑class-dump 系工具在 macOS 上兼容性最好。4.5 重签后应用启动闪退现象安装成功但一打开就闪退。原因entitlements 丢失或 keychain access group 不匹配应用启动时校验失败。解决用codesign -d --entitlements对比原 IPA 和重签后的 entitlements把缺失的键补回去。常见缺失项是application-identifier和keychain-access-groups。5. 进阶把重签名做成可复用流水线的一个技巧单次重签名手动跑脚本没问题但如果你要反复签不同 IPA每次都改参数很烦。我的做法是写一个薄封装把证书名、profile 路径、输出目录固定到配置文件里脚本只传 IPA 路径。这样换目标时只改一个参数。#!/bin/bash # resign.sh - 固定配置的重签名封装 CERTApple Development: youremail.com (XXXXXXXXXX) PROFILE./profiles/dev.mobileprovision OUTDIR./resigned IPA$1 NAME$(basename $IPA .ipa) python3 resignIPA2.py \ --ipa $IPA \ --cert $CERT \ --profile $PROFILE \ --output $OUTDIR/${NAME}_resigned.ipa # 签完自动验证 codesign -dv --verbose4 $OUTDIR/Payload/${NAME}.app 21 | grep -E Authority|TeamIdentifier这个封装的价值在于把易错的证书名和 profile 路径从命令行里挪走减少手误。$1是唯一变量传 IPA 路径即可。签完自动跑codesign -dv并过滤关键字段一眼能看出签名身份对不对。验证重签名是否真正生效除了看codesign -dv还有一个更硬的方法把重签后的 IPA 装到设备上用console或 Xcode 的 Devices 窗口看启动日志确认没有amfid拒绝签名的报错。如果日志里出现CSSMERR_TP_NOT_TRUSTED说明证书链没被设备信任需要在设备上手动信任开发者证书。还有一个容易被忽略的点classdumpz 导出的头文件只是声明不含方法实现。想看具体逻辑还得上 Hopper 或 IDA 反汇编。这套工具包定位是「拿到结构」不是「拿到源码」。理解这个边界就不会在导出头文件后期待过高。从那以后我每次拿到新的 IPA都强制先跑一遍otool -l确认 cryptid再决定要不要砸壳省得在 class-dump 空输出上浪费半小时。希望帮到你。本文还有配套的精品资源点击获取
返回列表