美文网首页逆向工程
iOS逆向:签名机制

iOS逆向:签名机制

作者: 码小菜 | 来源:发表于2020-11-21 13:38 被阅读0次

    目录
    一,加密解密
    二,单向散列函数
    三,数字签名
    四,证书
    五,签名机制
    六,重签名(一)
    七,重签名(二)

    一,加密解密

    1,为何加密:防止消息被窃听
    • 加密前
    • 加密后
    2,如何加密
    • 对称密码:加密密钥和解密密钥相同
    • 公钥密码(非对称密码):加密密钥和解密密钥不同
    3,对称密码
    • DES(Data Encryption Standard

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

    加密 解密
    • 3DES

    1>是一种将DES重复3次的对称密码算法
    2>3个密钥都是不同的,也称为DES-EDE3
    3>处理速度较低,安全性也不高

    加密 解密
    • AES(Advanced Encryption Standard

    1>已经逐步取代DES3DES,成为首选的对称密码算法
    2>密钥长度有128bit、192bit、256bit三种

    • 密钥配送问题

    1>在使用对称密码时,一定会遇到密钥配送问题
    2>假设Alice将使用对称密码加密过的消息发送给Bob
    3>只有同时将密钥也发送过去,Bob才能完成解密
    4>在发送过程中,密钥可能会被Eve窃听,最后Eve也能完成解密

    4,公钥密码
    • 介绍

    1>加密密钥一般是公开的,因此被称为公钥
    2>解密密钥由消息接收者自己保管,不能公开,因此被称为私钥
    3>公钥和私钥是一一对应的,不能单独生成,它们被统称为密钥对
    4>由公钥加密的密文,必须使用与之对应的私钥才能解密
    5>由私钥加密的密文,必须使用与之对应的公钥才能解密

    • RSA

    1>是目前使用最广泛的公钥密码算法
    2>RSA是由它的3位开发者(Ron RivestAdi ShamirLeonard Adleman)姓氏首字母组成的

    • 解决密钥配送问题

    1>消息接收者生成一对公钥和私钥
    2>消息接收者将公钥发送给消息发送者
    3>消息发送者使用公钥加密消息
    4>消息接收者使用密钥解密消息
    5>窃听者没有私钥无法解密消息

    5,混合密码
    • 介绍

    1>对称密码存在密钥配送问题
    2>公钥密码加密解密速度较慢
    3>混合密码就是将对称密码与公钥密码结合使用,可以解决上面两个问题

    • 加密

    1>消息接收者生成一对公钥和私钥
    2>消息接收者将公钥发送给消息发送者
    3>消息发送者随机生成一个会话密钥
    4>消息发送者使用会话密钥加密消息(对称密码:速度较快)
    5>消息发送者使用公钥加密会话密钥(公钥密码:解决密钥配送问题)
    6>消息发送者将加密过的消息和会话密钥一并发送给消息接收者

    • 解密

    1>消息接收者使用私钥解密出会话密钥
    2>消息接收者使用会话密钥解密出消息

    二,单向散列函数

    1,介绍
    • 根据消息内容计算出散列值(也称为消息摘要:message digest
    • 具备单向性
    • 消息不同,散列值就不同
    • 散列值的长度是固定的,与消息的长度无关
    2,类型
    • MD5

    1>MDmessage digest缩写
    2>散列值长度为128bit
    3>目前已经被破解

    • SHA-1

    1>散列值长度为160bit
    2>目前已经被破解

    • SHA-2

    1>有SHA-256SHA-384SHA-512三种
    2>散列值长度分别为256bit、384bit、512bit
    3>目前被广泛使用

    3,防止数据被篡改
    • 使用前
    • 使用后

    三,数字签名

    1,介绍
    • 用来确认消息的真实性:是否由本人所发,是否有被篡改
    • 不能保证消息的机密性
    • 两种行为:生成签名和验证签名
    2,与公钥密码对比
    • 公钥密码:消息接收者生成公钥和私钥;公钥加密,私钥解密
    • 数字签名:消息发送者生成公钥和私钥;私钥生成签名(加密),公钥验证签名(解密)
    • 总结
    3,签名流程
    4,存在的问题
    • 消息发送者需要先将公钥发送给消息接收者
    • 在发送公钥的过程中可能会被攻击者拦截并伪造
    • 如果公钥被伪造,数字签名就会失效
    公钥密码的伪造过程

    四,证书

    1,介绍
    • 用来验证公钥的合法性
    • 全称叫公钥证书,由权威机构(Certificate AuthorityCA)进行认证
    • CA就是能证明“公钥确实属于此人”的个人或组织
    • 证书中包括:个人信息、此人的公钥、CA的数字签名
    2,认证流程

    五,签名机制

    1,介绍
    • 真机调试和打包发布都是需要签名的
    • 签名是为了保证安装到iPhone上的APP都是经过Apple官方允许的
    2,签名流程
    • 第一步:用Mac私钥对APP进行签名
    • 第二步:用Apple私钥对Mac公钥进行签名,生成证书
    • 第三步:用Apple私钥对证书、devicesappidentitlements(权限)进行签名,生成mobileprovision文件
    • 第四步:用Apple公钥验证mobileprovision文件中的签名,确认证书、devicesappidentitlements(权限)的合法性
    • 第五步:用Apple公钥验证证书中的签名,确认Mac公钥的合法性
    • 第六步:用Mac公钥验证APP中的签名,确认其合法性后才能安装在iPhone上
    3,操作步骤
    • 在编译时Xcode会自动用Mac私钥对APP进行签名
    • 生成证书
    获取Mac公钥 Mac公钥 新建证书 选择证书类型 上传Mac公钥 生成证书
    • 生成mobileprovision文件
    新建mobileprovision文件 选择证书 选择devices 选择appid(包括entitlements) 生成mobileprovision文件
    4,官方图解

    六,重签名(一)

    1,准备项目
    • 代码
    @implementation ViewController
    int _age = 10;
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        UILabel *label = [[UILabel alloc] init];
        label.text = [NSString stringWithFormat:@"my age is %d", _age];
        label.frame = CGRectMake(30.0, 30.0, 100.0, 30.0);
        [self.view addSubview:label];
    }
    @end
    
    • 真机运行效果
    • 包内容

    新版Xcode会自动下载mobileprovision文件

    • 签名

    1>CodeResources是包内容当中所有文件(除可执行文件以外)的签名
    2>可执行文件的签名存储在可执行文件里面

    2,破坏签名
    • _age的值改为20

    包内容当中任何文件被修改了都会破坏签名

    修改前 修改后
    • 重新生成ipa文件
    • 用爱思助手安装

    安装失败,因为未越狱的iPhone会验证APP的签名

    3,重签名
    • mobileprovision文件中提取entitlements文件

    1>security cms -D -i embedded.mobileprovision > temp.plist
    2>/usr/libexec/PlistBuddy -x -c 'Print :Entitlements' temp.plist > entitlements.plist

    • 获取证书id

    security find-identity -v -p codesigning

    • 对APP包重签名

    codesign -fs [证书id] --entitlements entitlements.plist [APP包路径]

    • 重新生成ipa包并安装
    • 运行效果
    4,重签名工具
    • 下载地址

    https://github.com/DanTheMan827/ios-app-signer.git

    • 打开项目,编译一下,生成工具
    • 打开工具,选择APP包,选择证书,点击Start
    • 重签名成功后,会自动生成ipa

    七,重签名(二)

    1,准备工具
    • 下载地址

    https://github.com/Tyilo/insert_dylib

    • 打开项目,编译一下,生成工具
    • 将工具放入/usr/local/bin目录下
    2,准备动态库
    • 新建动态库
    • hook代码
    @interface ViewController
    - (void)presentViewController:(UIViewController *)viewControllerToPresent
                         animated:(BOOL)flag
                       completion:(void(^)(void))completion;
    @end
    
    %hook ViewController
    - (void)viewDidAppear:(BOOL)animated {
        %orig;
        UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示"
                                                                       message:@"动态库加载成功!"
                                                                preferredStyle:UIAlertControllerStyleAlert];
        [self presentViewController:alert
                           animated:YES
                         completion:nil];
    }
    %end
    
    • 安装到已越狱的iPhone
    • 安装成功
    3,加载动态库
    • 导出动态库
    • 导出CydiaSubstrate文件(动态库依赖于它)
    • 让可执行文件链接动态库

    1>链接:insert_dylib @executable_path/[动态库名称] [可执行文件名称] --all-yes --weak [新可执行文件名称]

    2>查看:otool -L [新可执行文件名称]

    • 修改CydiaSubstrate文件路径

    1>查看:otool -L [动态库名称]

    2>修改:install_name_tool -change [原路径] @loader_path/CydiaSubstrate [动态库名称]

    3>再次查看

    • 对动态库和CydiaSubstrate文件重签名

    codesign -fs [证书id] [文件名称]

    • 对APP包重签名
    • 安装到未越狱的iPhone
    • 运行效果
    4,对腾讯视频重签名
    • 步骤与上面基本一致,有几点需要注意

    1>APP包需要先脱壳,否则重签名无效
    2>APP包中没有mobileprovision文件,需要将自己的放进去
    3>需要对APP包中所有的动态库重签名:.dylib.framework(在Frameworks文件夹中),AppExtension(在PlugIns文件夹中),WatchApp(在Watch文件夹中)

    • 调试工具
    安装失败信息 启动崩溃信息
    • 运行效果
    本文章仅供学习交流,如有侵权,请联系删除,谢谢!

    相关文章

      网友评论

        本文标题:iOS逆向:签名机制

        本文链接:https://www.haomeiwen.com/subject/myybvktx.html