ios重签名脚本的0到1

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

Profile

使用

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

脚本内部需要写入一个一个签名字符串,可以通过下方的命令拿到

1
security find-identity -v -p codesigning

若是cryptid显示为0,非砸壳为1. 砸壳虽不影响签名的成功率, 但是我试了下可安装,但不可使用. 可google下砸壳方法自行砸壳.下面是查看cryptid的命令

1
otool -l ./腾讯手机管家-来电防骚扰的QQ安全助手\(正版\)/Payload/MQQSecure.app/MQQSecure | grep cryptid

mobileProvision生成Entitlements.plist

1
2
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
cp $provision $appPlace/embedded.mobileprovision

是否概要更改BundleID

1
2
3
4
5
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
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
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
  • 对上方类型都进行一篇搜索,得到绝对路径后进行重签名

    这是iosAppResigner中,作者对着全部的类型都检索了一遍,我并完全覆盖,如果你踩到了坑,可以试试把类型都加上

核心包签名

1
codesign -vvv -fs "$signStr" --no-strict --entitlements=/tmp/project_resign/Entitlements.plist $appPlace

打包为ipa

1
2
3
cd $tempPlace
zip -qry sign.ipa ./Payload
mv $tempPlace/sign.ipa ~/Desktop
  • 因为打包的时候是递归形式的, 指定绝对路径会踩坑,注意就行

安装试试

- - -附源码github链接

© 2020 In 'flight of thought' All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero