iOS 逆向13 -- 签名机制

对称加密

  • 在对称加密中,加密与解密使用的同一个密钥
  • 常见的对称加密算法有:
    • DES:将64位明文加密称64位密文的对称加密算法,密钥的长度为56位;
    • 3DES:将DES重复三次所得到的一种加密算法;
    • AES:取代DES成为新标准的一种对称加密算法;

密钥传输问题

  • 在使用对称加密时,一定会遇到密钥传输的安全性问题;
  • 通信的双方必须要互通密钥,才能实现一方加密,另一方解密,完成完整的信息传输;

非对称加密

  • 密钥有两种,分别为:公钥和私钥,两者是一一对应的;
  • 消息的接收者生成一对密钥公钥用来加密私钥用来解密
  • 公钥可以传输,私钥由消息的接受者保管
  • 目前使用最广泛的非对称加密算法是RSA算法

混合密码系统

  • 对称加密,不能保证密钥传输的绝对安全,但速度很快;
  • 非对称加密,加密,解密的速度比较慢,但密钥传输安全;
  • 将两者结合在一起,就组成了混合密码系统,兼顾两者之间的优点,工作流程如下:
    • 消息的接收者生成一对密钥即公钥私钥
    • 消息的接收者将公钥传输给消息的发送者;
    • 消息的发送者会随机生成一个会话密钥,然后用消息的接收者的公钥进行加密,再传给消息的接收者;
    • 消息的接收者拿到加密后的会话密钥,利用自己的私钥进行解密,获取到会话密钥,会话密钥的传输使用的非对称加密
    • 之后两者之间的消息发送,使用会话密钥进行对称加密传输,提高效率;

单向散列函数

  • 单向散列函数,可以根据消息内容计算出散列值,任意长度的消息,计算出固定长度的散列值,消息不同,散列值也不同;
  • 散列值可以看成消息的唯一标识;
  • 单向散列函数,又称为消息摘要函数,哈希函数,输出的散列值,也被称为消息摘要,指纹;
  • 常见的单向散列函数:
    • MD4,MD5:生成128位的散列值,目前已经不安全了;
    • SHA-1:生成160位的散列值,目前已经不安全了;
    • SHA-2:包含SHA-256,SHA-384,SHA-512,散列值的长度分别为256位,384位,512位;
    • SHA-3:全新标准;

单向散列函数的应用

  • 防止数据被篡改;例如原始文件利用单向散列函数生成一个散列值,若文件数据被篡改,那么篡改后的文件生成的散列值与原始的散列值肯定不同;
  • 口令加密:登录,注册时密码使用单向散列函数生成密文,不能直接使用明文传输;

数字签名

  • 生成签名:由消息的发送者完成,通过签名密钥生成;
  • 验证签名:由消息的接收者完成,通过验证密钥验证;
  • 如何保证签名是消息的发送者自己签的,答案是:用消息发送者的私钥进行签名
  • 消息可能所占空间较大,可先生成对应的散列值,然后用私钥对消息的散列值进行签名;

数字签名的过程

  • 数字签名的作用不是为了保证机密性,仅仅是为了能够识别内容有没有被篡改;
  • 其作用是识别消息是否被篡改
  • 数字签名的使用的一个重要前提是:用于验证签名的公钥必须属于真正的发送者
  • 其原理图如下所示:
Snip20210713_18.png

中间人攻击

  • 其原理图如下所示:
Snip20210713_19.png
  • 中间攻击者拦截了A的公钥,伪造了公钥;
  • AB两者之间的通信,完全感知不到中间攻击者的存在,很危险!!!

数字证书

  • 数字证书能验证公钥的合法性
  • 密码学中的证书,全称叫公钥证书,里面包含有姓名,邮箱等个人信息,以及此人的公钥;
  • 数字证书是由认证机构(CA)施加数字签名的,即CA用自己的私玥对某个人的个人信息和他的公钥进行签名,生成一个数字证书;
  • CA就是能够认定公钥确实属于某人,并能够生成数字签名的个人或者组织;

iOS签名机制

  • 其作用是保证安装到用户手机上的App都是经过Apple官方允许的,不管是真机调试,还是发布App,开发者都需要经过一系列复杂的步骤,如下:
  • 1.生成CertificateSigningRequest.certSigningRequest文件
  • 2.创建iOS_development.cer / iOS_distribution.cer证书文件
  • 3.注册device的UDID,添加App的唯一标识AppBundleID;
  • 4.创建xxx.mobleprovision描述文件
  • 只有完成上述的4步操作,真机才能安装上App进行调试;
iOS签名机制.png
  • Apple服务器充当CA认证机构,其保证Mac公钥的合法性;
  • 我们在进行App真机调试时,会进行一下步骤:
  • 首先访问钥匙串,导出CertificateSigningRequest.certSigningRequest文件,CertificateSigningRequest.certSigningRequest文件本质就是Mac的公钥;
Snip20210714_20.png
  • 然后在苹果的开发者网站上创建证书文件iOS_development.cer或者iOS_distribution.cer,需要上传CertificateSigningRequest.certSigningRequest文件,其本质是将Mac的公钥传给苹果的服务器,然后苹果的服务器利用自己的私钥,对Mac的公钥进行签名,最后生成证书文件;
  • 最后在苹果的开发者网站上创建mobleprovision描述文件,需要选中刚刚生成的证书文件,device的UDID以及App的唯一标识AppBundleID,其本质是将选中的数据全部传给苹果的服务器,然后苹果的服务器利用自己的私钥,进行签名,最后生成经过签名后的mobleprovision描述文件;

iOS重签名

  • 破解他人的App,然后注入自己写的代码,最后生成的ipa包是不能直接安装到非越狱真机设备的,因为你修改了App的原始代码,其签名发生了变化,苹果在验证App签名时,就会不通过;需要对其重新签名,才能安装到非越狱真机设备上;

codesign --> iOS重签名的具体步骤:

场景一:Xcode新建一个工程,并写入简单的代码,运行直接安装到非越狱真机设备上,然后找到其.app文件,本地创建一个Payload文件夹,将.app文件放入Payload文件夹中,然后压缩成.zip文件,最后将其后缀改成.ipa,即Payload.ipa文件;然后将Xcode运行安装的包从设备上删除,再将Payload.ipa安装到当前设备上,是可以安装的;

场景二:流程与场景一相同,不同点在于找到.app文件的Mach-O文件,利用MachOView打开并修改文件内容,最后生成Payload.ipa文件,再将Payload.ipa安装到当前设备(非越狱)上,是安装不上的,因为你修改了文件内容,那么其签名被破坏了,所以安装不上;不过越狱设备是可以安装的;

  • 第一步:准备一个embedded.mobileprovision描述文件(必须是付费证书产生的,appid,device一定要匹配),并放入app包中;
    • 可以去iOS开发者网站去创建然后下载;
    • 可以通过Xcode自动生成,然后在编译后的App包中找到,如下所示:
Snip20210714_25.png
  • 第二步:从embedded.mobileprovision描述文件中,提取出entitlements.plist权限文件,执行终端命令:
  • security cms -D -i embedded.mobileprovision > temp.plist 生成一个临时的plist文件;
  • /usr/libexec/PlistBuddy -x -c 'Print :Entitleements' temp.plist > entitlements.plist 得到entitlements.plist权限文件;
  • 第三步:查看可用的证书,获取证书ID,终端执行命令如下:
  • security find-identity -v -p codesigning
  • 第四步:对App包进行重新签名,终端执行命令如下:
  • codesign -fs 证书ID --entitlements entitlements.plist xxx.app

iOS重签名的GUI工具

第一种:iOS App Signer
  • 地址:https://github.com/DanTheMan827/ios-app-signer
  • 可以对.app重签名打包成ipa;
  • 需要在.app包中提供对应的embedded.mobileprovision文件
第二种:iReSign
  • 地址:https://github.com/maciekish/iReSign
  • 可以对ipa进行重签名;
  • 需要提供entitlements.plistembedded.mobileprovision文件路径

iOS重签名tweak的原理

  • 新建tweak项目,本质是创建一个与当前App相关的动态库;
  • 需要将新建的动态库文件与当前App的Mach-O文件,打包生成一个文件;
  • 可以使用insert.dylib库将动态库注入到Mach-O文件中,其地址为:https://github.com/Tyilo/insert.dylib
  • 命令行:insert dylib 动态库路径 目标Mach-O文件
  • 有两个常用的参数选项:
    • weak:即使动态库找不到也不会报错;
    • --all-yes:默认后面的所有选择都为yes;
  • insert dylib的本质是往Mach-O文件的Load Command中添加一个LC_LOAD_DYLIB或LC_LOAD_WEAK_DYLIB
  • 通过otool可查看Mach-O文件的动态库依赖信息,otool -L Mach-O文件
  • 当前创建的动态库可能会依赖其他的动态库,那么依赖的动态库也需要打包进来,否则会报错;
  • 通过Theos开发的动态库插件,
    • 默认都依赖于/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate
    • 如果要将动态库插件打包到ipa中,也需要将CydiaSubstrate打包到ipa中,并且修改下CydiaSubstrate的加载地址;其命令行为:install name_tool -change 旧地址 新地址 Mach-O文件
  • 常见的两个环境变量:
    • @executable_path代表可执行文件所在的目录;
    • @loader_path代表动态库所在的目录;
  • tweak创建的动态库以及动态库所依赖的其他动态库也需要重签名,命令为:codesign -fs 证书ID 动态库名称
  • 最后再对.app文件进行重签名;签名的app必须脱壳,否则签名不成功;

你可能感兴趣的:(iOS 逆向13 -- 签名机制)