美文网首页
iOS脚本重签名和代码注入

iOS脚本重签名和代码注入

作者: 正_文 | 来源:发表于2020-08-20 15:46 被阅读0次

    上一篇文章讲述了手动重签名的整个过程,比较繁琐,而且容易出错,这篇文章来探讨一下shell重签名的实现。

    一、脚本重签名

    1. 依然是新建工程,然后安装到手机上。
    2. 在工程根目录下新建APP的文件夹,和shell脚本对应即可。将砸壳的ipa包放入APP文件夹内。
    3. 把脚本放在根目录下。脚本如下:
    # ${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
    
    
    #签名
    /usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"
    done
    fi
    
    
    1. 此时项目目录结构如下:


      目录.png
    2. 在项目 build Phase -> Run Script 模块添加shell。可以直接将shell代码复制过去;也可以添加一个命令:./app.sh

      image.png

    运行,不出意外项目将完美安装到你的手机。

    如果安装被拒绝,可以尝试命令:chmod +x app.sh

    二、Framework代码注入

    一般修改原始的程序,是利用代码注入的方式,注入代码就会选择利用 framework 或者 Dylib 等三方库的方式注入。
    当然,也可以直接修改 Mach-O 文件。对于 iOS 系统应用来说,需要通过 dyld 去读取 Mach-O,从而决定文件包需要加载哪些库,如何去加载等等。
    因此我们可以修改 Mach-O 文件的 Load Commands ( 加载指令,就是告诉 dyld 如何去加载 ),往其中添加一条指令让其去加载我们自己生成的 framework

    2.1 构建Framework

    利用上面重签成功的工程,新建一个framework,新建一个类MMHook,并添加代码。


    MMHook.png

    编译,显示包内容,查看 Frameworks 文件夹 , 可以看到我们的 framework 已经放进去了。

    MMHook.png

    但还不行,微信的 Mach-O 加载指令 load Commands 里并不会去加载我的这个库,他们并没有关联起来。

    2.2 修改Mach-O

    修改Mach-O,添加指令,需要用到工具yololib
    yololib 复制到 user/local/bin 中,这样环境变量就可以在任意路径下使用了。

    1. 进入项目根目录,找到APP文件下的ipa包,解压,进入到Mach-O路径下
    2. 执行命令:yololib WeChat Frameworks/MMHook.framework/MMHook
    3. 重新压缩 zip -ry WeChat.ipa Payload,改为ipa,然后将ipa包放到APP目录下。注意:官方的ipa和我们自己打的ipa有差别,这里压缩的是Payload文件夹,不是WeChat文件夹。
      yololib.png

    此时可以打开Mach-O查看一下指令是否添加成功:

    load_command.png

    运行:

    hook.png

    2.3 shell注入

    我们把yololib配置好之后,可以通过shell实现注入,直接在之前的shell最后加一行指令即可:

    #framework注入
    yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/MMHook.framework/MMHook"
    #dylib注入,libiary库
    #yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/libMMHookDylib.dylib"
    

    相关文章

      网友评论

          本文标题:iOS脚本重签名和代码注入

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