声明:此文章仅是学术探讨类文章,仅仅用于学习研究,也请读者不要用于商业或其他非法途径上,否则一律与笔者无关。
App签名:
为了确保安装到手机上的应用是经过认证的合法应用,以期能够根据应用得知其发布者,苹果制定了一个签名机制,所有的安装到设备中的应用必须拥有一个合法的应用。在正向开发中,若是个人开发者,需要购买个人证书或者使用苹果的个人账号免费证书,若是企业开发者则需要购买企业证书。在App Store 上架的应用都有苹果证书签名。
概述:
在正向开发中,通常会直接配置Xcode的签名,而不会深究。但是在逆向中,常常需要对应用进行修改,这就破解了应用本身的签名。所以,需要重新签名了才能将应用安装到非越狱的手机上,而在越狱手机上可以使用插件绕过签名验证。因此,我们需要了解签名的原理,从而更好的实现重签名。
签名原理
1.代码签名
代码签名是对可执行文件或脚本进行数字签名.用来确认软件在签名后未被修改或损坏的措施。和数字签名原理一样,只不过签名的数据是代码而已。
苹果手机:公钥
App Store:私钥
1.App上传到App Store时,苹果公司拿到App的HASH(MD5,SHA等)值,然后用私钥进行加密(签名),这时候只有手机上的公钥才可以解密;
2.手机下载应用安装App时,先用公钥解密(验证签名),拿到HASH值,然后将此HASH值,与要安装的App的HASH值进行校验,如果App有被修改过,则校验失败。这样就可以有效的保证每个App都是经过苹果公司官方认证的。
2.双层代码签名
为了实现苹果验证应用的一些需求,iOS签名的复杂度也就开始增加了,苹果给出的方案是双层签名。
mac电脑:私钥M和公钥M(电脑生成)
苹果服务器:私钥A
iPhone手机:公钥A
1.在Mac系统中生成非对称加密算法的一对公钥\私钥(你的Xcode帮你代办了).这里称为公钥M 私钥M . M = Mac
2.苹果自己有固定的一对公私钥,跟之前App Store原理一样,私钥在苹果后台,公钥在每个iOS系统中.这里称为公钥A , 私钥A. A=Apple
3.把公钥M 以及一些你开发者的信息,传到苹果后台(这个就是CSR文件),用苹果后台里的私钥 A 去签名公钥M。得到一份数据包含了公钥M 以及其签名,把这份数据称为证书。
4.在开发时,编译完一个 APP 后,用本地的私钥 M(今后你导出的P12) 对这个 APP 进行签名,同时把第三步得到的证书一起打包进 APP 里,安装到手机上。
5.在安装时,iOS 系统取得证书,通过系统内置的公钥 A,去验证证书的数字签名是否正确。
6.验证证书后确保了钥 M 是苹果认证过的,再用公钥 M 去验证 APP 的签名,这里就间接验证了这个 APP 安装行为是否经过苹果官方允许。(这里只验证安装行为,不验证APP 是否被改动,因为开发阶段 APP 内容总是不断变化的,苹果不需要管。)
弊端:只要申请一个证书,就可以安装在所有的iOS设备。
最终签名原理:
mac电脑:私钥M和公钥M(电脑生成)
苹果服务器:私钥A
iPhone手机:公钥A
苹果为了解决应用滥用的问题,所以苹果又加了两个限制.
第一限制在苹果后台注册过的设备才可以安装.
第二限制签名只能针对某一个具体的APP.
并且苹果还想控制App里面的iCloud/PUSH/后台运行/调试器附加这些权限,所以苹果把这些权限开关统一称为Entitlements(授权文件).并将这个文件放在了一个叫做Provisioning Profile(描述文件)文件中.
描述文件是在AppleDevelop网站创建的(在Xcode中填上AppleID它会代办创建),Xcode运行时会打包进入APP内.所以我们使用CSR申请证书时,我们还要申请一个东西!! 就是描述文件!
在开发时,编译完一个 APP 后,用本地的私钥M对这个APP进行签名,同时把从苹果服务器得到的 Provisioning Profile 文件打包进APP里,文件名为embedded.mobileprovision,把 APP 安装到手机上.最后系统进行验证。
一旦改变了应用的二进制文件,或者增加或者修改了应用里的资源,应用本身的签名就会被破坏。如果想将修改的文件安装到手机上,就需要对应用重新进行签名。
iOS应用有正版应用(为破壳),越狱应用(破壳)。
非越狱手机我们可以通过PP助手获取破壳后的越狱应用。
在越狱手机上我们可以通过工具对app store中的应用就行破壳。
工具有:
dumpdecrypted
Clutch
frida-ios-dump
本篇文章以非越狱手机的环境为主。越狱手机的工具使用可以网上查询,或者后续会写一篇相关文章。
我们今天介绍三种重签名方法:
1.手动重签名
2.Xcode重签名
3.shell脚本重签名
准备工作:
1.PP助手下载好的越狱应用,解压ipa包解压得到Payload。
2.可以自己破壳得到的ipa包解压得到Payload。
1.手动重签名具体操作如下:
(1).终端cd Payload目录下
(2).终端命令查看应用是否为一破壳。(我们下载的是越狱版,一定是破壳的)
将Payload中的WeChat可执行文件拷贝到Payload同级目录下执行一下命令
命令:otool -l WeChat | grep crypt
加密标识为0,代表没有加密(因为已经砸壳了)两个标识代表这个可执行文件支持两个架构arm64、armv7
(3).终端命令查询签名情况:codesign -vv -d WeChat.app(xxxxx.app)
(4).终端命令搜索本机证书:security find-identity -v -p codesigning
可以使用免费的个人账号即苹果ID。
(5).删除Sign.app包中不可重签的文件:Plugins和Watch文件
(6).进入Sign.app包内,对Framework文件夹下的所有framework进行重签名。每一个framework都要重签名,也就是说有几个framework就执行几次下面的语句。这里的证书也是上面拷贝和xcode选择的证书。
codesign -fs "iPhone Developer: xxx (XXXX)" xxx.framework
(7).使用chmod命令修改Sign.app中的可执行文件权限(可执行文件为二进制文件,默认为可执行权限)
chmod 777 app的二进制文件
或者
chmod +x app的二进制文件
(8).新建一个xcode工程,选择证书,然后真机运行一下或者Build,生成描述文件,然后找到APP包,右键显示包内容,拷贝出其中的embedded.mobileprovision描述文件留着备用。
(9).查看刚才拷贝的描述文件信息,复制entitlements下面的内容
security cms -D -I embedded.mobileprovision
(10).新建entitlements.plist文件,并把上面那一段复制进去。然后保存该文件,将该文件复制到Sign.app的同级目录。
(11).在Sign.app找到info.plist,并修改其中的BundleId为manualTest的BundleId
(12).进入Payload目录对步骤9中的WeChat.app 使用新的描述文件进行重签
codesign -fs 「证书串」 --no-strict --entitlements=entitlements.plist xxx.app
(13).查看重签名是否成功,重复步骤2。可以看到从腾讯变成我个人账号信息,重签名成功。
(14).压缩Playload,更改后缀为.ipa包,即可以通过Xcode,PP助手,iTunes等安装。
a.如果闪退,删除应用,先运行一遍上面创建的项目,然后在手机设置 通用 信任一下描述文件,再安装生成的ipa包。
b.如果还闪退,请尝试下面使用xcode重签名方法。
安装成功后即可在你的设备上看到2个微信了
总结手动重签名步骤:
(1).终端cd Payload目录下
(2).终端命令查看应用是否为一破壳
(3).终端命令查询签名情况
(4).终端命令搜索本机证书
(5).删除WaChat.app中不可重签的文件
(6).重签名framework
(7).授权可执行文件
(8).拷贝embedded.mobileprovision描述文件
(9).查看embedded.mobileprovision描述文件,复制entitlements下面的内容
(10).新建entitlements.plist文件,粘贴entitlements下面的内容
(11).在WeChat.App找到info.plist,并修改其中的BundleId为textAPP的BundleId
(12).进入Payload目录对步骤9中的WeChat.app 使用新的描述文件进行重签
(13).查看重签名是否成功,重复步骤2。可以看到从腾讯变成我个人账号信息,重签名成功。
(14).压缩Playload,更改后缀为.ipa包,即可以通过Xcode,PP助手,iTunes等安装。
2.Xcode重签名
a.重复手动签名中(1)~(7)步骤。拷贝出(7)步骤完成后的,Sign.app备用(xx.app)。
b.新建项目,工程名要和需要重签名的xx.app名一直,这里我们创建的工程为SignAPP。
将1步骤中的SignAPP.app中Info.plist文件内BundleId 改为新建项目的BundleId,保存备用。
c.选择好证书真机运行一下或者Build一下新的项目,会根据证书生成app包文件,在手机中配置app证书权限 设置-通用-描述文件与设备管理-个人苹果ID-信任应用(验证app)
Show in Finder 查看新建项目的App包并且替换为步骤b保存的WeChat.app包。
d.运行项目,重签名成功。
Xcode 重签名总结
a.重复手动中的如下步骤
(1).终端cd Payload目录下
(2).终端命令查看应用是否为一破壳
(3).终端命令查询签名情况
(4).终端命令搜索本机证书
(5).删除WaChat.app中不可重签的文件
(6).重签名framework
(7).授权可执行文件
b.创建同名项目。
c.替换xx.app包
d.运行。
3.shell脚本重签名
1.shell脚本。
# ${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
2.新建工程"shell",在工程目录下新建APP文件夹放置需要重签名的ipa包,同时脚本复制到根目录。
3.Xcode的Build Phases中添加脚本
4.运行项目,成功后会看到又多出一个Sign.app。
注意:自己写的demo 来做脚本重签名,那么这里的.ipa包不能直接压缩demo的xxx.app文件,需要新建一个Payload文件夹,将xxx.app拷贝进去,压缩Payload文件并且更改为Payload.ipa在放入APP文件夹中,否则会提示如下错误:
若果出现如下错误,删除app重新运行。
如果运行这个脚本报错,需要给这个脚本执行权限
chmod +x 脚本文件名称
补充:现今已经有很多重签名工具,都是封装了上述的方法,下面介绍两款可视化工具和一款Xcode 插件。
可视化重签名工具有:
Xcode 插件:MonkeyDev
可以使用Xcode开发CaptainHook Tweak、Logos Tweak 和 Command-line Tool,在越狱机器开发插件,这是原来iOSOpenDev功能的迁移和改进。
只需拖入一个砸壳应用,自动集成class-dump、restore-symbol、Reveal、Cycript和注入的动态库并重签名安装到非越狱机器。
支持调试自己编写的动态库和第三方App
支持通过CocoaPods第三方应用集成SDK以及非越狱插件,简单来说就是通过CocoaPods搭建了一个非越狱插件商店。
这是一款逆向神器,感兴趣的朋友可以去GIthua中查看一下使用方法。
Xcode安装ipa方法