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

Profile

使用

1
2
3
4
5


1


1
2
3
4
5


./resign.sh /Users/dobby/Desktop/微信-已砸壳.ipa /Users/dobby/Desktop/original.mobileprovision com.weixin.resign


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

1
2
3
4
5


1


1
2
3
4
5


security find-identity -v -p codesigning


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

1
2
3
4
5


1


1
2
3
4
5


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


mobileProvision生成Entitlements.plist

1
2
3
4
5
6
7


1

2


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


1


1
2
3
4
5


cp $provision $appPlace/embedded.mobileprovision


是否概要更改BundleID

1
2
3
4
5
6
7
8
9
10
11
12
13


1

2

3

4

5


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


开始重签

第一步,相关lib-framework签名

1
2
3
4
5
6
7
8
9
10
11


1

2

3

4


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


1


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


1

2

3


1
2
3
4
5
6
7
8
9


cd $tempPlace

zip -qry sign.ipa ./Payload

mv $tempPlace/sign.ipa ~/Desktop


安装试试

- - -附源码github链接