iOS应用重签名

说到iOS重签,那么就应该了解iOS正常签名流程是什么,然后才能知道,我们重签名从哪几个地方入手。

iOS签名

代码签名:
什么是代码签名,很简单,代码签名就是对可执行文件或脚本进行数字签名(对加密的内容进行hash算法得到hash值,然后再用RSA)。用来确认软件在签名后未被修改或损坏的措施。和数字签名原理一样,只不过签名的数据是代码而已。
那为什么要用代码签名呢,因为在p时代早期,主流的操作系统(Mac/Windows)软件在哪里都可以下到,导致系统安全存在严重隐患,盗版软件,病毒,静默安装等等,因此苹果公司想解决这个问题,他们就想到了一办法,就是将即将安装到设备的软件通过苹果官方服务器进行认证,然后设备从苹果官方服务器下载软件,然后就可以安装到设备上了,这样就避免了那些安全隐患所带来的问题,那么苹果里面具体做了哪些事情呢。
大家都知道,苹果有应用商店,那里面有很多APP,然后苹果设备可以通过这个应用商店来下载软件,到手机或者电脑上,这个就是APP Store,也就是上面所提到的苹果官方服务器,在这个过程中,苹果服务器会用非对称加密算法进行应用程序签名(用服务器端的私钥),然后iOS设备或者Mac设备用本地的公钥来对应用程序进行验证,看看是否被在传输的过程篡改过,如果没有篡改过的,就直接安装成功到设备上 了,但这是远远不够的,因为,苹果除了不同用户,还有很多的开发者,开发者在开发的时候,需要调试,而且苹果还开放了企业级,这样一来,有很多app还是可以通过非appstore渠道,安装到设备上,因此苹果就设计出了更复杂的签名方式,双层签名。下面我们来看看双层签名的流程
如图:


iOS应用重签名_第1张图片
双层签名流程图.png

开发者在开发的时候,会通过一个CSR文件到苹果服务器,去申请一个叫证书的东西,生成的证书里面包含Mac电脑的公钥和对公钥hash算法之后的hash值,然后将整个证书放到我们即将生成的APP中,在这个过程中,我们还有用Mac电脑端的私钥,对我们生成的APP的可执行文件进行加密,生成APP的签名,当我们的APP安装到iPhone上的时候,使用iPhone设备上苹果给我们准备好的公钥A,对证书进行解密,拿到里面的公钥和对应hash值,然后用hash对公钥进行验证,如果验证通过之后,在用验证过的公钥对APP的签名进行解密,如果能解密成功,可执行程序就解压成功,就可以安装到iPhone设备上,如果其中任何一步出错,都不会安装成功。
现在这个结构已经很好了,但是这样远远不够,因为每个app开发过程中,少不了要安装到设备上,那么不能让开发者无限制的安装到任何设备,要有一定的限制,还有除了设备数量之外,还有对设备的各个设备功能访问权限,还有你的开发者账号的校验,这些证书里面都没有,为了更加完善校验的功能,因此苹果公司有增加了一个设备描述文件,这个文件里面就是包含设备列表、AppleID、还有权限文件,这样APP安装到设备上之后,就会更加安全的保护设备,下图就是现在苹果公司正在使用的整个APP签名过程,如图:


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

这里,申请证书的时候,还会去给你一个对应的描述文件,我们在用xcode打包ipa的时候,证书放到描述文件中,然后将描述文件安装到APP中。
以上流程就是整个iOS签名的过程。通过对这个签名原理,我们就可以对其他程序进行重签,但是这个从APP Store上的ipa,是不可以进行重签的。下面我们来看iOS 重签名实现

ios重签名

重签名,其实原理很简单,根据上面签名的原理,重签名,就是把别人的app用我们的壳子来加密,从而,可以安装到设备上,下面来看看重签名的步骤
1、删除插件和带有插件的.app包(比如Watch)
2、对Frameworks里面的库进行重签名
3、给可执行文件+x权限
4、添加描述文件(分手动和自动,自动:新建工程,真机编译得到)
5、替换BundleID
6、通过授权文件(Entilements)重签.app包
以上是重签步骤,下面我们具体该怎么操作
手动:
下载任何越狱后的ipa,然后通过解压缩,找到Payload里面的app,然后显示包内容,在这个包里面可以找到PlugIns文件夹,因为插件不能被签名,所以,直接干掉,干掉完PlugIns这个文件夹后,有没有其他app包包含PlugIns这个文件夹的,一般都在Watch app里面,我们直接把Watch干掉。
好接下来就是Frameworks里面的Framework进行重签,使用的命令为:

codesign -fs "iPhone Developer: [email protected] (xxx)" xxx.framework/

通过上述命令将ipa中的frameworks文件中的每个framework进行重签。重签之后
对MachO文件进行权限设置

chmod +x 可执行文件路径

给完权限之后,去新建一个工程,用你的appid开发者账号,然后编译,在Products文件夹下,有个我们自己的app,然后show in finder,显示包内容,将里面的描述文件拷贝出来,拷贝到第三方的app包里面去,就直接显示包内容,copy进去就可以了,接下来将自己的BundleID修改进第三方info.plist中
,接下就是利用Entitlements来重签第三方ipa了,在新建的工程中,新建一个entitlemenst的plist文件,然后将拷贝进第三方app包里面的描述文件用过终端命令打开

security cms -D -i xxxx.mobileprovision

在终端中找到Entitlements这个字段,将下面的字典value全部拷贝,拷贝到entitlements.plist中,然后再将entitlements这个plist文件拷贝到第三方app文件夹中去,好一起都准备就绪,使用命令,对可执行文件进行签名

codesign -fs "iPhone Developer: [email protected] (xxx)" --no-strict --entitlements=entitlements.plilst xxx.app

这样就签名成功,成功之后,再对签名后的app进行打包,打包成ipa,命令为:

zip -ry xxx.ipa Payload

这样执行完,ipa也就成功了,直接安装到手机上就可以运行了。这是手动操作,那自动又是怎么回事呢,自动代表的意思就是利用xcode帮我进行描述文件的生成,怎么做呢,很简单,将步骤1~3 还有第5个步骤,编写成shell,然后在这个地方:


iOS应用重签名_第3张图片
设置.png

点击New Run Script Phase,添加一个脚本:


iOS应用重签名_第4张图片
脚本.png

这样在程序一编译的时候,就会运行这个脚本。自动重签就完成了,很简单,因为描述文件的流程xcode都已经帮我做了,所以我们不用管描述文件的操作。

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