iOS 应用签名原理&重签名

在苹果的日常开发中,真机测试与打包等很多流程都会牵扯到各种证书,CertificateSigningRequest,p12等。但是很多相应的开发者并不理解iOS App应用签名的原理和流程。今天着重讲解一下此内容。

思考

在苹果的iOS系统出来之前,以前的主流程Mac OS/Window软件存在着安全隐患,盗版软件,病毒入侵等,苹果希望能解决类似的问题,保证每一个安装在苹果手机上的app都是经过苹果官方允许的,怎么保证呢?

一、iOS 应用签名原理

1 代码签名

要想回答上面“思考”的答案,首先我们讲解一个概念。代码签名:是对可执行脚本或者文件进行数字签名,用来保证软件在签名后未被损害或者修改的措施。

2 简单的代码签名

最简单的验证方式是通过苹果官方生成非对称加密的一对公私钥。私钥保存在Appstore的服务器,而公钥保存在iOS系统中,苹果后台用私钥来对App数据进行签名,iOS系统下载此APP后,用公钥来验证签名。若验证成功,说明该App未被更改,可以安装到手机中,反之,则不行。

上面的验证可以解决大部分App入驻手机中的场景,但是对于我们开发苹果应用的开发者而言,我们也可以直接通过真机测试进入到用户的手机,而且苹果也有企业用户渠道,所以如果想要全方面的安全的安装苹果App,就无法通过简单的代码签名做到,那么苹果又是通过怎样的方案呢?

3 双层签名

下面流程图

解释如下:

  1. 首先Mac电脑通过CSR文件申请证书(通过公钥M)
  2. 苹果服务器返回公钥M以及公钥M算出的哈希值(也就是签名)
  3. App包里包括可执行文件MachO,然后对MachO通过私钥M签名(App签名)并将证书放到App中
  4. 然后将App放入到iphone中。首先将App中的证书拿出来解析,谁能解析App的证书,因为App的证书是由苹果服务器拿着私钥A中进行加密的,也只有公钥A能解密出来,也就是iphone中保存的公钥A,通过验证查看App是否被修改;然后再去验证App的签名,怎么验证App的签名呢,(App签名是通过Mac 电脑的私钥M进行加密的,也只有证书中的公钥M进行解密)就这样经过了两层验证!

通过上面的讲解,是不是发现特别的安全了?其实不然,因为大部分的应用都是通过AppStore进行安装,如果通过上面的过程可以安装所有的苹果设备,那么还需要要Appstore干嘛,这时候苹果防止滥用App,就做了两条限制:

  1. 经过苹果服务器中注册过的设备
  2. 签名只能具体到某一个App进行签名(推送,授权等)

经过上面的讲解,也引出了另一个概念-描述文件。

4 描述文件

描述文件又称为Provisioning profile,一般包括了三样东西:

  1. 证书
  2. AppId
  3. 设备

当我们打包或者是真机运行的时候,通过证书来验证程序的安全性和合法性。

并且在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包?

  1. 助手里面下载
  2. 越狱手机里面进行拷贝
  3. 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.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

时间: 2024-11-10 11:34:43

iOS 应用签名原理&重签名的相关文章

IOS苹果应用IPA重签名软件手机版(苹果重签名,企业签名,安卓苹果平台,时间控制)

软件简介 IOS苹果应用IPA重签名软件手机版,可以在安卓或者苹果手机上,苹果应用IPA文件重新签名,无需MAC苹果电脑和配置XCODE开发环境,便可以直接对IPA文件进行签名,签名在本地进行,不消耗流量,同时支持修改BundleID, 不受描述文件中的BundleID限制,使用简单方便. 本软件为安卓苹果手机版本,如果需要PC版本,请查看PC版打包软件 http://www.krpano.tech/archives/1026 交流群:692727447 最新版软件下载地址: 待发布,加群获取最

iOS -- 最简单的重签名方法

参考自:http://iosre.com/t/topic/2966 1.安装好brew,先用brew安装ruby,然后用gem安装sigh.(见图) 终端运行:brew install ruby 然后运行:sudo gem install sigh 2.上边两步安装的执行一次就可以 然后终端运行  sigh resign ,回车 接下来需要输入的三个路径分别对应的是 ipa文件路径   钥匙串里面证书的名称  .mobileprovision文件 第一个就是ipa文件路径,没什么可说的 拖到终端

apk签名原理

apk签名原理 APK签名机制原理详解https://blog.csdn.net/zwjemperor/article/details/80877203 apk签名原理及实现https://blog.csdn.net/jcgu/article/details/12745363 Apk去掉签名以及重新签名的方法https://blog.csdn.net/s13383754499/article/details/84108475 原文地址:https://www.cnblogs.com/111tes

iOS逆向之利用Xcode重签名

iOS逆向之利用Xcode重签名 准备工作 非越狱的iPhone手机 用PP助手下载: 微信6.6.5(越狱应用) 步骤 新建工程"Xocde重签名",选择开发证书,在真机上运行 解压微信6.6.5(越狱应用).ipa,在微信-6.6.5(越狱应用)->Payload下,将WeChat.app改名为Xocde重签名.app 在Products->Xcode重签名上右击show in finder 将第2步的Xocde重签名.app拷贝过来,替换. *以下几个步骤可以参考上一

ios第三方ipa重签名以及xcode附加调试

先dump出ipa,解压出app然后查看是否加密(加壳),如图所示.0表示没有加密.打开包,查看有多少frameworks,因为这些全部要签名的.查看自己的证书信息.security find-identity -v -p codesigning一个个签名.codesign -fs "iPhone Developer:xxxxxxx" libswiftAVFoundation.dylib然后用xcode新创建一个项目生成.打开项目包.拷贝描述文件到要重签名的app下面.然后修改重新签名

非越狱环境下从应用重签名到微信上加载Cycript

从零到一,非越狱环境下iOS应用逆向研究,从dylib注入,应用重签名到App Hook.文中用到的工具和编译好的dylib可在Github上下载. 注意!本文所有操作均在以下环境下成功进行,不同平台或环境可能存在某些问题,欢迎大家在issue中提出问题以及相互讨论. Mac OS X 10.11.6 (15G12a) Xcode 7.3.1 (7D1014) iPhone 5s, iOS 9.3.3 (13G21) 免费开发者账号 示例App:微信 v6.3.19.18 前言 提到非越狱环境下

漫谈iOS程序的证书和签名机制

原文:漫谈iOS程序的证书和签名机制 接触iOS开发半年,曾经也被这个主题坑的摸不着头脑,也在淘宝上买过企业证书签名这些服务,有大神都做了一个全自动的发布打包(不过此大神现在不卖企业证书了),甚是羡慕和崇拜.于是,花了一点时间去研究了一下iOS这套证书和签名机制,并撰文分享给需要的朋友.由于本人才疏学浅,多有遗漏或错误之处,还请大神多多指教. 非对称加密和摘要 非对称加密的特性和用法 非对称加密算法可能是世界上最重要的算法,它是当今电子商务等领域的基石.简而言之,非对称加密就是指加密密钥和解密密

ipa重签名

为什么要研究重签名问题? 将程序打包成ipa包后,ipa包中会包括Provisioning Profile和_CodeSignature等文件,里面包括了对整个ipa的签名信息.一旦改动ipa中的任何内容,例如增加一个头文件,签名就会失效,导致ipa无法安装.(貌似改变Info.plist是不影响的) 因此,如果要通过修改ipa包中的内容来得到篡改信息或注入代码的话,就需要解决ipa包的重签名问题. 准备 在重签名之前要做一些准备工作. 1.首先要下载并安装Xcode,里面有个codesign_

Android反编译(三)之重签名

Android反编译(三) 之重签名 [目录] 1.原理 2.工具与准备工作 3.操作步骤 4.装X技巧 5.问题 1.原理 1).APK签名的要点 a.所有的应用程序都必须有数字证书 ,Android系统不会安装一个没有数字证书的应用程序: b.Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证: c.数字证书都是存在有效期的,Android只是在应用程序安装的时候才会检查证书的有效期.如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能. d.A