两个基础概念要了解,RSA非对称加密和哈希算法。RSA非对称加密能服务器使用私钥加密,客户端使用不一样的公钥进行解密得到结果,哈希能给将大量的文本计算成少量的字符。为确保内容安全防止传输内容被篡改,很常见的一种加密步骤为:
1.常用的一种方式为使用哈希算法得到需要传输内容的一个字符串值(大量内容进行加密耗时,对内容哈西进行加密时间短)
2.使用服务器私钥对此内容的哈希值进行加密,得到数字签名(签名)
3.将传输内容和数字签名一起打包发给对方,前端或者其他接受者
4.接受者拿到内容后,对内容进行哈希值计算,得到接收内容的哈希值,再利用公钥对数字签名进行解密得到发送时的内容哈希值(验签,验证签名)
比较两个哈希值,如果出现问题,则说明传输过程中被篡改,反之则说明内容安全
我们从苹果商店下载app到手机上流程跟以上基本类似。苹果服务器用服务器私钥对代码数据进行签名,然后客户端下载完成后使用客户端公钥验证签名,来防止app数据和代码被篡改。如果所有的程序都从商店下载,此方式可以。但是我们在日常开发中有开发者模式还有企业账号等模式,此种方式就不行了。针对这些情况如开发者调试苹果设计了双层签名流程,来保证安装程序的安全。
![](https://img.haomeiwen.com/i4970273/d6644fadc2f4df8f.png)
证书签名大体流程为图中表示
如果使用此种方式,所有设备都可以安装开发软件,这个是苹果不允许的,所以引出来另外一个文件Profiles描述文件。我们在测试app的时候需要创建bundleid并将测试机的uuid还有app需要申请的权限如推送等,都需要在开发者后进行配置。这些配置会生成一个profiles描述文件,苹果也会对此文件走证书签名的过程,app在安装到手机上时,手机端的服务器公钥也会对此描述文件进行验证签名。通过此文件达到控制app权限和安装设备。
如何使用xcode绕过签名,首先准备一个已经砸壳ipa包或者从pp助手中下载一个已越狱应用。按照文末脚本代码注释提示设置对应配置,复制此脚本代码到.sh结尾类型的脚本文件中,在xcode脚本运行设置位置设置好此.sh脚本路径。
![](https://img.haomeiwen.com/i4970273/6da4fc146be2d72e.png)
使用xcode进行打包,就可以将ipa签名为我们设定的bundleid app安装到手机上了。
对应的脚本代码
# ${SRCROOT} 它是工程文件所在的目录
TEMP_PATH="${SRCROOT}/Temp"
#资源文件夹,我们提前在工程目录下新建一个APP文件夹,里面放ipa包
ASSETS_PATH="${SRCROOT}/APP"
#目标ipa包路径
TARGET_IPA_PATH="${ASSETS_PATH}/*.ipa"
#清空Temp文件夹
rm -rf "${SRCROOT}/Temp"
mkdir -p "${SRCROOT}/Temp"
#----------------------------------------
# 1. 解压IPA到Temp下
unzip -oqq "$TARGET_IPA_PATH" -d "$TEMP_PATH"
# 拿到解压的临时的APP的路径
TEMP_APP_PATH=$(set -- "$TEMP_PATH/Payload/"*.app;echo "$1")
# echo "路径是:$TEMP_APP_PATH"
#----------------------------------------
# 2. 将解压出来的.app拷贝进入工程下
# BUILT_PRODUCTS_DIR 工程生成的APP包的路径
# TARGET_NAME target名称
TARGET_APP_PATH="$BUILT_PRODUCTS_DIR/$TARGET_NAME.app"
echo "app路径:$TARGET_APP_PATH"
rm -rf "$TARGET_APP_PATH"
mkdir -p "$TARGET_APP_PATH"
cp -rf "$TEMP_APP_PATH/" "$TARGET_APP_PATH"
#----------------------------------------
# 3. 删除extension和WatchAPP.个人证书没法签名Extention
rm -rf "$TARGET_APP_PATH/PlugIns"
rm -rf "$TARGET_APP_PATH/Watch"
#----------------------------------------
# 4. 更新info.plist文件 CFBundleIdentifier
# 设置:"Set : KEY Value" "目标文件路径"
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$TARGET_APP_PATH/Info.plist"
#----------------------------------------
# 5. 给MachO文件上执行权限
# 拿到MachO文件的路径
APP_BINARY=`plutil -convert xml1 -o - $TARGET_APP_PATH/Info.plist|grep -A1 Exec|tail -n1|cut -f2 -d\>|cut -f1 -d\<`
#上可执行权限
chmod +x "$TARGET_APP_PATH/$APP_BINARY"
#----------------------------------------
# 6. 重签名第三方 FrameWorks
TARGET_APP_FRAMEWORKS_PATH="$TARGET_APP_PATH/Frameworks"
if [ -d "$TARGET_APP_FRAMEWORKS_PATH" ];
then
for FRAMEWORK in "$TARGET_APP_FRAMEWORKS_PATH/"*
do
#签名
/usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"
done
fi
#注入
#yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/hankhook.framework/hankhook"
网友评论