美文网首页iOS 开发 Objective-C
iOS 底层 day 17 给AppStore下载的APP重签名

iOS 底层 day 17 给AppStore下载的APP重签名

作者: 望穿秋水小作坊 | 来源:发表于2020-08-11 17:36 被阅读0次

    一、先尝试将 App Store 下载的 app 直接装入其他未越狱手机

    1. 首先使用越狱手机上下载 腾讯视频 app,然后找到它的 APP 路径,将 live4iphone.app 找出来。拷贝到 Mac 电脑上。

    2. Mac 电脑上创建一个 Payload 文件夹,将 live4iphone.app 放进文件夹,然后进行 zip 压缩,压缩完毕后,重命名为 Payload.ipa ,这样一个 iPhone 的安装包程序就搞好了。

    3. 我们使用 iFunBox 程序将 ipa 装到未越狱的手机,打开 console.app,获得如下错误:

      报错日志
    4. console.app,我们可以得知是签名不合法导致。我们猜测会不会是未脱壳的原因呢?接下来我们把 live4iphone 脱壳,然后重复上面的步骤,获得的错误依然如上图所示。

    5. 由此,我们可以得知,从 App Store 的应用是不能轻易安装到其他手机的,即使脱壳了也不行。

    二、将 APP 进行重签名,安装到未越狱手机

    1. 我们先去开发者账号后台,配置一个通配符的 .mobileprovision 证书文件(需要将我们目标手机的 UDID 加入到证书的 devices 列表中),用于我们后面的重签名。

    2. embedded.mobileprovision 文件中提取出 entitlements.plist 权限文件,指令如下(mac 自带指令):

    carrot__lsp$ security cms -D -i embedded.mobileprovision > temp.plist
    carrot__lsp$ /usr/libexec/PlistBuddy -x -c 'Print:Entitlements' temp.plist > entitlements.plist
    
    1. 使用 security find-identity -v -p codesigning 指令获得我们的可用开发者证书。
    carrot__lsp$ security find-identity -v -p codesigning
    1)  0D3C41A788FF61D05F6xxxxAD8AE2D7xxxx97084 "Apple Development: Su Mxx Yxxx (AGV6XXXXXV)"
    
    1. 使用我们的开发者证书给 live4iphone 签名,并且将embedded.mobileprovision 放入 live4iphone.app
    carrot__lsp$ codesign -fs  0D3C41A788FF61D05F6xxxxAD8AE2D7xxxx97084 live4iphone 
    live4iphone: replacing existing signature
    
    1. 使用 codesign 为整个 live4iphone.app 签名
    carrotdeMacBook-Pro:Payload carrot__lsp$ codesign -fs  0D3C41A788FF61D05F6xxxxAD8AE2D7xxxx97084 --entitlements entitlements.plist live4iphone.app 
    live4iphone.app: replacing existing signature
    
    1. live4iphone.app 入上面所述方法打包成 live4iphone.ipa ,使用 iFunBox 安装到我们的未越狱手机中。~~安装成功,可以在其他手机打开我们安装的软件。

    三、将 APP 进行hook,加入自己代码,安装到未越狱手机

    步骤二所实现的只是将App Store 下载的 APP 通过我们的证书重新签名,并安装到其他手机,这似乎没有啥实际意义。接下来我们挑战更有意义的,将 APP 加入我们的代码,然后装到别人的手机上去。思路和步骤二几乎一致,下面仅仅介绍不同的地方。

    1. 编写 tweak 代码,hook 我们的目标 APP,并按照到越狱手机中。比如我这里是让 live4iphone 永远不展示启动广告,迅速进入 APP。

    2. 找到我们编写的 tweak 代码, 在手机上生成的动态库。路径如下 /Library/MobileSubstrate/DynamicLibraries/,找到 qqvediotweak.dylib 文件,拿到 Mac 上。

    3. 在手机的 /Library/Frameworks/CydiaSubstrate.framework/ 目录下获取 CydiaSubstrate文件,拿到手机上。

    4. 我们把 CydiaSubstrateembedded.mobileprovisionqqvediotweak.dylib 三个文件都放入 live4iphone.app 中,还要确保 live4iphone.app 已脱壳。

    5. 接下来我们要思考如何让 live4iphone 加载我们的 qqvediotweak.dylib 代码呢?可以使用 insert_dylib 库将动态库注入到 Mach-O 文件中,下载地址 https://github.com/Tyilo/insert_dylib
      用法如下:

    // 将代码从 github 下载,用 xcode 编译生成 `insert_dylib` 可执行文件,放入 /usr/local/bin 目录下
    
    carrot__lsp$ insert_dylib @executable_path/qqvediotweak.dylib live4iphone --weak -all-yes live4iphone
    insert_dylib: invalid option -- a
    Usage: insert_dylib dylib_path binary_path [new_binary_path]
    Option flags: --inplace --weak --overwrite --strip-codesig --no-strip-codesig --all-yes
    carrot__lsp$ insert_dylib @executable_path/qqvediotweak.dylib live4iphone --weak --all-yes live4iphone
    live4iphone already exists. Overwrite it? [y/n] y
    Binary is a fat binary with 2 archs.
    LC_CODE_SIGNATURE load command found. Remove it? [y/n] y
    LC_CODE_SIGNATURE load command found. Remove it? [y/n] y
    Added LC_LOAD_WEAK_DYLIB to all archs in live4iphone
    carrot__lsp$ otool -L live4iphone | grep qqvedio
        @executable_path/qqvediotweak.dylib (compatibility version 0.0.0, current version 0.0.0, weak)
        @executable_path/qqvediotweak.dylib (compatibility version 0.0.0, current version 0.0.0, weak)
    
    1. 我们通过 otool 可以查看动态库中加载其他动态库的情况,我发现 qqvediotweak.dylib 依赖了 CydiaSubstrate 动态库,但是路径不对,如何修改路径呢?
    carrot__lsp$ otool -L qqvediotweak.dylib | grep Cydia
        /Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate (compatibility version 0.0.0, current version 0.0.0)
    
    carrot__lsp$ install_name_tool -change /Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate @loader_path/CydiaSubstrate qqvediotweak.dylib
    
    1. 分别对 CydiaSubstrateembedded.mobileprovisionqqvediotweak.dylib 进行动态库签名
    carrot__lsp$ codesign -fs  0D3C41A788FF61D05F6xxxxAD8AE2D7xxxx97084 live4iphone 
    carrot__lsp$ codesign -fs  0D3C41A788FF61D05F6xxxxAD8AE2D7xxxx97084 qqvediotweak.dylib 
    qqvediotweak.dylib: replacing existing signature
    carrot__lsp$ codesign -fs  0D3C41A788FF61D05F6xxxxAD8AE2D7xxxx97084 CydiaSubstrate 
    CydiaSubstrate: replacing existing signature 
    
    1. live4iphone.app 重签名
    carrot__lsp$ codesign -fs  0D3C41A788FF61D05F6xxxxAD8AE2D7xxxx97084 --entitlements entitlements.plist live4iphone.app 
    live4iphone.app: replacing existing signature
    
    1. 打包成ipa,安装到新的手机上,一切顺利,开屏广告不见了,APP 正常运行。

    四、iOS 重签名知识点补充

    1. 重签名 GUI 工具 - iOS App Signer
    1. 指令 otool -L xxx动态库
    • 该指令可以查看动态库依赖其他动态库的情况
    • 使用 MachOView 中的 LoadCommond 字段也可以查看动态库依赖情况
    1. 动态库注入
    • 可以使用 insert_dylib 库将动态库注入到 Mach-O 文件中
    • 下载地址 https://github.com/Tyilo/insert_dylib
    • 用法: insert_dylib 动态库加载路径 Mach-O文件
    • --weak,即使动态库找不到也不会报错
    • --all-yes,后面所有的选择都为 yes
    • insert_dylib 的本质是往 Mach-O 文件的 Load Commands 中添加一个 LC_LOAD_DYLIB 或者 LC_LOAD_WEAK_DYLIB
    1. 更改动态库加载地址
    • 可以使用 install_name_tool 修改 Mach-O 文件中动态库的加载地址
    • 用法: install_name_tool -change 旧地址 新地址 Mach-O文件
    • @executable_path 代表可执行文件所在的目录
    • @loader_path 代表动态库所在的目录
    1. 一些注意的点
    • 安装包中的可执行文件必须是经过脱壳的,重签名才会有效
    • .app包内部所有动态库(.framework、.dylib)、AppExtension(PlugIns 文件夹,拓展名是 appex)、WatchApp(Watch文件夹)都需要重新签名
    1. 重新签名打包后,安装到设备过程中,可能需要经常查看设备的日志信息
    • 程序运行过程中:Window → Devices and Simulators → View Device Logs
    • 程序安装过程中:Window → Devices and Simulators → Open Console

    相关文章

      网友评论

        本文标题:iOS 底层 day 17 给AppStore下载的APP重签名

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