美文网首页
iOS逆向之砸壳与重签

iOS逆向之砸壳与重签

作者: 崔希羽 | 来源:发表于2021-01-04 01:06 被阅读0次

    本文只是为了学习理解整个过程和原理,砸壳和重签都有很多种简单快速的方式,本文不探讨

    iPhone配置
    越狱,本人使用的是iphone6s plus 12.4(非完美越狱),最好是能完美越狱,因为有些工具可能不支持非完美越狱手机,截止2020年底12.2以下均可完美越狱,可在pp助手、爱思助手查看。

    • 下载爱思助手,安装并打开后找到刷机越狱,选择一键越狱,在右侧找到CheckRa1n越狱,按照提示操作,完成之后手机中会多出一个黑色图标的软件CheckRa1n
    • 打开CheckRa1n,点击安装cydia,本人在安装过程中一直卡在了Downloading Base system界面不动,最后使用科学上网才安装成功。
    • 下载frida,打开越狱手机中应用cydia添加源:https://build.frida.re,然后搜索frida并安装,根据手机选择frida版本,6s选择Frida for pre-A12 devices

    Mac配置

    • 安装工具
    brew install python  #安装python
    brew install wget #安装wget
    #安装pip
    wget https://bootstrap.pypa.io/get-pip.py
    sudo python get-pip.py
    
    pip3 install frida  #安装frida
    pip3 install firda-tools #安装frida命令行工具
    
    • 安装脚本依赖环境下载python3脚本,cd到frida-ios-dump目录,并执行,过程中需要输入电脑密码
    sudo pip3 install -r requirements.txt --upgrade
    
    • 安装usbmuxd与手机通信
    brew install usbmuxd   #安装usbmuxd
    

    连接

    • 手机与电脑均配置完成,下面开始通过USB使用ssh连接设备,首先可以通过终端命令检查是否可以工作frida-ps -U,若可用会输出PID - Name列表。
    • 使用终端将22映射到电脑上的2222端口,也可使用其他端口,但要保证映射和访问时使用同一个,并且dump.py脚本中也要同步进行修改。
    iproxy 2222 22
    

    此时终端会输出➜ waiting for connection,再打开一个终端窗口,使用ssh登录iphone手机

    ➜  ~ ssh root@127.0.0.1 -p 2222
    root@127.0.0.1's password: #这里密码默认的是alpine
    iPhone:~ root#
    

    到了这一步ssh登录成功,下面就可以使用dump.py脚本查看手机里的应用了。

    注:我这里使用ssh访问没有成功,折腾半天一直报错ssh_exchange_identification: read: Connection reset by peer最终放弃。采用了第二方案,使用爱思助手 --> 打开SSH通道->弹出提示包含端口,密码,保证dump.py里面一致即可,随后继续后面的步骤


    砸壳

    • 如果是新下载的dump脚本,需要在mac用户目录下,先执行一下source dump.py路径
    • 终端查看手机中的应用:/Users/Mac/frida-ios-dump/dump.py -l
    • 在输出的应用中找到要进行砸壳的bundle Id微信 com.tencent.xin
    • 创建一个文件夹dump,在dump文件夹下执行砸壳,砸壳生成的ipa将会保存到当前执行目录
    • 执行砸壳
    ➜  dump /Users/Peny/frida-ios-dump/dump.py com.tencent.xin
    Start the target app com.tencent.xin
    Dumping 微信 to /var/folders/2_/ts8l68y17cncks73d_vjz4vh0000gn/T
    [frida-ios-dump]: OpenSSL.framework has been loaded.
    [frida-ios-dump]: ProtobufLite.framework has been loaded.
    [frida-ios-dump]: andromeda.framework has been loaded.
    [frida-ios-dump]: mars.framework has been loaded.
    [frida-ios-dump]: marsbridgenetwork.framework has been loaded.
    [frida-ios-dump]: matrixreport.framework has been loaded.
    start dump /var/containers/Bundle/Application/3356DDD1-7B64-4B8E-AA2D-0F7BAA394A9A/WeChat.app/WeChat
    WeChat.fid: 100%|███████████████████████████████████████████████████████████████████████████| 144M/144M [00:04<00:00, 33.9MB/s]
    start dump /private/var/containers/Bundle/Application/3356DDD1-7B64-4B8E-AA2D-0F7BAA394A9A/WeChat.app/Frameworks/mars.framework/mars
    mars.fid: 100%|███████████████████████████████████████████████████████████████████████████| 12.7M/12.7M [00:00<00:00, 32.7MB/s]
    start dump /private/var/containers/Bundle/Application/3356DDD1-7B64-4B8E-AA2D-0F7BAA394A9A/WeChat.app/Frameworks/andromeda.framework/andromeda
    andromeda.fid: 100%|██████████████████████████████████████████████████████████████████████| 8.71M/8.71M [00:00<00:00, 31.2MB/s]
    start dump /private/var/containers/Bundle/Application/3356DDD1-7B64-4B8E-AA2D-0F7BAA394A9A/WeChat.app/Frameworks/OpenSSL.framework/OpenSSL
    OpenSSL.fid: 100%|████████████████████████████████████████████████████████████████████████| 2.38M/2.38M [00:00<00:00, 27.1MB/s]
    start dump /private/var/containers/Bundle/Application/3356DDD1-7B64-4B8E-AA2D-0F7BAA394A9A/WeChat.app/Frameworks/ProtobufLite.framework/ProtobufLite
    ProtobufLite.fid: 100%|█████████████████████████████████████████████████████████████████████| 205k/205k [00:00<00:00, 10.0MB/s]
    start dump /private/var/containers/Bundle/Application/3356DDD1-7B64-4B8E-AA2D-0F7BAA394A9A/WeChat.app/Frameworks/marsbridgenetwork.framework/marsbridgenetwork
    marsbridgenetwork.fid: 100%|██████████████████████████████████████████████████████████████| 2.40M/2.40M [00:00<00:00, 27.6MB/s]
    start dump /private/var/containers/Bundle/Application/3356DDD1-7B64-4B8E-AA2D-0F7BAA394A9A/WeChat.app/Frameworks/matrixreport.framework/matrixreport
    matrixreport.fid: 100%|█████████████████████████████████████████████████████████████████████| 469k/469k [00:00<00:00, 17.3MB/s]
    network_setting.html: 260MB [00:12, 22.2MB/s]
    0.00B [00:00, ?B/s]
    Generating "微信.ipa"
    ➜  dump
    

    重签名方式一

    • 查看电脑安装的所有签名
    ➜  security find-identity -v -p codesigning
      1) 733B3EBFD4132FB93F8E21ABC93500B89563E212 "Apple Development: xxxx@163.com (HM4asdfads)"
      2) 6A525348B0F4A138E826DF86C15765EC220CAD57 "Apple Development: xxxx (LP48asdfad)"
      3) 1A5BABAD6111FD9C1B947BC7E7B39BF07F28690F "Apple Distribution: Beijing xxxxx (55Wdsasdfadsf)"
         3 valid identities found
    
    • 解压ipa,cd到Payload目录下,查看wechat的签名信息
    ➜  codesign -vv -d WeChat.app
    Executable=/Users/XXX/Desktop/dump/Payload/WeChat.app/WeChat
    Identifier=com.tencent.xin
    Format=app bundle with Mach-O thin (arm64)
    CodeDirectory v=20500 size=2308891 flags=0x0(none) hashes=36071+7 location=embedded
    Signature size=4390
    Authority=Apple iPhone OS Application Signing
    Authority=Apple iPhone Certification Authority
    Authority=Apple Root CA
    Info.plist entries=72
    TeamIdentifier=88L2Q4487U
    Sealed Resources version=2 rules=22 files=1683
    Internal requirements count=1 size=96
    
    • cd到WeChat.app目录,查看machO文件的信息,在Load commond中有一个LC_ENCRYPTION_INFO_64类型用来表示加密的cryptid字段,0表示没有加密,1表示AppStore对整个app包进行对称加密过的(其在运行时的内存中解密,因此它必须要高效率,所以使用的对称加密)。可以使用爱思助手下载其他的app验证一下otool -l WeChat | grep crypt
    ➜  WeChat.app otool -l WeChat
    
    ...
    Load command 12
              cmd LC_ENCRYPTION_INFO_64
          cmdsize 24
         cryptoff 16384
        cryptsize 121225216
          cryptid 0   # 0代表没有加密,1代表加密
              pad 0
    Load command 13
    ...
    
    • 删除插件和带有插件的app包(Watch文件夹)。
    • Frameworks里面的库进行重签名
    ➜  WeChat.app cd Frameworks
    ➜  Frameworks codesign -fs "Apple Development: xxxx@163.com (HM4asdfads)"  xxx.frameworks
    
    • 检查WeChat可执行文件权限,如果它是白色的需要改一下权限chmod -x WeChatchmod 777 WeChat;如果是黑色说明是有执行权限的。
    • 创建一个demo工程,真机运行,将生成的demo.app包内的embedded. mobileprovision复制出来,放到WeChat.app目录下
    • 修改Info.plist文件中的Bundle Id
    • 通过授权文件(Entitlements)重签app
      终端命令:security cms -Di embedded.mobileprovision,提取Entitlements里面的内容并创建一个新的plist文件,命名可随意:如ent.plist
    ➜  WeChat.app security cms -Di embedded.mobileprovision
    ...
    <key>Entitlements</key>
        <dict>
            <key>application-identifier</key>
            <string>HM4asdfads.con.xxxx.demo*</string>
            <key>keychain-access-groups</key>
            <array>
            <string>HM4asdfads.*</string>
            <string>com.apple.token</string>
            </array>
            <key>get-task-allow</key>
            <true/>
            <key>com.apple.developer.team-identifier</key>
            <string>55WHPN47NF</string>
        </dict>
    ...
    

    将<dict></dict>中的内容填充到ent.plist文件中,接下来就可以使用ent.plistWeChat.app进行签名了

    ➜  WeChatDemo ls
    AppDelegate.h     AppDelegate.m     Assets.xcassets   Base.lproj        Info.plist        SceneDelegate.h   SceneDelegate.m   ViewController.h  ViewController.m  WeChat.app        ent.plist         main.m
    ➜  WeChatDemo codesign -fs "Apple Development: xxxx@163.com (HM4asdfads)" --no-strict --entitlements=ent.plist WeChat.app
    WeChat.app: replacing existing signature
    ➜  WeChatDemo
    

    重签名方式二

    使用xcode创建同名工程,这里的同名指的是target一致,xcode根据target在run的时候生成app文件。新创建一个WeChat或者在任意一个工程的TARGETS添加WeChat都可以。

    • 运行同名工程,得到一个.app文件
    • 打开砸壳后的app,删除里面的插件和带有插件的app包(Watch文件夹)。
    • Frameworks里面的库进行重签名
    • 不需要改bundle id,描述文件等,直接将上面两步操作之后的app文件替换同名工程中的app文件,然后xcode run。

    重签名方式三
    借助xcode中Run Script,编写shell脚本,实现自动重签,主要是脚本的编写,引用一下别人写的脚本示例:

    # ${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文件的路径
    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
    

    PS:本人只是为了学习和研究,如有冒犯请多多见谅~

    相关文章

      网友评论

          本文标题:iOS逆向之砸壳与重签

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