iOS非越狱逆向——ipa重签名

作者: 这人很懒 | 来源:发表于2018-05-10 22:58 被阅读148次

    在iOS逆向开发时需要把下载的ipa文件安装到iOS设备上,才能进行动态分析,才能更好的玩别人的App。但是有经验的同学是知道的,下载的ipa(AppStore 和自己发布的除外) 文件是不能直接安装到自己的iPhone (未越狱)上的。为什么?因为苹果爸爸作了一个比较复杂的加密---签名。那又有同学问了什么是签名呢?为什么要签名呢?来看看这里

    iOS App签名原理

    为了把下载的ipa 安装到我们自己的iPhone 上要先对ipa 进行重签名。

    常见的 ipa 重签名方式

    • 完全重签名
      证书,mobileprovision、Bundle ID 三者信息对应一致,这种重签名方式基本上与直接对代码进行签名的效果是一样的;
      优点:有效期长、稳定性高;
      缺点:维护成本较高,每一个重签名的ipa都必须修改Bundle ID 并且独享一套证书和mobileprovision文件;
      适用范围:对签名效果稳定性有要求的公司和团队;

    • 不完全重签名
      只保证证书和mobileprovision对应一致,至于这两者与原ipa的Bundle ID 等信息是否一致则不考虑;
      优点:看起来较方便维护;
      缺点:实际上并没有对原ipa的签名进行完全替换,很容易重签名失败,稳定性不高,多则一两个月,少则三五天就可能发生签名失效,需要重新签名,慎用!!
      适用范围:市面上出售企业证书进行重签名的个人卖家;

    常见的 ipa 重签名工具

    1. 终端 使用命令行
      需要记忆的命令比较多,步骤比较繁琐,效率比较低。但是显得逼格够高,装 X 利器。

    2. MonkeyDev
      大牛写的工具插件,配置好就能直接用。效率比较高,跟自己创建新的Xcode 项目差不多。但是比较依赖工具,万一哪一天大牛不开心,不维护或者是需要收费了就比较尴尬

    3. Xcode 自动化重签
      Xcode 简单易操作( 我就不信苹果爸爸会把Xcode 放弃或收费),可以达到类似MonKeyDev 的效果(想想自己可以写一个自动化重签的插件是不是也很牛X)。 前期需要写一些脚本可能会比较繁琐,但要是你脚本写的够好几乎是一劳永益的。以后直接拿来用就好了。

    ipa 重签过程中需要注意的地方

    1. 由于个人证书不能重签 Extension 文件,所以要删除 ipa 包中的 Extension 文件。包括 Watch 里边的 Extension。为了方便我们一般直接把 Watch 文件删除。
      以微信为例:
    Watch PlugIns
    1. ipa 文件中的第三方 framework 需要我们手动重签。
    Frameworks
    1. 更新下 info.plist 主要是修改 CFBundleIdentifier
    2. 一定要给MackO 文件更改下执行权限。

    操作一下(以Xcode 自动化重签为例)

    1. 创建一个新的 Xcode 工程 这里不用解释了
    2. 在Xcode 工程里添加一个脚本 TARGETS -->Build Phases --> +号 -->New Run Script Phse
    New Run Script Phse

    接下来脚本开撸:

    先屡一下思路
    1. 在Xcode 工程文件夹里边 创建一个App 文件夹(用来存放需要重签的ipa 文件),
    2. 将ipa 文件解压到本地的Temp 文件夹里边
    3. 将解压出来的.app拷贝进入工程下工程生成的APP包的路径下并将名称命名为当前工程的名字(覆盖掉之前的.app文件)。
    4. 删除extension和WatchAPP文件。
    5. 更新info.plist文件 CFBundleIdentifier
    6. 给MachO文件上执行权限
    7. 重签名第三方 FrameWorks
    8. 执行签名命令
    上脚本
    # ${SRCROOT} 它是工程文件所在的目录
    TEMP_PATH="${SRCROOT}/Temp"
    #资源文件夹
    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文件的路径
    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
    
    #签名
    /usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"
    done
    fi
    
    

    脚本写完了,可以保存到本地 下次用的时候可以直接导入本地脚本路径就好了。

    接下来就搞一下。
    直接编译运行 就可以将微信跑到手机上了,完美实现微信双开。

    当然实现微信双开不是我们逆向开发的目的,我们额目的是没有蛀牙 --- 咳咳,是为了修改别人的东西,更是为了学好iOS的防护,让自己的App 更安全。

    注意:这里需要自己下载砸壳了的ipa包,PP助手就可以下。如果有越狱设备的话也可以选择自己砸壳。

    逆向是为了学习怎么做才能使自己的app 更安全,而不是为了其他灰色的东西。

    特别鸣谢

    潭州学院 Hank 老师

    https://www.jianshu.com/p/52deb349d5d1

    https://www.jianshu.com/p/a7bbcdf93174

    相关文章

      网友评论

      • 648e3f5bc869:请问个人开发者可以完全重签名吗?
      • boxKUn:可以修改ipa的版本号之类的东西吗?
        648e3f5bc869:@boxKUn 请问个人开发者可以完全重签名吗?
        xwf_code:你好,可以跑到手机上了,请问如何重新打包呢,尝试过打包显示未签名 求指教
        这人很懒:@boxKUn 可以的

      本文标题:iOS非越狱逆向——ipa重签名

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