美文网首页
iOS App重签名

iOS App重签名

作者: 异想天不开_9950 | 来源:发表于2018-05-15 11:10 被阅读0次

    一、手动重签名:

    我们将通过手动打包、手动安装的方式,把一个越狱的App安装到手机上。
    前提:下载一个越狱的ipa包并解压。

    1. 把目标App包内容里的Plugins文件夹删掉。因为这个插件文件夹里面的内容用免费个人账号没办法进行签名。
    2. 把目标App包内容里的Watch文件夹删掉。因为Watch App里面也有插件,原因同上。
    3. 对目标App包内容里的Frameworks文件夹里面的内容进行签名。
      codesign -fs "证书" xxx.framework
    4. 给目标App包内容里的可执行文件添加执行权限。
      chmod +x 可执行文件
    5. 把目标App包内容Info.plist里的Bundle identifier替换成新建Demo包内容Info.plist里的Bundle identifier。
    6. 把新建Demo包内容里的描述文件拷贝到目标App包内容里。
    7. 把描述文件里的权限文件字典的部分生成plist权限文件。例如:en.plist。把en.plist文件拷贝到目标App同级目录下。这个文件是要在签名整个目标App的时候导入进去的。
    <key>Entitlements</key>
        生成plist权限文件的字典
    <key>ExpirationDate</key>
    
    1. 进入en.plist文件目录下,签名整个目标App。
      codesign -fs "证书" --no-strict --entitlements=en.plist xxx.app
    2. 打包ipa包。
      zip -ry xxx.ipa 要打包的文件夹(en.plist文件的上一级文件夹)
    3. 安装。
      Xcode -> Windows -> Devices and Simulators -> 点击+号选中ipa包,即可安装到手机上。

    二、利用Xcode重签名:

    1. 创建一个Demo,编译过后进入Demo的app目录。把目标App拷贝到该目录下,修改目标App的名字为Demo的app的名字,并把Demo的app删掉。
    2. 重复手动重签名的1、2、3、4、5步。

    三、脚本自动化重签名:

    这个其实也是利用Xcode进行重签名的。

    1. 创建一个Demo,在Build Phases里+一个Run Script,支持Shell脚本。在Demo文件夹(工程文件所在目录)底下新建一个APP(放ipa包)和Temp(放临时的ipa包)文件夹。
    2. 把一个越狱的ipa包拖到APP目录下。
    3. 编写脚本,通过脚本完成自动化重签名。
    # ${SRCROOT} 它是工程文件夹所在目录
    TEMP_PATH="${SRCROOT}/Temp"
    # 资源文件夹
    ASSETS_PATH="${SRCROOT}/APP"
    # ipa包路径
    TARGET_IPA_PATH="${ASSETS_PATH}/*.ipa"
    
    # 保证每次进来,Temp文件夹都是空的
    rm -rf "$TEMP_PATH"
    mkdir -p "$TEMP_PATH"
    
    #-------------------------------------
    # 1.解压ipa包到Temp文件夹下
    unzip -oqq "$TARGET_IPA_PATH" -d "$TEMP_PATH"
    # 拿到解压的临时的APP的路径
    TEMP_APP_PATH=$(set -- "$TEMP_PATH/Payload/"*.app; echo "$1")
    #echo "临时的APP的路径是: $TEMP_APP_PATH"
    
    #-------------------------------------
    # 2.将解压出来的.app拷贝到工程目录下
    # BUILT_PRODUCTS_DIR 工程生成的APP包路径
    # TARGET_NAME target名称
    #echo "APP包路径是: $BUILT_PRODUCTS_DIR"
    
    TARGET_APP_PATH="$BUILT_PRODUCTS_DIR/$TARGET_NAME.app"
    #echo "target app路径: $TARGET_APP_PATH"
    
    rm -rf "$TARGET_APP_PATH"
    mkdir -p "$TARGET_APP_PATH"
    cp -rf "$TEMP_APP_PATH/" "$TARGET_APP_PATH/"
    
    #-------------------------------------
    # 3.为了使重签名过程简化,移走PlugIns和Watch文件夹。此外个人免费的证书没办法签extension
    
    echo "Removing AppExtensions"
    rm -rf "$TARGET_APP_PATH/PlugIns"
    rm -rf "$TARGET_APP_PATH/Watch"
    
    #-------------------------------------
    # 4.更新 Info.plist 里的 Bundle identifier
    # 设置 "Set :KEY Value" "目标文件路径.plist"
    # PlistBuddy 工具是对 plist 文件进行操作的
    
    /usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$TARGET_APP_PATH/Info.plist"
    
    #-------------------------------------
    # 5.给可执行文件上权限
    # 添加ipa二进制的执行权限,否则xcode会告知无法运行
    # 这个操作是要找到第三方app包里的可执行文件名称,因为info.plist的 'Executable file' key对应的是可执行文件的名称
    # 我们grep 一下,然后取最后一行, 然后以cut 命令分割,取出想要的关键信息。存到APP_BINARY变量里
    # 拿到Mach-O文件的路径
    APP_BINARY=`plutil -convert xml1 -o - $TARGET_APP_PATH/Info.plist|grep -A1 Exec|tail -n1|cut -f2 -d\>|cut -f1 -d\<`
    # 这个为二进制文件加上可执行权限 +X
    chmod +x "$TARGET_APP_PATH/$APP_BINARY"
    
    
    # -------------------------------------
    # 6. 重签第三方app 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 "🍺🍺🍺🍺🍺🍺FRAMEWORK : $FRAMEWORK"
    # 签名 --force表示强制签名,用证书签Framework
    /usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"
    done
    fi
    
    # -------------------------------------
    # 7. 注入我们编写的动态库
    echo "开始注入"
    # 需要注入的动态库的路径  这个路径我就写死了!
    INJECT_FRAMEWORK_RELATIVE_PATH="Frameworks/libXPFHook.dylib"
    #
    ## 通过工具实现注入
    yololib "$TARGET_APP_PATH/$APP_BINARY" "$INJECT_FRAMEWORK_RELATIVE_PATH"
    echo "注入完成"
    

    我们也可以把脚本拿出来,形成一个公共文件,这样可以重复利用。在Run Script里面把脚本的路径添加上。需要注意给脚本增加可执行权限。

    相关文章

      网友评论

          本文标题:iOS App重签名

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