美文网首页
逆向 - 应用重签名

逆向 - 应用重签名

作者: Mjs | 来源:发表于2021-06-07 17:55 被阅读0次

    方式1:Codesign重签名

    在iOS中,Xcode为我们提供了签名工具,即codesign,通过一些命令即可完成重签名,如下所示

    • $security find-identity -v -p codesigning: 列出钥匙串里可签名的证书

    • $Codesign –fs “证书串” 文件名 :强制替换签名

    • $Chmod +x 可执行文件 : 给文件添加权限

    • $security cms -D -i ../embedded.mobileprovision :查看描述文件

    • $codesign -fs “证书串” --no-strict --entitlements=权限文件.plist APP包

    • $Zip –ry输出文件 输入文件 将输入文件压缩为输出文件

    如何获取越狱手机的ipa包

    • 1、建立链接:sh usbConnect.sh

    • 2、连接手机:sh usbX.sh

    • 3、查看进程:ps -A

    • 4、筛选进程,找到微信进程:ps -A | grep WeChat

    • 5、拷贝:scp -r -P 12345 root@localhost:路径 ./

    • 6、查看拷贝的app包:cd WeChat.app

    • 7、查看可执行文件:otool -l WeChat | grep crypt (此时的cryptid 是 1,表示加密过的)

    • 8、查看app的权限:codesign -vv -d WeChat.app (有签名权限)

    准备工作

    注:所需的资料可在这里获取链接,密码:b66a
    也可以通过iTunes 下载包

    • 1、准备一个微信的越狱包,这里准备的是通过MyZip解压 微信-7.0.8.ipa

      • 其中的WeChat.app包含两个东西:app + app签名信息

        image
    • 2、查看app包的签名信息(CMD+G): codesign -vv -d WeChat.app

      image
    • 3、查看钥匙串的证书:security find-identity -v -p codesigning

    • 4、查看可执行文件详细信息:otool -l WeChat > ~/Desktop/123.txt。其中有cryptid加密id(0表示没有使用加密算法)

    codesign重签名步骤

    给应用重签名的步骤如下:

    • 1、删除插件和带有插件的.app包(例如Watch、plugins)

    • 2、对Frameworks里面的库进行重签名

    • 3、给可执行文件 +x(可执行)权限

    • 4、新建一个空工程

    • 5、添加描述文件(4中的空工程通过真机编译得到,且要运行,因为需要将描述文件安装到手机)

    • 6、替换.app包中BundleID(.app包中info.plist文件的BundleID要和描述文件中的BundleID保持一致)

    • 7、通过授权文件(Entilements)重签.app包、

      • 1)查看描述文件:$security cms -D -i embedded.mobileprovision

      • 2)将描述文件中Entilements 拷贝出来,生成plist文件。(文件名称entitlements.plist

      • 3)用权限文件签名APP包: $ codesign -fs "Apple Development: XX(XX)" --no-strict --entitlements=entitlements.plist WeChat.app

    • 8、最后通过Xcode安装

    • 注:mach-o最重要的两块:代码块 + 数据块,其中加密主要是加密代码

    codesign重签名演示
    • 前提:

      • 需要签名:wechat可执行文件(即Mach-O文件) + Frameworks

      • 需要删除:Plugins(免费普通账户无法签名,可以删除) + Watch(也无法签名,删除)

    • 1、查看Frameworks,也是有签名信息的:codesign -vv -d andromeda.framework

      image
    • 2、重签名Frameworks:codesign -fs "Apple Development: 916770982@qq.com (565XXC9ZYA)" andromeda.framework

    ➜  Frameworks codesign -fs "Apple Development: 916770982@qq.com (565XXC9ZYA)" andromeda.framework
    andromeda.framework: replacing existing signature
    ➜  Frameworks codesign -fs "Apple Development: 916770982@qq.com (565XXC9ZYA)" mars.framework 
    mars.framework: replacing existing signature
    ➜  Frameworks codesign -fs "Apple Development: 916770982@qq.com (565XXC9ZYA)" marsbridgenetwork.framework 
    marsbridgenetwork.framework: replacing existing signature
    ➜  Frameworks codesign -fs "Apple Development: 916770982@qq.com (565XXC9ZYA)" matrixreport.framework 
    matrixreport.framework: replacing existing signature
    ➜  Frameworks codesign -fs "Apple Development: 916770982@qq.com (565XXC9ZYA)" OpenSSL.framework 
    OpenSSL.framework: replacing existing signature
    ➜  Frameworks codesign -fs "Apple Development: 916770982@qq.com (565XXC9ZYA)" ProtobufLite.framework 
    ProtobufLite.framework: replacing existing signature
    

    然后执行退出 cd ..

    • 3、查看可执行文件:ls -l WeChat
    ls -l WeChat
    -rwxr-xr-x@ 1 xxx  staff  126048560 10 16  2019 WeChat
    
    • 注:重签名必须要有可执行权限,即 - x

    • 4、新建一个工程,运行 ,进入得到的包中,获取Apple Development: 916770982@qq.com (565XXC9ZYA)对应的描述文件 ,例如 xxx xxx(Personal Team) 获取可执行文件中的描述文件,拷贝至WeChat包

    • 5、描述文件和BundleID有关系,需要修改WeChat的BundleID com.tencent.xinxxx.com.test

    • 6、查看描述文件的权限:security cms -D -i embedded.mobileprovision

      image

      查看Entitlements(权限),是一个plist文件

      image

      将其拷贝至一个plist文件(名称为entitlements,需要新建)(路径:propertyList - open sourceCode - 拷贝 <dict></dict>)

      image

      将其拷贝至payload文件夹中

    • 7、签名app(即mach-o签名):codesign -fs "Apple Development: xxxxxxxxx@qq.com (565XXC9ZYA)" --no-strict --entitlements=Entitlements.plist WeChat.app

    • 8、查看WeChat签名:codesign -vv -d WeChat.app, 此时签名信息已经替换

    ➜  Payload codesign -vv -d WeChat.app
    Executable=/Users/jiangshicheng/Desktop/逻辑进阶IOS/逆向/010--应用重签名原理/资料/微信-7.0.8/Payload/WeChat.app/WeChat
    Identifier=com.jsc.weChatDemo
    Format=app bundle with Mach-O thin (arm64)
    CodeDirectory v=20400 size=972598 flags=0x0(none) hashes=30383+7 location=embedded
    Signature size=4819
    Authority=Apple Development: 916770982@qq.com (565XXC9ZYA)
    Authority=Apple Worldwide Developer Relations Certification Authority
    Authority=Apple Root CA
    Signed Time=Jun 2, 2021 at 2:36:45 PM
    Info.plist entries=68
    TeamIdentifier=99EJLR3Y3N
    Sealed Resources version=2 rules=10 files=1470
    Internal requirements count=1 size=184
    
    • 9、安装

      image
    • 10、调试:Debug - Attach to process - WeChat

    Codesign重签名缺点:过程太繁琐

    方式2:Xcode重签名

    下面我们通过Xcode来进行重签名,步骤如下:

    • 1、删除Plugins、Watch

    • 2、重签名Frameworks

    • 3、创建并运行一个空工程

    • 4、修改Info.plist中的BundleID改为 空工程的BundleID

    • 5、利用修改后的app包,替换空工程的app包

    • 6、直接运行

    与CodeSign重签名相比:少了其中的3(执行文件权限)、5(添加描述文件)、7(通过授权文件重签.app包)

    xcode重签名演示

    • 1、将product中的WeChat替换成 需要我们之前重签名的WeChat

      image
    • 2、CMD+R再次运行

    方式3:Shell脚本

    shell重签名演示

    准备工作
    首先跑一遍空项目获得签名信息

    • 项目中配置shell:Build Phase -> + Run Script,会在编译时执行
      • ./ 表示工程目录
      • SRCROOT (环境变量)-- 根目录

    shell重签名演示

    • 1、根目录下创建shell文件: touch 123.sh

    • 2、添加执行权限: chmod +x 123.sh

    • 3、Run Script 中直接执行 123.sh :./123.sh

    其中123.sh中的重签名脚本如下所示,主要有以下几步:

    • 1、解压IPATemp

    • 2、将解压出来的.app拷贝进入工程下

    • 3、删除extensionWatchAPP,因为个人证书没法签名Extention

    • 4、更新info.plist文件 CFBundleIdentifier

    • 5、给Mach-O文件上执行权限

    • 6、重签名第三方 FrameWorks

    • 7、替换签名

    # ${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" "目标文件路径"
    # PlistBuddy工具修改info.plist文件中的BundleID为工程的BundleID
    /usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$TARGET_APP_PATH/Info.plist"
    
    #----------------------------------------
    # 5\. 给MachO文件上执行权限
    # 拿到MachO文件的路径
    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
    
    #签名 
    #--force --sign 替换签名
    # EXPANDED_CODE_SIGN_IDENTITY 当前工程的证书
    /usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"
    done
    fi
    

    相关文章

      网友评论

          本文标题:逆向 - 应用重签名

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