对重签名脚本进行了规范的踩坑 , 挤出一个微笑后写下这篇博文
感谢Google, 感谢我生涩的swift 之阅读IosAppResigner源码
Profile

使用
1 2 3 4 5
|
./resign.sh /Users/dobby/Desktop/微信-已砸壳.ipa /Users/dobby/Desktop/original.mobileprovision com.weixin.resign
|
- $1 需要砸壳过的ipa,从PP助手下载即可
- $2 .mobileprovision 这个是证书对应的文件,也可以指定证书Xcode的product下也会生成
- $3 是否修改bundleID,默认是原先的

脚本内部需要写入一个一个签名字符串,可以通过下方的命令拿到
1 2 3 4 5
|
security find-identity -v -p codesigning
|
若是cryptid显示为0,非砸壳为1. 砸壳虽不影响签名的成功率, 但是我试了下可安装,但不可使用. 可google下砸壳方法自行砸壳.下面是查看cryptid的命令
1 2 3 4 5
|
otool -l ./腾讯手机管家-来电防骚扰的QQ安全助手\\(正版\\)/Payload/MQQSecure.app/MQQSecure | grep cryptid
|
mobileProvision生成Entitlements.plist
1 2 3 4 5 6 7
|
security cms -D -i $provision > ProvisionProfile.plist
/usr/libexec/PlistBuddy -x -c "Print Entitlements" ProvisionProfile.plist > $tempPlace/Entitlements.plist
|
用该方法生成一个Entitlements.plist文件,之前还没找到这么快捷的生成方法, 有个土方法自己折腾出来的也是可行的,详见plist文件-在脚本中的操作
mobileProvision拷贝为embedded.mobileprovision
1 2 3 4 5
|
cp $provision $appPlace/embedded.mobileprovision
|
是否概要更改BundleID
1 2 3 4 5 6 7 8 9 10 11 12 13
|
if \[\[ $3 \]\]; then
plutil -replace CFBundleIdentifier -string "$3" $appPlace/Info.plist
reBundleID=\`plutil -p $appPlace/Info.plist | grep 'CFBundleIdentifier' \`
echo "Log info : you wanna replace to: ${reBundleID}"
fi
|
默认的时候是原先的, BundleID安装到设备上是唯一的,若是原版本共存,必须要更改
删除影响签名文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
1
2
3
4
5
6
7
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
plutil -remove CFBundleREsourceSpecification $appPlace/Info.plist #删除签名源文件相关
rm -rf $appPlace/Watch #发现watch插件必现失败,这个必须删除了
rm -rf $appPlace/PlugIns #发现PlugIns插件必现失败,这个必须删除了,就算下面重签也不管的, 坑超多
codesignInfo=\`find $appPlace -name "CodeResources" \`
for i in $codesignInfo; do
rm -f $i
done
|
- 对Info.plist里面的CFBundleREsourceSpecification这个key删除,具体不知道做了什么,IosAppSigner也这么做了
- Watch和Plugins这两个文件,我曾试过对他们都进行重签名, 但依然不管用, 相关坑大概是独立性,可以跳转到念茜女神的博文了解
- 源文件的_CodeSignature/CodeResources也进行了全局删除,签名后会自动生成这个文件
开始重签
第一步,相关lib-framework签名
1 2 3 4 5 6 7 8 9 10 11
|
allShouldSign=\` find $appPlace -name "\*.appex" && find $appPlace -name "\*.framework" && find $appPlace -name "\*.dylib" && find $appPlace/\* -name "\*.app" \` #最上层的先不签
for i in $allShouldSign; do
codesign -fs "${signStr}" --no-strict --entitlements=/tmp/project\_resign/Entitlements.plist $i
done
|
核心包签名
1 2 3 4 5
|
codesign -vvv -fs "$signStr" --no-strict --entitlements=/tmp/project\_resign/Entitlements.plist $appPlace
|
打包为ipa
1 2 3 4 5 6 7 8 9
|
cd $tempPlace
zip -qry sign.ipa ./Payload
mv $tempPlace/sign.ipa ~/Desktop
|
- 因为打包的时候是递归形式的, 指定绝对路径会踩坑,注意就行
安装试试

- - -附源码github链接