iOS逆向 应用重签名+微信重签名实战

写在前面

应用重签名(本文涉及)无风险,但某信有检测BundId机制,建议不要大号登陆算法

1、代码签名

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

1.简单的代码签名

1.苹果官方生成一对非对称加密的公私钥,在iOS的系统中内置一个公钥,私钥由苹果后台保存;

2.开发者上传App到App Store时,苹果后台用私钥对App数据进行签名(即先进行Hash获得hash值,再用私钥加密hash值获得“RSAHash”);安全

3.iOS系统下载这个App后,用内置的公钥验证这个签名,若签名正确,那么这个App确定是由苹果后台认证的,而且没有被修改过,也就达到了苹果的需求:保证安装的每个APP都是通过苹果官方容许的。(公钥解密“RSAHash”获得hash1,再对应用包进行相同hash算法获得hash2,验证两次hash值是否相同)bash

可是还有不少需求是不能经过App Store下载这一途径知足的服务器

2.苹果的市场需求

1.安装包不须要上传到App Store,能够直接安装到手机上微信

  • 开发App时直接真机调试安装
  • 企业内部分发的渠道企业证书签名的APP也是须要顺利安装的

2.苹果为了保证系统的安全性,又必须对安装的APP有绝对的控制权app

  • 通过苹果容许才能够安装
  • 不能被滥用致使非开发APP也能被安装

为了实现这些需求,iOS签名的复杂度也就开始增长了,苹果这里给出的方案是双层签名ide

3.双层签名

这里简单梳理了一下iOS的双层签名流程,固然这不是最终的流程,苹果爸爸在这个基础流程上还要加点东西。这个流程中有两个基础角色:Mac电脑、iPhone手机,由于iOS的APP开发环境在Mac系统下,因此这个依赖关系成为了苹果双层签名的基础网站

1.苹果本身有固定的一对公私钥,跟以前App Store原理同样,私钥存储在苹果后台,公钥放在每一个iOS系统中。这里称为公钥A私钥A;在Mac系统中建立CSR文件时生成非对称加密算法的一对公钥/私钥,这里称为公钥M私钥M;A=Apple M = Macui

2.开发者经过CSR文件向开发者中心申请证书

3.苹果服务器生成证书,也就是咱们平时所说的开发者证书,其原理就是用私钥A公钥M非对称加密。请求到证书以后,钥匙串访问就会将证书与本地私钥M( 就是咱们所熟知的p12) 进行相关联

4.当咱们Command+B生成一个应用时,Xcode就会用本地的私钥M对这个应用进行签名,同时将证书放到app里面打包成ipa包

5.iPhone手机安装ipa包

6.iOS系统里的公钥A对证书进行验证

7.验证经过拿到证书中的公钥M

8.公钥M验证app的签名。这里就间接验证了这个APP的安装行为是否通过苹果官方容许(这里只验证安装行为,不验证APP是否被改动,由于开发阶段 APP 内容老是不断变化的,苹果不须要管)

再简化一下流程:

3.第一次签名:私钥A->公钥M=>证书

4.第二次签名:私钥M->app=>app

7.第一次验证:公钥A->证书=>公钥M

8.第二次验证:公钥M->私钥M=>结果

CSR文件和公钥M的关系
CSR文件和公钥M的关系:

当CSR文件建立的时候,会自动生成一对私钥和公钥,私钥存储在Mac上,私钥存储默认存储在登陆钥匙串中,能够在钥匙串的分类钥匙下查看,请求到的证书会包含公钥部分

图中还有一大坨东西是什么?接下来就来介绍它

4.描述文件

苹果为了解决应用滥用的问题,因此苹果又加了两个限制

  • 第一限制在苹果后台注册过的设备才能够安装
  • 第二限制签名只能针对某一个具体的App,而且苹果还想控制App里面的iCloud/PUSH/后台运行/调试器附加这些权限,因此苹果把这些权限开关统一称为Entitlements(受权文件)

所以才有了Provisioning Profile(描述文件)

描述文件通常包括证书、AppID、设备。当咱们在真机运行或者打包一个项目的时候,证书用来证实咱们程序的安全性和合法性

描述文件是在AppleDevelop网站建立的(在Xcode中填上AppleID它会代办建立),Xcode运行时会打包进入App内。因此咱们使用CSR申请证书时,咱们还要申请一个东西!!就是描述文件!

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

前往描述文件目录

$ /Users/**用户名**/Library/MobileDevice/Provisioning Profiles
复制代码

查看描述文件

$ security cms -Di xxx.mobileprovision
复制代码

2、重签名

1.重签名前期准备

1.PP助手下载微信(越狱版本)

2.解压缩ipa包

3.终端进入如图目录查看应用签名信息

$ codesign -vv -d WeChat.app
复制代码

4.列出电脑上的证书

//注意这里要选择iPhone Developer证书
$ security find-identity -v -p codesigning
复制代码

5.查看MachO文件是否加密(步骤3显示包内容后进入当前目录)

//读取MachO信息
$ otool -l WeChat              
//读取MachO信息并
$ otool -l WeChat > ~/Desktop/123.txt 
//读取MachO中"cry"开头的信息
$ otool -l WeChat | grep cry
复制代码

如图所示当前MachO文件 cryptid=0是越狱应用

2.重签名步骤

1.删除插件和带有插件的.app包(好比Watch,PlugIns)

由于普通帐号不能对插件进行签名,因此须要删除

包内容路径中找到WatchPlugIns文件夹直接删除

2.重签framework
// 进入FrameWork目录
$ cd Frameworks
// 列举当前FrameWork
$ ls
// 覆盖签名
// codesign -fs "(证书名称)" (FrameWork名称)
$ codesign -fs "iPhone Developer: 840385400@qq.com (NZJQGFWAYE)" mars.framework
$ codesign -fs "iPhone Developer: 840385400@qq.com (NZJQGFWAYE)" marsbridgenetwork.framework
$ codesign -fs "iPhone Developer: 840385400@qq.com (NZJQGFWAYE)" matrixreport.framework
$ codesign -fs "iPhone Developer: 840385400@qq.com (NZJQGFWAYE)" OpenSSL.framework
$ codesign -fs "iPhone Developer: 840385400@qq.com (NZJQGFWAYE)" ProtobufLite.framework
$ codesign -fs "iPhone Developer: 840385400@qq.com (NZJQGFWAYE)" andromeda.framework
复制代码

3.给MachO上可执行权限

包内容路径下执行$ Chmod +x WeChat

4.添加描述文件

新建工程,真机运行便可获得描述文件

将ipa包中的描述文件放到微信的包内容中去

5.修改应用包的bundid

修改微信包内容中的info.plist->BundleId,改成与描述文件的BundleId一致

6.受权文件重签app包

查看原先的描述文件embedded.mobileprovision并复制相应内容

$ security cms -Di embedded.mobileprovision

利用Xcode新建一个plist文件

以代码形式打开plist文件(open As->Source code)并粘贴相应内容

复制一份与目标.app放于同一目录下

最后一步命令行签名app包

$ codesign -fs "iPhone Developer: 840385400@qq.com (NZJQGFWAYE)" --no-strict --entitlements=ent.plist WeChat.app
复制代码

7.安装.app包

Xcode界面下shift+cmd+2调出手机设备

app运行后利用Xcode附加进程

点击“登陆”按钮就能够打印对应信息了

接下来再介绍个骚操做——利用Xcode来使以上繁琐的步骤略微减小

3.xcode重签名

必须是与MachO文件同名工程(工程名相同,BundId无所谓),不然进程不是微信进程

1.运行app,装描述文件

新建WeChat工程,同上Command+Run,将描述文件生成一下

2.替换掉app包

复制一个新的越狱包,覆盖掉到原来的ipa包

3.删除插件

同本文2-1

4.重签framework

同本文2-2

5.run

因为是Xcode直接运行,能够经过Debug View查看界面

写在结尾

原本想写的简洁点,但为了让看这篇文章的人有所收获,我仍是一步步操做尽量讲解的详细点。我以为写博客的目的一半是为了积累,另外一半是送人玫瑰,手留余香,但愿对重签名原理这块没怎么接触过的同窗能有个初步认识乃至可以上手操做

下一篇将介绍更骚的重签名操做

相关文章
相关标签/搜索