iOS 应用签名原理&重签名
在苹果的日常开发中,真机测试与打包等很多流程都会牵扯到各种证书,CertificateSigningRequest,p12等。但是很多相应的开发者并不理解iOS App应用签名的原理和流程。今天着重讲解一下此内容。
思考
在苹果的iOS系统出来之前,以前的主流程Mac OS/Window软件存在着安全隐患,盗版软件,病毒入侵等,苹果希望能解决类似的问题,保证每一个安装在苹果手机上的app都是经过苹果官方允许的,怎么保证呢?
一、iOS 应用签名原理
1 代码签名
要想回答上面“思考”的答案,首先我们讲解一个概念。代码签名:是对可执行脚本或者文件进行数字签名,用来保证软件在签名后未被损害或者修改的措施。
2 简单的代码签名
最简单的验证方式是通过苹果官方生成非对称加密的一对公私钥。私钥保存在Appstore的服务器,而公钥保存在iOS系统中,苹果后台用私钥来对App数据进行签名,iOS系统下载此APP后,用公钥来验证签名。若验证成功,说明该App未被更改,可以安装到手机中,反之,则不行。
上面的验证可以解决大部分App入驻手机中的场景,但是对于我们开发苹果应用的开发者而言,我们也可以直接通过真机测试进入到用户的手机,而且苹果也有企业用户渠道,所以如果想要全方面的安全的安装苹果App,就无法通过简单的代码签名做到,那么苹果又是通过怎样的方案呢?
3 双层签名
下面流程图

解释如下:
- 首先Mac电脑通过CSR文件申请证书(通过公钥M)
- 苹果服务器返回公钥M以及公钥M算出的哈希值(也就是签名)
- App包里包括可执行文件MachO,然后对MachO通过私钥M签名(App签名)并将证书放到App中
- 然后将App放入到iphone中。首先将App中的证书拿出来解析,谁能解析App的证书,因为App的证书是由苹果服务器拿着私钥A中进行加密的,也只有公钥A能解密出来,也就是iphone中保存的公钥A,通过验证查看App是否被修改;然后再去验证App的签名,怎么验证App的签名呢,(App签名是通过Mac 电脑的私钥M进行加密的,也只有证书中的公钥M进行解密)就这样经过了两层验证!
通过上面的讲解,是不是发现特别的安全了?其实不然,因为大部分的应用都是通过AppStore进行安装,如果通过上面的过程可以安装所有的苹果设备,那么还需要要Appstore干嘛,这时候苹果防止滥用App,就做了两条限制:
- 经过苹果服务器中注册过的设备
- 签名只能具体到某一个App进行签名(推送,授权等)
经过上面的讲解,也引出了另一个概念-描述文件。
4 描述文件
描述文件又称为Provisioning profile,一般包括了三样东西:
- 证书
- AppId
- 设备
当我们打包或者是真机运行的时候,通过证书来验证程序的安全性和合法性。
并且在App的使用中,苹果还想控制App里面的推送/iCloud及后台运行等这些的权限,苹果将这些权限开关统称为授权文件-Entitlements,并将文件放在了描述文件中。
在开发中,编译一个App后,会用本地的私钥M对App进行签名,同时从苹果服务器得到的描述文件打包进App里为embeded.mobileprovision,把App安装在手机中,最后系统进行来验证。
上面的图也会变为如下:流程就是将描述文件加入,解决上面的问题?

5 拓展
首先我们做一个demo讲解App包内容。

- 首先看工程文件1-products文件,点击打开Demo.app,显示包内容,紧接着出现2-内容
- 查看有_Codesignature,是资源文件签名;embedded.mobileprovision是上面说的描述文件;另外我们看下可执行代码,也就是MachO文件,放在了001--Demo中,也就是黑色的一个,通过MachOView中可以查看MachO文件。打开之后,代码签名放在MachO中如下:

也就是Code Signature--代码签名。
但是我们是做逆向开发,所以我们要学会应用重命名!!!
二、iOS 应用重签名
在讲解重签名中,首先学下终端命令:

当我们从AppStore上下载App后,如果做了相应的更改,又怎么会在手机上运行起来呢?这就需要应用重签名,并且Xcode给我们提供了重签名技术-codesign技术。
拓展:我们首先来讲解一下怎么获取应用的ipa包?
- 助手里面下载
- 越狱手机里面进行拷贝
- iTunes下载(12.6.3)
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与描述性文件,就可以在手机上运行。
上面重签名的步骤,可能并不是很清晰,又准备了一个总结如下:

三、拓展
3.1 Shell脚本
Shell脚本为用户提供了启动程序,管理系统的文件以及运行在系统上进程的途径。Shell在开发中一般指命令行工具,它允许输入文本的命令,然后解释命令,最后在内核中执行。Shell脚本,也是用各类命令预先放入到文件中,方便一次性执行的脚本文件。
下面我们用demo方式讲解shell命令:
首先通过命令创建文件夹,并在文件夹下创建“国孩”文本

查看桌面内容如下:
如果想这些命令一次性的执行,可以尝试写一个脚本文件

然后进入到编辑页面,将内容输入进去

最后生成文件如下,也能完成目的

看到上面之后,使用到了bash,除了bash,还有zsh,Source等命令效果都是一样的,怎么查看mac支持哪些呢?
通过cd /private/etc,以及cat shells,

通过上面的都可以满足建立123.txt。
但是上面的各个指令也有一定的区别,如下:

3.2 用户、组、权限
也是以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将IPA解压到Temp下
unzip -oqq "$TARGET_IPA_PATH" -d "$TEMP_PATH"
#.2拿到解压临时的APP路径
TEMP_APP_PATH=$(set -- "$TEMP_PATH/Payload/"*.app;echo "$1")
echo "TEMP:
iOS 应用签名原理&重签名的更多相关文章
- ios .framework动态库重签名
真机上运行.framework时,如果报 dyld'dyld_fatal_error:dyld: Library not loaded: @rpath/XX.framework/XX Referenc ...
- iOS逆向必备绝技之ipa重签名
一.重签名准备工作: 找到开发者证书和配置文件: 列出所有开发者证书文件: security find-identity -p codesigning -v 找一个开发环境配置文件生成entitlem ...
- ipa重签名最直接的教程
ipa 包重签名最新最简单教程 重签名的意义:ipa 重签名最大的用处是,不必重新打包,和配置其它第三方获取 appkey 等操作,直接重签名之后依然可以拥有这些功能,更快的发布测试或者灰度版本. 本 ...
- 用re-sign.jar重签名apk后安装失败的解决办法
问题 打开re-sign.jar,将下载好的apk拖入re-sign.jar的界面进行重签名.重签名成功后,通过adb intall命令安装重签名后的apk文件失败.提示:Failure [INSTA ...
- Android apk签名详解——AS签名、获取签名信息、系统签名、命令行签名
Apk签名,每一个Android开发者都不陌生.它就是对我们的apk加了一个校验参数,防止apk被掉包.一开始做Android开发,就接触到了apk签名:后来在微信开放平台.高德地图等平台注册时,需要 ...
- iOS ipa 重签名 resign
这篇关于codesign的文章不错 https://www.objccn.io/issue-17-2/ 英文原文:https://www.objc.io/issues/17-security/insi ...
- iOS逆向开发(0):修改二进制代码与重签名 | hopper | codesigh
小白:小程,你知道有些iOS程序是没人性的吗?老是不按我的意愿来运行! 小程:我怎么知道你的意愿就是有人性的? 本文解决一个问题:修改别人的二进制程序并运行起来. 让别人的程序按你的意愿来运行,文明一 ...
- iOS app签名原理
基本原理: 公钥能够验证私钥的签名是否正确. Apple后台有一个私钥A,iOS内置一个公钥A,与私钥A对应.(A:代表Apple,即苹果) 本地产生一对公钥L.私钥L,(L:代表Local,即本地) ...
- iOS ipa包重签名
背景:公司做游戏SDK的,提供SDK给第三方后,他们打包过来我们需要分发在不同的渠道,这个时候需要修改SDK的配置文件,ipa文件修改后是需要手机越狱或者ipa重签名才能安装成功的,所以研究了一下重签 ...
随机推荐
- Android系统开发实务实训
实训项目 : Android系统开发实务实训 项目成品名称: 绝地坦克 ...
- 面试官:都说阻塞 I/O 模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?
摘要: 原创出处 https://studyidea.cn 「公众号:程序通事 」欢迎关注和转载,保留摘要,谢谢! 使用 Java 阻塞 I/O 模型读取数据,将会导致线程阻塞,线程将会进入休眠,从而 ...
- 代理(Proxy)设计模式
目录 概述 静态代理 UML类图 代码实现 代码地址 静态代理的不足 动态代理之jdk实现 UML类图 代码实现 利用JDK实现动态代理的优点 利用JDK实现动态代理的不足 代码地址 动态代理之cgl ...
- malformed header from script. Bad header的解决方法
今天配了CGI服务器,打开CGI报错: [Wed Jun 02 13:57:21 2010] [error] [client 192.168.0.1] malformed header from sc ...
- Scala Eclipse org.eclipse.e4.workbench异常奔溃修复
Scala Eclipse org.eclipse.e4.workbench异常奔溃修复: 找到<workspace>/.metadata/.plugins/org.eclipse.e4 ...
- 使用Newspaper3k框架快速抓取文章信息
一.框架介绍 Newspaper是一个python3库,但是Newspaper框架并不适用于实际工程类新闻信息爬取工作,框架不稳定,爬取过程中会有各种bug,例如获取不到url.新闻信息等,但对于想获 ...
- docker镜像制作必备技能
正文 使用过docker的都知道dockerfile,其用于定义制作镜像的流程,由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像.可参考往期文章学习:docker基础知识整理 ...
- 网页布局——Box盒子
在移动端开发的时候,圣杯布局,弹性盒,是我们经常会用得到的,W3C很久以前就有一个display:box属性 flex是最新的,但是在实际的浏览器测试中,display: flex 不能完全替代dis ...
- python编程基础之三十三
构造方法: 目的:构造方法用于初始化对象,可以在构造方法中添加成员属性 触发时机:实例化对象的时候自动调用 参数:第一个参数必须是self,其它参数根据需要自己定义 返回值:不返回值,或者说返回Non ...
- Java中冒泡排序法的代码实现方法之一
主要运用双层for循环嵌套,进行冒泡排序 public class BubbleSortTest { public static void main(String[] args) { int[] ar ...