iOS 开发 Objective-C

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

2020-08-11  本文已影响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动态库
  1. 动态库注入
  1. 更改动态库加载地址
  1. 一些注意的点
  1. 重新签名打包后,安装到设备过程中,可能需要经常查看设备的日志信息
上一篇下一篇

猜你喜欢

热点阅读