iOS 重签名

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

App签名:

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

概述:

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

签名原理

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

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

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

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

2.png

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

3.png

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

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

4.png

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

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

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

111566869284_.pic_hd.jpg

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

chmod 777 app的二进制文件

或者

chmod +x app的二进制文件

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

8.png

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

security cms -D -I embedded.mobileprovision

121566869829_.pic_hd.jpg

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

9.png

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

10.png

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

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

11.png

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

12.png

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

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

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

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

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

WechatIMG10.png

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

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

WechatIMG14.png

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

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

131566872544_.pic.jpg

3.Xcode的Build Phases中添加脚本

image
image

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

WechatIMG10.jpeg

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

121566551942_.pic_hd.jpg

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

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 - 简书

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容

  • 最近有朋友需要帮忙用公司企业证书打包企业内侧应用,经过本人搜集、采坑,目前最简单、可靠地重签名解决方案(企业证书可...
    歌白尼阅读 9,157评论 17 16
  • 一.理解iOS签名机制 网上有很多资料,这里不展开细说,重点参考这三篇文章: https://www.objccn...
    huig游影阅读 1,044评论 0 1
  • 一.理解iOS签名机制 网上有很多资料,这里不展开细说,重点参考这三篇文章: https://www.objccn...
    huig游影阅读 1,217评论 0 0
  • 001你对一件事有怎样的看法,决定着你会收获什么样的结果。 曾经有3个兄弟在建筑工地砌墙。此时有个人走过来,问他们...
    tyj芯愿成真阅读 90评论 0 0
  • 本文大量参考Thinking in java(解析,填充)。 定义:多态算是一种泛化机制,解决了一部分可以应用于多...
    谷歌清洁工阅读 456评论 0 2