iOS 逆向 day 17 给AppStore下载的APP重签名,装入其他手机

一、先尝试将 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文件,拿到 Mac 上。

  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. 分别对 CydiaSubstratelive4iphoneqqvediotweak.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

五、暂时无法解答的问题

为什么 pp 助手 爱思助手,可以在未越狱的用户手机上安装 App Store 呢?而且没有企业证书的信任提示。

  • 这种安装的 APP 有个两个特点:①是无法更新,②在你进行换手机备份软件时,会要求你输入一个你不认识的 APPID 来获得 APP 的继续使用权。
  • 基于上面的特点,我猜测很可能是是一种共享 APPID 的技术,并且他们模拟了一个 iTunes 来给我们的手机安装 APP。更多的细节就不得而知了。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342