iOS逆向-day9:签名机制

概述:
加密解密
单向散列函数
数字签名
iOS签名机制 和 证书
重签名


签名机制学习路线
一、加密解密
  • 1.1、常见的英文单词
    encrypt:加密、decrypt:解密、plaintext:明文、ciphertext:密文

  • 1.2、加密 和 解密 简介

    互相通信

    通信被窃听

    通信加密

    通信解密
  • 1.3、根据密钥的使用方法,可以将密码分为2种

    对称密码 和 非对称密码
    • 对称密码:加密和解密密码相同
    • 公钥密码(非对称密码):加密和解密密码不同
  • 1.4、对称密码(Symmetric Cryptography)
    在对称密码中,加密、解密时使用的是同一个密钥,常见的对称密码算法有:DES3DESAES

    • 1>、DES(Data Encryption Standard)

      • DES是一种将64bit明文加密成64bit密文的对称密码算法,密钥长度是56bit
      • 规格上来说,密钥长度是64bit,但每隔7bit会设置一个用于错误检查的bit,因此密钥长度实质上是56bit
      • 由于DES每次只能加密64bit的数据,遇到比较大的数据,需要对DES加密进行迭代(反复)
      • 目前已经可以在短时间内被破解,所以不建议使用
    • 2>、3DES

      • 3DES,将DES重复3次所得到的一种密码算法,也叫做3重DES
      • 目前还被一些银行等机构使用,但处理速度不高,安全性逐渐暴露出问题
      • 3个密钥都是不同的,也称为DES-EDE3
      • 如果所有密钥都使用同一个,则结果与普通的DES是等价的;如果密钥1、密钥3相同,密钥2不同,称为DES-EDE2


    • 3>、AES(Advanced Encryption Standard)

      • 取代DES成为新标准的一种对称密码算法
      • AES的密钥长度有128、192、256bit三种
      • 在2000年时选择Rijindael算法作为AES的实现
      • 目前AES,已经逐步取代DES、3DES,成为首选的对称密码算法
      • 一般来说,我们也不应该去使用任何自制的密码算法,而是应该使用AES,它经过了全世界密码学家所进行的高品质验证工作
  • 1.5、密钥配送问题

    • 在使用对称密码时,一定会遇到密钥配送问题

    • 假设,Alice 将使用对称密码加密过的消息发给了 Bob

      • 只有将密钥发送给 Bob,Bob 才能完成解密
      • 在发送密钥过程中,可能会被 Eve 窃取密钥,最后 Eve 也能完成解密
    • 如何解决密钥配送问题?有以下几种解决密钥配送的方法

      • 事先共享密钥(比如U盘拷贝)
      • 密钥分配中心
      • Diffie-Hellman密钥交换
      • 公钥密码
  • 1.6、公钥密码(Public-key Cryptography)

    • 公钥密码中,密钥分为加密密钥解密密钥2种,它们并不是同一个密钥

    • 公钥密码也被称为非对称密码(Asymmetric Cryptography)

    • 在公钥密码中

      • 加密密钥,一般是公开的,因此该密钥称为公钥(public key)
      • 解密密钥,由消息接收者自己保管的,不能公开,因此也称为私钥(private key)
      • 公钥和私钥是一 一对应的,是不能单独生成的,一对公钥和密钥统称为密钥对(key pair)
      • 由公钥加密的密文,必须使用与该公钥对应的私钥才能解密
      • 由私钥加密的密文,必须使用与该私钥对应的公钥才能解密
    • 解决密钥配送问题

      • 由消息的接收者,生成一对公钥、私钥
      • 将公钥发给消息的发送者
      • 消息的发送者使用公钥加密消息
    • RSA:目前使用最广泛的公钥密码算法是RSA,RSA的名字,由它的3位开发者,即Ron Rivest、Adi Shamir、Leonard Adleman的姓氏首字母组成

  • 1.6、混合密码系统(Hybrid Cryptosystem)

    • 1>、混合密码系统

      • 对称密码的缺点:不能很好地解决密钥配送问题
      • 公钥密码的缺点:加密解密速度比较慢
      • 混合密码系统,是将对称密码和公钥密码的优势相结合的方法,解决了公钥密码速度慢的问题,并通过公钥密码解决了对称密码的密钥配送问题,比如:网络上的密码通信所用的SSL/TLS都运用了混合密码系统
    • 2>、混合密码-加密

      • 会话密钥(session key)
        • 为本次通信随机生成的临时密钥
        • 作为对称密码的密钥,用于加密消息,提高速度
      • 加密步骤(发送消息)
        • 首先,消息发送者要拥有消息接收者的公钥
        • 生成会话密钥,作为对称密码的密钥,加密消息
        • 用消息接收者的公钥,加密会话密钥
        • 将前2步生成的加密结果,一并发给消息接收者
      • 发送出去的内容包括
        • 用会话密钥加密的消息(加密方法:对称密码)
        • 用公钥加密的会话密钥(加密方法:公钥密码)
    • 3>、混合密码-解密

    • 解密步骤(收到消息)

    • 消息接收者用自己的私钥解密出会话密钥

    • 再用第1步解密出来的会话密钥,解密消息

    • 3>、混合密码-加密解密流程 总结,Alice >>>>> Bob
      • 发送过程,加密过程

        • 1.Bob先生成一对公钥、私钥
        • 2.Bob把公钥共享给Alice
        • 3.Alice随机生成一个会话密钥(临时密钥)
        • 4.Alice用会话密钥加密需要发送的消息(使用的是对称密码加密)
        • 5.Alice用Bob的公钥加密会话密钥(使用的是公钥密码加密,也就是非对称密码加密)
        • 6.Alice把第4、5步的加密结果,一并发送给Bob
      • 接收过程,解密过程

        • 1.Bob利用自己的私钥解密会话密钥(使用的是公钥密码解密,也就是非对称密码解密)
        • 2.Bob利用会话密钥解密发送过来的消息(使用的是对称密码解密)
二、单向散列函数(One-way hash function)
  • 2.1、单向散列函数的简单介绍
    单向散列函数,可以根据根据消息内容计算出散列值。散列值的长度和消息的长度无关,无论消息是1bit、10M、100G,单向散列函数都会计算出固定长度的散列值。

  • 2.2、单向散列函数的特点

    • 根据任意长度的消息,计算出固定长度的散列值

    • 计算速度快,能快速计算出散列值

    • 消息不同,散列值也不同

      消息不同,散列值也不同
    • 具备单向性

      具备单向性
  • 2.3、单向散列函数的分类
    单向散列函数,又被称为消息摘要函数(message digest function),哈希函数
    输出的散列值,也被称为消息摘要(message digest)、指纹(fingerprint)

    • 常见的几种单向散列函数
      • MD4、MD5
        产生128bit的散列值,MD就是Message Digest的缩写,目前已经不安全
        Mac终端上默认可以使用md5命令
      • SHA-1
        产生160bit的散列值,目前已经不安全
      • SHA-2
        SHA-256、SHA-384、SHA-512,散列值长度分别是256bit、384bit、512bit
      • SHA-3 全新标准
  • 2.4、如何防止数据被篡改
    对文件进行 单向散列值获取,然后进行对比单向散列值是否一样

    如何防止数据被篡改
  • 2.5、单向散列函数的应用 – 防止数据被篡改

    • 防止文件被修改

      单向散列函数的应用 – 防止数据被篡改
    • 查看下载的文件是否是正版,如 https://www.realvnc.com/en/connect/download/vnc/


    • 口令加密:服务器只存储用户密码的 单向散列函数的值,保证安全

  • 2.6、想象以下场景,我们如何验证信息来源的正确性


    Alice发的内容有可能是被篡改的,或者有人伪装成Alice发消息,或者就是Alice发的,但她可以否认
    问题来了:Bob如何确定这段消息的真实性?如何识别篡改、伪装、否认?
    解决方案:数字签名

三、数字签名
  • 3.1、数字签名

    • 在数字签名技术中,有以下2种行为

      • 生成签名:由消息的发送者完成,通过签名密钥生成
      • 验证签名:由消息的接收者完成,通过验证密钥验证
    • 如何能保证这个签名是消息发送者自己签的?
      答案:用消息发送者的私钥进行签名,接收者用工要进行验证签名

  • 3.2、数字签名和公钥密码
    数字签名,其实就是将 公钥密码 反过来使用

  • 3.3、数字签名的过程
    这样会有一个问题:对内容签名会增加其传输内容的大小,后面会做出改进的方案

  • 3.4、数字签名的过程 – 改进
    对发送的内容的单向散列函数值进行一个 数字签名,接收者只需要对内容做一个散列值的对比即可

  • 3.4、数字签名 – 疑惑

    • 如果有人篡改了文件内容或者签名内容,会是什么结果?
      答:签名验证失败,证明内容会篡改
    • 数字签名不能保证机密性?
      答:数字签名的作用不是为了保证机密性,仅仅是为了能够识别内容有没有被篡改
    • 数字签名的作用
      答:确认消息的完整性、识别消息是否被篡改、防止消息发送人否认
  • 3.5、数字签名无法解决的问题

    • 要正确使用签名,前提是
      用于验证签名的公钥必须属于真正的发送者
    • 如果遭遇了中间人攻击,那么
      公钥将是伪造的、数字签名将失效
    • 所以在验证签名之前,首先得先验证公钥的合法性
    • 如何验证公钥的合法性?
      答:证书
    中间人攻击:替换公钥
  • 3.6、证书(Certificate)

    • 证书,联想的是驾驶证、毕业证、英语四六级证等等,都是由权威机构认证的
    • 密码学中的证书,全称叫公钥证书(Public-key Certificate,PKC),跟驾驶证类似
      • 里面有姓名、邮箱等个人信息,以及此人的公钥
      • 并由认证机构(Certificate Authority,CA)施加数字签名
    • CA就是能够认定“公钥确实属于此人”并能够生成数字签名的个人或者组织
      • 有国际性组织、政府设立的组织
      • 有通过提供认证服务来盈利的企业
      • 个人也可以成立认证机构
  • 3.7、证书的利用:保证了公钥的正确性,防止中间人攻击,这样数字签名才有意义

    证书的利用
  • 3.8、证书的注册和下载

    证书的注册和下载
四、iOS签名机制 和 证书
  • 4.1、iOS签名机制 的简单介绍

    • iOS签名机制的作用
      答:保证安装到用户手机上的APP都是经过Apple官方允许的
    • 不管是真机调试,还是发布APP,开发者都需要经过一系列复杂的步骤
      • 生成CertificateSigningRequest.certSigningRequest文件(自己Mac 电脑的公钥,一般我们从钥匙串获取的)
      • 获得ios_development.cer\ios_distribution.cer证书文件(自己电脑的公钥被苹果server端的私钥加密后的证书)
      • 注册device、添加App ID(配置的一些信息)
      • 获得*.mobileprovision文件(配置文件)
  • 4.2、certSigningRequest.cer.mobileprovision文件 究竟里面包含了什么?有何用处?

    iOS签名机制 – 流程图
  • 4.3、iOS签名机制 – 生成Mac设备的公私钥
    CertificateSigningRequest.certSigningRequest文件:就是Mac设备的公钥

  • 4.4、iOS签名机制 – 获得证书

    iOS签名机制 – 获得证书
    • ios_development.cerios_distribution.cer 文件:利用Apple后台的私钥,对Mac设备的公钥进行签名后的证书文件
    利用Apple后台的私钥,对Mac设备的公钥进行签名后的证书文件
  • 4.5、iOS签名机制 – 生成mobileprovision(配置文件)

    iOS签名机制 – 生成mobileprovision(配置文件)

  • 4.6、iOS签名机制 - AppStore

    • 如果APP是从AppStore下载安装的,你会发现里面是没有mobileprovision文件的
    • 它的验证流程会简单很多,大概如下所示
    AppStore下载APP的验证流程
五、重签名
  • 5.1、重签名的简单介绍

    • 如果希望将破坏了签名的安装包,安装到非越狱的手机上,需要对安装包进行重签名的操作
    • 注意:
      • 安装包中的可执行文件必须是经过脱壳的,重签名才会有效;
      • .app 包内部的所有动态库( .framework、.dulib)、AppExtension(PlugIns文件夹,拓展名是 appex)、WatchApp(Watch文件夹)都需要重新签名
    • 重签名打包后,安装到设备的过程中,可能需要经常查看设备的日志信息
      • 程序运行过程中:Window -> Devices and Simulators -> View Device Logs
      • 程序安装过程中:Window -> Devices and Simulators -> Open Console
  • 5.2、重签名步骤

    • 准备一个 embedded.mobileprovision 文件(配置文件)(必须是付费证书产生的,appid、device一定要匹配),并放入 .app 包中

      • 可以通过 Xcode 编译来自动生成,然后在编译后的 APP 包中找到
      • 可以去开发者证书网站生成下载
    • 从 embedded.mobileprovision 文件中提取 entitlements.plist 权限文件

      // 第一步
      security cms -D -I embedded.mobileprovision > temp.plist
      // 第二步
      /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' temp.plist > entitlements.plist
      
      • 查看可用证书

        security find-identity -v -p codesigning
        
      • 对.app内部的动态库、AppExtension 等进行签名

        codesign -fs 证书ID xxx.dylib
        
      • 对 .app 包进行签名

        codesign -fs 证书ID --entitlements entitlements.plist  xxx.app
        
  • 5.3、重签名 GUI 工具

    • 第一种:iOS App Signer(推荐)
      可以对 .app 重签名打包成 ipa,需要在 .app 包 中提取对应的 embedded.mobileprovision 文件
    • 第二种:iReSign
      可以对 ipa 进行重签名,需要提供 entitlements.plistembedded.mobileprovision 文件的路径
  • 5.4、通过 Theos 开发的动态库插件(dylib)
    我们在 Theos 开发的 动态库卡插件

    对爱奇艺开发的动态库

    对爱奇艺开发的动态库
    • 重签名的app要是破壳的
      重签名的app要是破壳的

      重签名的app要是破壳的
  • 5.5、动态库注入(或者是动态库的插入)

    • 可以使用 insert_dylib 库将动态库注入到 Mach-O 文件中

    • 下载好,打开,编译后把文件放在 /usr/local/bin 目录下

      insert_dylib存放地址
    • 用法

      • insert_dylb 动态库加载路径/动态库 Mach-O文件,例如

        insert_dylib @executable_path/动态库插件 Mach-O文件
        
      • 有 2 个经常用参数选项
        --weak 即使动态库找不不到也不会报错
        --all-yes 后面所有的选择都为 yes

        insert_dylib @executable_path/动态库插件 Mach-O文件 --all-yes --weak
        
      • insert_dylib 的本质是往 Mach-O 文件的 Load Commands 中添加了一个 LC_LOAD_DYLIBLC_LOAD_WEAK_DYLIB

      • 在最后加上可执行文件的名称,把之前的可执行文件给替换掉,生成新的可执行文件

        insert_dylib @executable_path/动态库插件 Mach-O文件 --all-yes --weak Mach-O文件
        

      • 可以通过 otool 查看 Mach-O 的动态库依赖信息:otool -L Mach-O文件 或者 otool -L 动态库文件

        修改成功
  • 5.6、更改动态库加载地址

    • 可以使用 install_name_tool 修改 Mach-O文件中动态库的加载地址

      • install_name_tool -change 旧地址 新地址 Mach-O文件或者动态库文件,如下

        install_name_tool -change /Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate @loader_path/CydiaSubstrate 动态库文件名字
        
        动态库路径修改成功
    • 通过 Theos开发的动态库插件(dylib)

      • 默认都依赖于 Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate
      • 如果将要动态库插件打包到 ipa 中,也需要将 CydiaSubstrate 打包到 ipa 中,并且修改下 CydiaSubstrate 的加载地址 @Loader_path
    • 2 个常用环境变量

      • @executable_path 代表可执行文件所在的目录
      • @loader_path 代表动态库所在的目录
  • 5.7、动态库插件安装未越狱手机上总结,以为 爱奇艺 安装插件为例,步骤如下

    • 第 1 步:使用越狱手机下载 爱奇艺 , 获取砸壳爱奇艺 app,我们这里使用 Clutch 工具


    • 第 2 步:使用 Theos 开发的动态库插件(dylib) , 并开发插件

      • 使用 Reveal 找到要 hook 的控制器,比如 爱奇艺的首页 QYRecomChannelViewControllerV3

      • 编写 Hook代码,在爱奇艺的首页 弹个提示框即可

    • 把动态库运行在 越狱手机上,并获取动态库

      cd 进入 Tweak.x 所在的文件夹下
      make clean 
      make
      make package 
      make install
      

      上面的步骤执行完,获取动态库

      对爱奇艺开发的动态库
    • 第 3 步:拿到动态库依赖的 CydiaSubstrate

      • 默认都依赖于 Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate
    • 第 4 步:获取一个包含 未越狱手机的 embedded.mobileprovision 文件(配置文件)

      • 可以通过 Xcode 编译来自动生成,然后在编译后的 APP 包中找到
      • 可以去开发者证书网站生成下载
    • 第 5 步:把 动态库插件、embedded.mobileprovision 文件、CydiaSubstrate 文件 放到 爱奇艺破壳后的包里

      把 动态库插件、embedded.mobileprovision 文件、CydiaSubstrate 文件 放到 爱奇艺破壳后的包里
    • 第 6 步:动态库插件的插入,使用工具 insert_dylib

      insert_dylib @executable_path/动态库插件 Mach-O文件 --all-yes --weak Mach-O文件

      • 提示:我们这里指的 Mach-O文件 指的是爱奇艺的可执行文件 iQiYiPhoneVideo
      • 如:insert_dylib @executable_path/tweak_iqy.dylib iQiYiPhoneVideo --all-yes --weak iQiYiPhoneVideo
        动态库插入成功
    • 第 7 步:修改 动态库插件中 CydiaSubstrate 的路径

      • install_name_tool -change 旧地址 新地址 Mach-O文件或者动态库文件
      • 如:install_name_tool -change /Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate @loader_path/CydiaSubstrate tweak_iqy.dylib
        动态库路径修改成功
    • 第 8 步:证书对 动态库插件和CydiaSubstrate 签名

      • 查看可用的证书:security find-identity -v -p codesigning

      • 对我们开发的插件动态库进行签名

        codesign -fs 证书ID xxx.dylib
        
      • 对 CydiaSubstrate 进行签名

        codesign -fs 证书ID CydiaSubstrate
        
      • 检查我们的 APP 包还有没有其他的动态库,如:.app 包内部的所有动态库( .framework、.dulib)、AppExtension(PlugIns文件夹,拓展名是 appex)、WatchApp(Watch文件夹)都需要重新签名,和我们自己开发的动态库一样需要重新签名

    • 第 9 步: 对 .app 包进行签名,推荐我们使用 iOS App Signer.app 包进行重签名

      codesign -fs 证书ID --entitlements entitlements.plist  xxx.app
      
    • 第 10 步: 安装重签名后的 app 包

      安装重签名后的 app 包
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342