美文网首页
03-04---iOS应用签名及重签名技术--Shell脚本&代

03-04---iOS应用签名及重签名技术--Shell脚本&代

作者: 清风烈酒2157 | 来源:发表于2020-11-25 09:00 被阅读0次

    [toc]

    前言

    在iOS出来之前,以前的主流操作系统(Mac/Windows)软件随便从哪里下载都能运行,系统安全存在隐患,盗版软件,病毒入侵,静默安装等等.那么苹果希望解决这样的问题,要保证每一个安装到 iOS 上的 APP 都是经过苹果官方允许的,怎样保证呢?就是通过代码签名。


    • 如果要实现验证.其实最简单的方式就是通过苹果官方生成非对称加密的一对公私钥.在iOS的系统中内置一个公钥,私钥由苹果后台保存,我们传APP到AppStore时,苹果后台用私钥对APP数据进行签名,iOS系统下载这个APP后,用公钥验证这个签名,若签名正确,这个APP肯定是由苹果后台认证的,并且没有被修改过,也就达到了苹果的需求:保证安装的每一个APP都是经过苹果官方允许的.

      如果我们iOS设备安装APP只从App Store这一个入口这件事就简单解决了,没有任何复杂的东西,一个数字签名搞定.
      但是实际上iOS安装APP还有其他渠道.比如对于我们开发者iOSER而言,我们是需要在开发APP时直接真机调试的.而且苹果还开放了企业内部分发的渠道,企业证书签名的APP也是需要顺利安装的.
      苹果需要开放这些方式安装APP,这些需求就无法通过简单的代码签名来办到了。

    苹果应用签名

    • 那么我们来分析一下,它有些什么需求: 安装包不需要上传到App Store,可以直接安装到手机上. 
      
    • 苹果为了保证系统的安全性,又必须对安装的APP有绝对的控制权 经过苹果允许才可以安装 不能被滥用导致非开发APP也能被安装 为了实现这些需求,iOS签名的复杂度也就开始增加了,苹果这里给出的方案是双层签名.
      
    0265d99494a9956324c998dcaf44f0cf
    • iOS的双层代码签名流程这里简单梳理一下,这也不是最终的iOS签名原理.iOS的最终签名在这个基础上还要稍微加点东西.
      • 首先这里有两个角色.一个是iOS系统 还有一个就是我们的Mac系统.因为iOS的APP开发环境在Mac系统下.所以这个依赖关系成为了苹果双层签名的基础.

      • 在Mac系统中生成非对称加密算法的一对公钥\私钥(你的Xcode帮你代办了).这里称为公钥M 私钥M . M = Mac

      • 苹果自己有固定的一对公私钥,跟之前App Store原理一样,私钥在苹果后台,公钥在每个iOS系统中.这里称为公钥A , 私钥A. A=Apple

      • 把公钥M 以及一些你开发者的信息,传到苹果后台(这个就是CSR文件),用苹果后台里的私钥 A 去签名公钥M。得到一份数据包含了公钥M 以及其签名,把这份数据称为证书。

    描述文件

    描述文件(Provisioning profile)一般包括三样东西:证书、App ID、设备。当我们在真机运行或者打包一个项目的时候,证书用来证明我们程序的安全性和合法性

    • 苹果为了解决应用滥用的问题,所以苹果又加了两个限制.
      • 第一限制在苹果后台注册过的设备才可以安装.
      • 第二限制签名只能针对某一个具体的APP. 并且苹果还想控制App里面的iCloud/PUSH/后台运行/调试器附加这些权限,所以苹果把这些权限开关统一称为Entitlements(授权文件).并将这个文件放在了一个叫做Provisioning Profile(描述文件)文件中.
      • 描述文件是在AppleDevelop网站创建的(在Xcode中填上AppleID它会代办创建),Xcode运行时会打包进入APP内.所以我们使用CSR申请证书时,我们还要申请一个东西!! 就是描述文件!
      • 在开发时,编译完一个 APP 后,用本地的私钥M对这个APP进行签名,同时把从苹果服务器得到的 Provisioning Profile 文件打包进APP里,文件名为embedded.mobileprovision,把 APP 安装到手机上.最后系统进行验证。

    codesigning证书签名

    • 查看可用证书
    security find-identity  -v -p codesigning  列出钥匙串可签名的证书  (iPhone Developer: zed_lv@163.com (TWVF26846Y) )
    
    • 查看包 显示包内容


      8cba7a8bcc733cbd333592b65058be5f
    • 通过反编译查看二进制文件 或者终端命令
    1.cd 到Korea_Fan.app 
    2.otool -l Korea_Fan  查看
    3.otool -l Korea_Fan > ~/Desktop/123.txt 重定向成文本输出
    
    # otool -l Korea_Fan | grep xxx   xxx 筛选一xxx开头的
    
    # 查看里面的加密id-> cryptid (越狱为0不加密     正版微信1 属于appstore加密 对称加密) 
    

    重签app

    手动重签名

    • 终端命令


      64ebab11fa8390b726d94f5942c6695e
    • 步骤


      c41e5f10060bf1a9a365286ffae0bbc0
    • 详细步骤

      • cd '/Volumes/吕亚洲/软件/微信-7.0.8(越狱应用)/Payload/WeChat.app/Frameworks

      • codesign -fs "iPhone Developer: zed_lv@163.com (TWVF26846Y)” andromeda.framework)

      • WeChat 可执行文件是否有权限执行?


        5dc443fb61c269d71193646ab9832016
      • 黑色可支持,白色不可以,不支持

        • 加权限 chmod +x WeChat
      • 描述文件

        • 新建一个工程 真机运行之后 描述文件以及运行到手机中.找个找个运行的ipa 然后显示包内容


          70c45ca5070ca075f0c5ecbac4ad96d2
          756fc6db108c58b69948773e8ff03980
      • 描述文件复制粘贴到WeChat中


        53c3a5082b0ebb01a01d7bd293cba08e
      • 找个WeChat里面的plist文件 把bouldeID改一下,改成描述文件的那个


        cb04e44fa76c1c67d0c8fe7b397fba43
      • 签名app包


        abfb1f4372f29a39ada2d95085fe40ca
      • 查看 security cms -D -i XXX 描述文件名字


        ece67dfc709e2ac0e7922708e89d308f
      • 在工程里面新建一个plist文件,把内容复制进去,然后拿到文件,对WeChat这个app重签名, codesign -fs “证书串” —no-strict —entitlements=xxx.plist app包


        c4dd7544af66c970947226fb57d2cd12
      • 进入调试状态


        629efc8335830429f67cec1931120233

    Xcode 重签名

    • 创建一个与包名相同的文件,这里继续以WeChat为例子,运行到手机上


      6f353f8db2059461714823d17922d0ad
    • 将WeChat包复制 到 运行安装到手机上的WeChat自建工程


      3b0f4e1390c57af6849373cd072b1ef2
      9bead69b58b38c789057cdfbad78e8e4

      如图:


      00cca8bee25cfefe117172c3776a62ad
    • 这个时候还是不能运行的

      • 删插件
      • 签名framework
      • 注意点 info.plist 里面bouldID不用改 自动回改变

      疑问?如果工程名字是Demo,能否将WebChat改成名字为Demo,后面能运行成功吗?

      • 不能,demo 显示包文件里面会生成一个个Demo的可执行文件,在command+r 生成的

      疑问?能否将二进制文件WebChat改成名字为Demo,后面能运行成功吗?

      • 不能,comand + r 运行不通过

      如果查看运行的mach-o文件


      4c290c5a160faaaee6c2264f2ba096db

      shell脚本重签名

    切换zsh 或bash 终端脚本
    chsh -s /bin/zsh
    chsh -s /bin/bash

    • shell脚本


      e1c40bf06581b94ec8cbac8e90028706
    • shell脚本执行相关命令

    ddfe152567f47848bd2c677aac062477
    • 举例子
    15d8657acfcb8152f493b4d8802c9e65
    • 相关指令

    查看系统的shell脚本
    cd /private/etc -> ls->cat shells->


    05ce204efcf59482fba63e114f1b7588

    ls ~ 查看root目录
    ls -l 查看文件权限
    d开头文件夹
    drwxrwxr-x+ 16 root admin 512 2 28 22:22 Applications
    -开头文件
    -rwxr-xr-x 1 root wheel 633328 12 5 17:33 zsh

    文件权限与类型
    66be76f51ecd47f5dbaf5955c9f5cff2
    改变权限

    1 2 4 是二进制 0001 0010 0100
    chmod +x 文件名 单写一个代表三个用户x权限
    chmod 6 文件名

    56882e37f966770276dfd75dc1fd0194
    shell脚本签名
    • 将xcoed手动签名 用命令行写出来,并创建APP Temp文件夹,

    • 写脚本

    # ${SRCROOT} 它是工程文件所在的目录
    TEMP_PATH="${SRCROOT}/Temp"
    #资源文件夹,我们提前在工程目录下新建一个APP文件夹,里面放ipa包
    ASSETS_PATH="${SRCROOT}/APP"
    #目标ipa包路径
    TARGET_IPA_PATH="${ASSETS_PATH}/*.ipa"
    #清空Temp文件夹
    rm -rf "${SRCROOT}/Temp"
    mkdir -p "${SRCROOT}/Temp"
    
    
    
    #----------------------------------------
    # 1. 解压IPA到Temp下
    unzip -oqq "$TARGET_IPA_PATH" -d "$TEMP_PATH"
    # 拿到解压的临时的APP的路径
    TEMP_APP_PATH=$(set -- "$TEMP_PATH/Payload/"*.app;echo "$1")
    # echo "路径是:$TEMP_APP_PATH"
    
    
    #----------------------------------------
    # 2. 将解压出来的.app拷贝进入工程下
    # BUILT_PRODUCTS_DIR 工程生成的APP包的路径
    # TARGET_NAME target名称
    TARGET_APP_PATH="$BUILT_PRODUCTS_DIR/$TARGET_NAME.app"
    echo "app路径:$TARGET_APP_PATH"
    
    rm -rf "$TARGET_APP_PATH"
    mkdir -p "$TARGET_APP_PATH"
    cp -rf "$TEMP_APP_PATH/" "$TARGET_APP_PATH"
    
    
    
    #----------------------------------------
    # 3. 删除extension和WatchAPP.个人证书没法签名Extention
    rm -rf "$TARGET_APP_PATH/PlugIns"
    rm -rf "$TARGET_APP_PATH/Watch"
    
    
    
    #----------------------------------------
    # 4. 更新info.plist文件 CFBundleIdentifier
    #  设置:"Set : KEY Value" "目标文件路径"
    /usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$TARGET_APP_PATH/Info.plist"
    
    
    #----------------------------------------
    # 5. 给MachO文件上执行权限
    # 拿到MachO文件的路径WeChat
    APP_BINARY=`plutil -convert xml1 -o - $TARGET_APP_PATH/Info.plist|grep -A1 Exec|tail -n1|cut -f2 -d\>|cut -f1 -d\<`
    #上可执行权限
    chmod +x "$TARGET_APP_PATH/$APP_BINARY"
    
    
    
    #----------------------------------------
    # 6. 重签名第三方 FrameWorks
    TARGET_APP_FRAMEWORKS_PATH="$TARGET_APP_PATH/Frameworks"
    if [ -d "$TARGET_APP_FRAMEWORKS_PATH" ];
    then
    for FRAMEWORK in "$TARGET_APP_FRAMEWORKS_PATH/"*
    do
    
    
    echo "证书名称:$EXPANDED_CODE_SIGN_IDENTITY"
    
    #签名
    /usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"
    done
    fi
    
    #注入
    #yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/HankHook.framework/HankHook"
    
    
    • 通过运行知道 ,shell执行路径为工程根路径 $(SRCROOT)


      e64430c39739edc002fdf7ecb54710be
    • 脚本执行


      58fa02d376302308adf70bca93ce196d
    • 通过脚本执行命令,执行脚本…….

    framework注入 工具注入

    1. 为什么重签名?
    • 签名->破解->调式->执行我们自己的代码
    1. 应用执行的代码?
    • 1.machO文件(需要汇编来改) 系统文件(不能改) framework (可以加一个自己的)

    猜想:我们往重签名的app中加入自己的framework,但是加进去如何执行?

    首先,了解一下macho文件,首先查看WeChat的文件
    load commands 代码依赖的一些库,等等一些信息,都是统一由>dyld加载—>动态库加载到内存

    b49f1a354b0bdf3fea68b34a914aaa91
    • 手动注入
      1. 新建framework工程,创建一个类,写入一段代码


      bb635a4c0d8ef495539f6a361fbe2a27
      a921c2ba1a9cf89b6f2352d2cf053d17
      2. 然后编译一下,查看framework是否编译进去,真机编译,真机编译 真机编译,创建framework 都要编译一下
      ![0189b48a0262da2fd1d456d4b51bee8f](https://img.haomeiwen.com/i2280900/2fe5cce692913a7e.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
      
      3. 已经在包里面.但是此刻运行肯定还是不会调用,因为WeChat二进制文件,并没有包含这个文件,此时要借助大神脚本,操作一下.改变load comamnd,通过yololib指令修改wechat的二进制内容,yololib,放在 ,一定要有执行权限.
      4. yololib
      ![8ac36d152685b2c25980c630dcad6105](https://img.haomeiwen.com/i2280900/f133dd256c826445.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
      5. 命令执行,修改WeChat
      ![791f08a2852fcb0ecd4151298762423e](https://img.haomeiwen.com/i2280900/200b991995353f6b.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
      6. 然后查看macho文件里面是否包含我们自己的库
      ![b7ec0f0b57082dc363c235fd4367a82a](https://img.haomeiwen.com/i2280900/e89cc083827cf076.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
      7. 疑问:替换好的Wecha二进制文件,去替换哪里的WeChat? 下面那个
      ![4d86a91b42c0459c47a9c198028f6d9c](https://img.haomeiwen.com/i2280900/606f0458b72d2a6d.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
      ![1cef89859aa76f4f271ee3c27c98f2c6](https://img.haomeiwen.com/i2280900/d19b766a1deb2c90.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
      
      8. 很明显,每次都会解压编译,要替换最初的,也就是ipa包里面 ,所以先解压,替换,压缩成ipa包
      
      9. 然后开始运行项目….. 打印出我们注入的代码![cd1ead89de3082a7edc0b1475fc1cb30](https://img.haomeiwen.com/i2280900/a5c3f412508ab360.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
      10. 步骤
      ![95fbaa6958fdb3242bac82e90b757f53](https://img.haomeiwen.com/i2280900/e86d8e913d4ed988.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
      
    • 脚本注入

      1. 手动修稿二进制太麻烦,直接将yololib 写成脚本


        a95d3cb500a052a29119c0432114ae68
      2. 执行


        e707e03becb0da725a2a19176b670f1d

      dyld注入

      • 创建dyld,真机运行


        2e197cdece2257d8a6c68774a0edf4da
      • 把自动签名一些文件拷贝过来,脚本也要写,运行发现,framework里面并没有,注入的包.

        1. masOS,改成iOS才能用 a612a531ed6e1a8fdae80f3ff9262ef4
        2. 修改签名


          3fee6ac58fa4ac41b9ab4ff66e82ea42
        3. 手动加一下动态库,让xcode帮我移过去


          5d21d692d34f54cef5ed0b5556448eaa
        4. 修改脚本,为dylib


          3b6e5ba68682b306a0285aeddcd50519
        5. 运行….


          fb7a087c9ab060a220b000f80f01a5a1

    相关文章

      网友评论

          本文标题:03-04---iOS应用签名及重签名技术--Shell脚本&代

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