3.应用签名及重签名技术

代码签名

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



3.应用签名及重签名技术_第1张图片

1.在mac 电脑中首先会生成一对公钥M、私钥M(从钥匙串申请的是M ,这个是包含在csr文件中的,因为开发者需要开发和调试应用),在App Store中存在一个私钥A,在iphone手机中存在一个公钥A

2.xcode通过CSR文件向苹果服务器请求证书、描述文件(描述文件中包含了证书),CSR文件中包含一个公钥M

3.苹果服务器对收到的CSR文件中,用私钥A 对公钥M 进行非对称加密,加密并签名后得到一个证书(包含公钥M 和hash值,这就是开发者证书),私钥M与证书进行绑定 ——> p12

4.通过私钥M对APP进行签名加密,只要工程被build过就签名了 

5.APP中包含 macho文件、签名、证书,一起打包后安装到手机上

6.iOS操作系统验证APP包,用公钥A解密证书,解密成功后才能安装。 用公钥A解密证书得到公钥M然后验证签名,即可判断这个证书是否为苹果允许的。

7. App Store安装的应该用直接用私钥A钥匙配对,不需要描述文件了

描述文件

苹果为了解决应用滥用的问题,所以苹果又加了两个限制.

1.第一限制在苹果后台注册过的设备才可以安装.

2.第二限制签名只能针对某一个具体的APP.

并且苹果还想控制App里面的iCloud/PUSH/后台运行/调试器附加这些权限,所以苹果把这些权限开关统一称为Entitlements(授权文件).并将这个文件放在了一个叫做Provisioning Profile(描述文件)文件中. 描述文件是在AppleDevelop网站创建的(在Xcode中填上AppleID它会代办创建),Xcode运行时会打包进入APP内.所以我们使用CSR申请证书时,我们还要申请一个东西!! 就是描述文件!

在开发时,编译完一个APP后,用本地的私钥M对这个APP进行签名,同时把从苹果服务器得到的Provisioning Profile 文件打包进APP里,文件名为embedded.mobileprovision,把 APP安装到手机上.最后系统进行验证。

描述文件所在目录

~/资源库/MobileDevice/Provisioning Profiles/

在mac电脑中有一份描述文件,同时在APP 包中也有一份描述文件,其本质就是个plist文件

查看描述文件

$ security cms -Di embedded.mobileprovision

3.应用签名及重签名技术_第2张图片


3.应用签名及重签名技术_第3张图片

权限

_CodeSignature ——>CodeResources 文件是 资源文件的签名

应用签名 信息,在macho文件中的,Code Signature


应用重签名

用codesign进行签名


pp助手下载越狱应用后,解压缩

查看应用的签名信息

$ codesign -vv -d WeChat.app

列出钥匙串里可签名的证书

$ security find-identity -v -p codesigning

查看macho文件的信息

$ otool -l WeChat

重定向到桌面查看macho文件的信息

$ otool -l WeChat > ~/Desktop/wechat.txt

通过管道输出符筛选 cryptid 信息

$ otool -l WeChat | grep cry



3.应用签名及重签名技术_第4张图片

cryptid 加密的id, 0代表没有加密,1是加密了(加密的标识id,是App Store加密的),此加密的过程是对称加密的,因为加密的数据量大(整个应用包),加密的效率高,在iPhone运行时解密(如果是安装时加密,会造成越狱手机安装后将安装包拷贝出来就解密了),在内存中解密

将下载的APP包安装到手机

3.应用签名及重签名技术_第5张图片


3.应用签名及重签名技术_第6张图片

未重签名的是安装不上的


重签步骤

1.删除插件和带有插件的.app包(比如Watch文件夹、 PlugIns文件夹)

2.对Frameworks里面的库进行重签名,示例

$ codesign -fs "新的证书" marsbridgenetwork.framework

3.给可执行文件+x(可执行)权限 ,例

$ chmod +x WeChat

4.添加描述文件(新建工程,真机编译得到,拷贝进去)

5.替换BundleID

6.通过授权文件(Entilements)重签.app包

将  段拷贝出来,在项目中新建一个plsit,可命名为 ent.plist   ,然后showinfinder ,拷贝到app包的目录下,即可替换签名

$ codesign -fs "证书名字" --no-strict --entitlements=ent.plist Wechat


用Xcode重签名

1.删除插件和带有插件的.app包(比如Watch文件夹、 PlugIns文件夹)

2.对Frameworks里面的库进行重签名

就好了,不需要改BundleID和权限文件,直接运行就好了

注意:如果工程名称不同是不成功的,必须是同名工程

查看当前运行的MachO文件

打上断点,输入 image list  , 如果直接替换MachO文件的名称,会报不知名的错误

3.应用签名及重签名技术_第7张图片


SHELL脚本

mac电脑中默认的shell是bash, (最新的mac系统的默认是zsh)

打开的过程有配置环境变量的过程 ,bash在启动的时候就会加载一个文件,配置这个环境变量,bash的环境变量配置文件的路径在 $ cd ~/  ,然后 $  ls -la ,在Linux系统下".XX",点开头的文件是代表隐藏文件,只要启动bash就会加载 .bash_profile 文件


3.应用签名及重签名技术_第8张图片

$ cat ~/.bash_profile

只要在这里面的路径下面的,在任何地方都可以敲出来

如果把bash换成了zsh,配置的环境就失效了

这时 $ cat ~/.zshrc

可以添加 #加载bash配置 : source /Users/.bash_profile

如果需要切换到bash的话: 

$ cd /bin ( cd 到 bin)

$ open .   (打开这个目录)


3.应用签名及重签名技术_第9张图片

然后 $ chsh -s /bin/bash  (输入密码后,重新打开,就切换回来了)

你可能感兴趣的:(3.应用签名及重签名技术)