iOS 重签名

声明:此文章仅是学术探讨类文章,仅仅用于学习研究,也请读者不要用于商业或其他非法途径上,否则一律与笔者无关。

App签名:

  为了确保安装到手机上的应用是经过认证的合法应用,以期能够根据应用得知其发布者,苹果制定了一个签名机制,所有的安装到设备中的应用必须拥有一个合法的应用。在正向开发中,若是个人开发者,需要购买个人证书或者使用苹果的个人账号免费证书,若是企业开发者则需要购买企业证书。在App Store 上架的应用都有苹果证书签名。

概述:

  在正向开发中,通常会直接配置Xcode的签名,而不会深究。但是在逆向中,常常需要对应用进行修改,这就破解了应用本身的签名。所以,需要重新签名了才能将应用安装到非越狱的手机上,而在越狱手机上可以使用插件绕过签名验证。因此,我们需要了解签名的原理,从而更好的实现重签名。

签名原理

1.代码签名
代码签名是对可执行文件或脚本进行数字签名.用来确认软件在签名后未被修改或损坏的措施。和数字签名原理一样,只不过签名的数据是代码而已。

苹果手机:公钥
App Store:私钥

1.App上传到App Store时,苹果公司拿到App的HASH(MD5,SHA等)值,然后用私钥进行加密(签名),这时候只有手机上的公钥才可以解密;
2.手机下载应用安装App时,先用公钥解密(验证签名),拿到HASH值,然后将此HASH值,与要安装的App的HASH值进行校验,如果App有被修改过,则校验失败。这样就可以有效的保证每个App都是经过苹果公司官方认证的。

iOS 重签名_第1张图片
image.png

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目录下

1.png

(2).终端命令查看应用是否为一破壳。(我们下载的是越狱版,一定是破壳的)

将Payload中的WeChat可执行文件拷贝到Payload同级目录下执行一下命令

命令:otool -l WeChat | grep crypt

加密标识为0,代表没有加密(因为已经砸壳了)两个标识代表这个可执行文件支持两个架构arm64、armv7

iOS 重签名_第2张图片
2.png

(3).终端命令查询签名情况:codesign -vv -d WeChat.app(xxxxx.app)

iOS 重签名_第3张图片
3.png

(4).终端命令搜索本机证书:security find-identity -v -p codesigning

可以使用免费的个人账号即苹果ID。

iOS 重签名_第4张图片
4.png

(5).删除Sign.app包中不可重签的文件:Plugins和Watch文件

(6).进入Sign.app包内,对Framework文件夹下的所有framework进行重签名。每一个framework都要重签名,也就是说有几个framework就执行几次下面的语句。这里的证书也是上面拷贝和xcode选择的证书。

codesign -fs "iPhone Developer: xxx (XXXX)" xxx.framework

iOS 重签名_第5张图片
111566869284_.pic_hd.jpg

(7).使用chmod命令修改Sign.app中的可执行文件权限(可执行文件为二进制文件,默认为可执行权限)

chmod 777 app的二进制文件

或者

chmod +x app的二进制文件

(8).新建一个xcode工程,选择证书,然后真机运行一下或者Build,生成描述文件,然后找到APP包,右键显示包内容,拷贝出其中的embedded.mobileprovision描述文件留着备用。

iOS 重签名_第6张图片
8.png

(9).查看刚才拷贝的描述文件信息,复制entitlements下面的内容

security cms -D -I embedded.mobileprovision

iOS 重签名_第7张图片
121566869829_.pic_hd.jpg

(10).新建entitlements.plist文件,并把上面那一段复制进去。然后保存该文件,将该文件复制到Sign.app的同级目录。

iOS 重签名_第8张图片
9.png

(11).在Sign.app找到info.plist,并修改其中的BundleId为manualTest的BundleId

iOS 重签名_第9张图片
10.png

(12).进入Payload目录对步骤9中的WeChat.app 使用新的描述文件进行重签

codesign -fs 「证书串」 --no-strict --entitlements=entitlements.plist xxx.app

11.png

(13).查看重签名是否成功,重复步骤2。可以看到从腾讯变成我个人账号信息,重签名成功。

iOS 重签名_第10张图片
12.png

(14).压缩Playload,更改后缀为.ipa包,即可以通过Xcode,PP助手,iTunes等安装。

    a.如果闪退,删除应用,先运行一遍上面创建的项目,然后在手机设置 通用 信任一下描述文件,再安装生成的ipa包。

    b.如果还闪退,请尝试下面使用xcode重签名方法。

安装成功后即可在你的设备上看到2个微信了

iOS 重签名_第11张图片
WechatIMG7.jpeg

总结手动重签名步骤:

(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,保存备用。

iOS 重签名_第12张图片
WechatIMG10.png

c.选择好证书真机运行一下或者Build一下新的项目,会根据证书生成app包文件,在手机中配置app证书权限 设置-通用-描述文件与设备管理-个人苹果ID-信任应用(验证app)

Show in Finder 查看新建项目的App包并且替换为步骤b保存的WeChat.app包。

iOS 重签名_第13张图片
WechatIMG14.png

d.运行项目,重签名成功。

iOS 重签名_第14张图片
WechatIMG9.jpeg

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包,同时脚本复制到根目录。

iOS 重签名_第15张图片
131566872544_.pic.jpg

3.Xcode的Build Phases中添加脚本

iOS 重签名_第16张图片
image
iOS 重签名_第17张图片
image

4.运行项目,成功后会看到又多出一个Sign.app。

iOS 重签名_第18张图片
WechatIMG10.jpeg

注意:自己写的demo 来做脚本重签名,那么这里的.ipa包不能直接压缩demo的xxx.app文件,需要新建一个Payload文件夹,将xxx.app拷贝进去,压缩Payload文件并且更改为Payload.ipa在放入APP文件夹中,否则会提示如下错误:

iOS 重签名_第19张图片
121566551942_.pic_hd.jpg

若果出现如下错误,删除app重新运行。

iOS 重签名_第20张图片
image

如果运行这个脚本报错,需要给这个脚本执行权限


chmod +x 脚本文件名称

补充:现今已经有很多重签名工具,都是封装了上述的方法,下面介绍两款可视化工具和一款Xcode 插件。

可视化重签名工具有:

ResignForiOS

Impactor

Xcode 插件:MonkeyDev

可以使用Xcode开发CaptainHook Tweak、Logos Tweak 和 Command-line Tool,在越狱机器开发插件,这是原来iOSOpenDev功能的迁移和改进。

只需拖入一个砸壳应用,自动集成class-dump、restore-symbol、Reveal、Cycript和注入的动态库并重签名安装到非越狱机器。

支持调试自己编写的动态库和第三方App

支持通过CocoaPods第三方应用集成SDK以及非越狱插件,简单来说就是通过CocoaPods搭建了一个非越狱插件商店。

这是一款逆向神器,感兴趣的朋友可以去GIthua中查看一下使用方法。

Xcode安装ipa方法

Xcode安装ipa -

重要:温馨提示,请不要长时间使用重签名的微信,有封号危险!

重要:温馨提示,请不要长时间使用重签名的微信,有封号危险!

重要:温馨提示,请不要长时间使用重签名的微信,有封号危险!

你可能感兴趣的:(iOS 重签名)