在苹果的平常开发中,真机测试与打包等不少流程都会牵扯到各类证书,CertificateSigningRequest,p12等。可是不少相应的开发者并不理解iOS App应用签名的原理和流程。今天着重讲解一下此内容。html
思考shell
在苹果的iOS系统出来以前,之前的主流程Mac OS/Window软件存在着安全隐患,盗版软件,病毒入侵等,苹果但愿能解决相似的问题,保证每个安装在苹果手机上的app都是通过苹果官方容许的,怎么保证呢?xcode
要想回答上面“思考”的答案,首先咱们讲解一个概念。代码签名:是对可执行脚本或者文件进行数字签名,用来保证软件在签名后未被损害或者修改的措施。安全
最简单的验证方式是经过苹果官方生成非对称加密的一对公私钥。私钥保存在Appstore的服务器,而公钥保存在iOS系统中,苹果后台用私钥来对App数据进行签名,iOS系统下载此APP后,用公钥来验证签名。若验证成功,说明该App未被更改,能够安装到手机中,反之,则不行。bash
上面的验证能够解决大部分App入驻手机中的场景,可是对于咱们开发苹果应用的开发者而言,咱们也能够直接经过真机测试进入到用户的手机,并且苹果也有企业用户渠道,因此若是想要全方面的安全的安装苹果App,就没法经过简单的代码签名作到,那么苹果又是经过怎样的方案呢?服务器
下面流程图微信
解释以下:架构
经过上面的讲解,是否是发现特别的安全了?其实否则,由于大部分的应用都是经过AppStore进行安装,若是经过上面的过程能够安装全部的苹果设备,那么还须要要Appstore干吗,这时候苹果防止滥用App,就作了两条限制:app
通过上面的讲解,也引出了另外一个概念-描述文件。iphone
描述文件又称为Provisioning profile,通常包括了三样东西:
当咱们打包或者是真机运行的时候,经过证书来验证程序的安全性和合法性。
而且在App的使用中,苹果还想控制App里面的推送/iCloud及后台运行等这些的权限,苹果将这些权限开关统称为受权文件-Entitlements,并将文件放在了描述文件中。
在开发中,编译一个App后,会用本地的私钥M对App进行签名,同时从苹果服务器获得的描述文件打包进App里为embeded.mobileprovision,把App安装在手机中,最后系统进行来验证。
上面的图也会变为以下:流程就是将描述文件加入,解决上面的问题?
首先咱们作一个demo讲解App包内容。
也就是Code Signature--代码签名。
可是咱们是作逆向开发,因此咱们要学会应用重命名!!!
在讲解重签名中,首先学下终端命令:
当咱们从AppStore上下载App后,若是作了相应的更改,又怎么会在手机上运行起来呢?这就须要应用重签名,而且Xcode给咱们提供了重签名技术-codesign技术。
拓展:咱们首先来说解一下怎么获取应用的ipa包?
1 下面咱们将以在iTunes 12.6.3 下载了两个版本的微信,一个为正版,一个为盗版的分别进行签名!
经过微信-6.7.3(越狱应用)显示包内容,看出对应的子目录,查看playload文件夹,发现WeChat.app
2而后经过终端命令,otool -l WeChat | grep crypt 查看筛选后的cryp,获得以下:
经过上面的发现cryptid = 0 表明是该App不是加密的,非0时表明是加密的。假如cryptid=1 表明是用1这种方式加密,不表明用1加密。
上面显示为何有两个cryptid = 0 ,下面的输入命令解释了为什么有两个:经过命令file WeChat
查看有Mach-O中有两种架构,Mach-O executable arm_v7和Mach-O 64bit executable arm64两个,arm_v7表明5s以前的手机,arm64表明的是5s手机以后
3 对越狱微信开始重签名,由于cryptid = 0
3.1 删除多余的越狱微信包内容
3.2 对Framework进行重签名:codesign -fs “本身的开发证书” framework
下面是经过终端命令的截图,完成对截图内的Framework进行重签名。
3.3 下面要对App包整个重签,也就须要对描述文件进行重签。首先将描述性文件放入到越狱微信包下(描述性文件必需要与boundId一致,infoPlist文件查看)
开始要权限plist文件,将entitlements.plist放到了weChat.app同等级目录中
咱们看WeChat.app中,该删的已经删掉,framework重签,以及描述性文件加进去,下面用entitlements.plist对整个App包签名。
经过命令codesign -fs “本身证书” --no-strict --entitlements=entitlements.plist WeChat.app,对包签名
紧接着经过查看codesign -d -vv WeChat.app命令查看重签名成功没,上面的截图中,发现证书已经变为了本身的,说明重签名成功。
结合着xcode与描述性文件,就能够在手机上运行。
上面重签名的步骤,可能并非很清晰,又准备了一个总结以下:
Shell脚本为用户提供了启动程序,管理系统的文件以及运行在系统上进程的途径。Shell在开发中通常指命令行工具,它容许输入文本的命令,而后解释命令,最后在内核中执行。Shell脚本,也是用各种命令预先放入到文件中,方便一次性执行的脚本文件。
下面咱们用demo方式讲解shell命令:
首先经过命令建立文件夹,并在文件夹下建立“国孩”文本
查看桌面内容以下:
若是想这些命令一次性的执行,能够尝试写一个脚本文件
而后进入到编辑页面,将内容输入进去
最后生成文件以下,也能完成目的
看到上面以后,使用到了bash,除了bash,还有zsh,Source等命令效果都是同样的,怎么查看mac支持哪些呢?
经过cd /private/etc,以及cat shells,
经过上面的均可以知足创建123.txt。
可是上面的各个指令也有必定的区别,以下:
也是以Demo的形式进入,在桌面上新建一个Demo文件夹。经过命令ls -l命令查看demo的文件权限
前面有一排-rw-r--r--等,你们可能不知道什么意思,下面咱们来说解:经过一幅图
上面就是文件类型与权限。
上面的权限可不能够更改呢,对于逆向开发的人员,不是没有东西是不能够更改的,下面咱们来说述下更改文件类型和权限。
经过一幅图来说解文件更改的基本内容和指令:
再以Demo的方式进行讲解:
更改guohai.sh文件权限,取消全部权限(非读非写非执行)
再将user,group以及其余设置为可读,执行以下:
还有其余不少命令,你们能够根据上图本身尝试。
学了上面的脚本,就是为了下面所讲的内容-脚本重签名服务的,利用脚本进行重签名。
首先打开项目工程-->build phases -->选择以下:建立一个script脚本
建立以后
而后咱们按照以下步骤进行脚本签名
# ${SRCROOT} 它是工程文件所在的目录 TEMP_PATH="${SRCROOT}/Temp" ASSETS_PATH="${SRCROOT}/APP" TARGET_IPA_PATH="${ASSETS_PATH}/*.ipa" #清空Temp文件夹 rm -rf "$TEMP_PATH" mkdir "$TEMP_PATH" #1.1将IPA解压到Temp下 unzip -oqq "$TARGET_IPA_PATH" -d "$TEMP_PATH" #1.2拿到解压临时的APP路径 TEMP_APP_PATH=$(set -- "$TEMP_PATH/Payload/"*.app;echo "$1") echo "TEMP:🍺$TEMP_APP_PATH" #2拷贝APP #2.1拿到当前工程下的APP路径 TARGET_APP_PATH="$BUILT_PRODUCTS_DIR/$TARGET_NAME.app" echo "TARGET_APP_PATH🍺:$TARGET_APP_PATH" #2.2拷贝三方APP到咱们的工程下 cp -rf "$TEMP_APP_PATH/" "$TARGET_APP_PATH" #3干掉多余的部分 rm -rf "$TARGET_APP_PATH/PlugIns" rm -rf "$TARGET_APP_PATH/Watch" #4修改info.plist 文件 /usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$TARGET_APP_PATH/Info.plist" #5.给可执行文件上权限 #添加ipa二进制的执行权限,不然xcode会告知没法运行 #这个操做是要找到第三方app包里的可执行文件名称,由于info.plist的 'Executable file' key对应的是可执行文件的名称 #咱们grep 一下,而后取最后一行, 而后以cut 命令分割,取出想要的关键信息。存到APP_BINARY变量里 APP_BINARY=`plutil -convert xml1 -o - $TARGET_APP_PATH/Info.plist|grep -A1 Exec|tail -n1 | cut -f2 -d\> | cut -f1 -d\<` echo "🍺: $APP_BINARY" chmod +x "$TARGET_APP_PATH/$APP_BINARY" #6.重签名三方FrameWorks TARGET_APP_FRAMEWORKS_PATH="$TARGET_APP_PATH/Frameworks" for FRAMEWORK in "$TARGET_APP_FRAMEWORKS_PATH/"* do #echo "🍺FRAMEWORK:$FRAMEWORK" /usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK" done
以上就是在项目中使用脚本进行重签名,代码程序也是上面的重签步骤。
今天的iOS应用程序签名以及应用重签名的基本内容和操做,但愿对你们有所帮助,谢谢阅读!!!
原文出处:https://www.cnblogs.com/guohai-stronger/p/11781249.html