small-q 发表于 2021-5-18 15:27:22

非越狱环境WeChat插件注入之旅

本帖最后由 small-q 于 2021-5-18 19:56 编辑

0x00 本文由来   笔者对插件抢红包这东西是比较感兴趣的,不知道为什么,反正就是喜欢!然后这就成为了一种动力想去深入研究!由于之前用的是旧的 MBP,很多东西都无法深入去学习实例,都只能在外面磨蹭一下(你懂的),直到今年用上了苹果全新的 M1 ,才有机会进行各种深入学习。   笔者把飘总的《iOS应用逆向与安全之道》https://item.jd.com/12800426.html 购买学习了一遍,在此期间深得飘总和 C 版指导指引,得以解决各种问题(比如手动注入 xx.dylib 为什么死活闪退,而用 MonkeyDev 则能成功注入),带着有问题就要解决的精神请你与笔者一起开启后续学习之旅。
0x01 工具环境
[*]MacBook Pro (M1), iPhone (越狱)
[*]Xcode
[*]xcode-select --install
[*]theos
[*]frida
[*]optool


0x02 事前准备

2.1 提取描述文件这一步可参照《iOS应用逆向与安全之道》第 9.5.1 节进行。先用 Xcode 新建一个空的 iOS 工程并编绎,具体步骤见如下几张图片:新建AppApp工程名字选择证书设置BundleId定位描述文件最后得到 embedded.mobileprovision 描述文件复制出来备用。特别提示:记住本节的 Bundle identifier(BundleId)为: com.qyc.test ,后面最重要的一环需要用到。
2.2 应用脱壳脱壳方式也有很多种,这里使用 C 版压箱底的神秘工具进行,如下图所示。应用脱壳
得到脱壳后的 ipa 文件备用
2.3 编译插件
通过 git 下载插件源代码(已支持最新8.0.5):git clone https://github.com/buginux/WeChatRedEnvelop.gitmake 后得到 WeChatRedEnvelop.dylib 备用。编译插件

2.4 查看依赖
这一步查看插件的依赖库,使用如下命令:otool -L WeChatRedEnvelop.dylib查看依赖

需要 CydiaSubstrate.framework 依赖,根据路径去越狱手机上定位 。
定位到CydiaSubstrate.framework

展开 CydiaSubstrate.framework ,导出 libsubstrate.dylib 备用。
导出libsubstrate.dylib


2.5 修改依赖将 WeChatRedEnvelop.dylib 文件依赖的路径改为: @executable_path/Frameworks/(也就是 App 目录下的 Frameworks 子目录),具体如下:
install_name_tool -change /Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate @executable_path/Frameworks/libsubstrate.dylib WeChatRedEnvelop.dylib

修改依赖路径

再次查看 WeChatRedEnvelop.dylib 依赖,一切正常!再次查看依赖

现在整个项目目录如下所示:项目目录

0x03 注入 dylib

3.1 解压 ipa
unzip -oqq ./WeChat_8.0.5_gfd.ipa -d "${SRCROOT}"
查看主程序是否解密:↓(为0表示已正确解密的)。otool -l ./Payload/WeChat.app/WeChat | grep crypt
查看是否解密成功


3.2 脚本处理
新建 copydel.sh 脚本,其实就是删除和复制一些文件到 App 包里去:rm -rf ./Payload/WeChat.app/com.apple.WatchPlaceholder
rm -rf ./Payload/WeChat.app/Watch
rm -rf ./Payload/WeChat.app/PlugIns
cp -r WeChatRedEnvelop.dylib ./Payload/WeChat.app/Frameworks/WeChatRedEnvelop.dylib
cp -r ./CydiaSubstrate.framework/libsubstrate.dylib ./Payload/WeChat.app/Frameworks/libsubstrate.dylib
cp -r embedded.mobileprovision ./Payload/WeChat.app/embedded.mobileprovision
记得 embedded.mobileprovision 描述文件也要复制进 app 去

3.3 开始注入
利用 optool 工具注入,下载地址:https://github.com/yuchuanfeng/optool更改主程序执行权限:chmod +x ./Payload/WeChat.app/WeChat
开始注入:
optool install -c load -p @executable_path/Frameworks/WeChatRedEnvelop.dylib -t ./Payload/WeChat.app/WeChat

注入过程如下图所示。注入过程

确认注入情况:otool -L ./Payload/WeChat.app/WeChat
确认注入情况
看到已注入完成!
3.4 修改 BundleId

需要修改 BundleId 与 Demo 工程保持一致:
/usr/libexec/PlistBuddy -c "set :CFBundleIdentifier com.qyc.test" ./Payload/WeChat.app/Info.plist

修改BundleId

这步非常重,要不然会造成非越狱机器无法安装。顺便处理:安装 ipa 报 DeviceNotSupportedByThining. 错误:
/usr/libexec/PlistBuddy -c "Delete :UISupportedDevices" ./Payload/WeChat.app/Info.plist


0x04 应用重签

4.1 列出证书
security find-identity -v -p codesigning
列出证书

这里选用第 2 个证书编号进行后续签名(后续证书签名及 ID 已被掩码)。
4.2 提取 entitlements.plist 文件
要给 App 文件签名得先从 embedded.mobileprovision 文件中提取出 entitlements.plist 权限文件:
security cms -D -i embedded.mobileprovision > temp.plist

/usr/libexec/PlistBuddy -x -c 'Print :Entitlements' temp.plist > entitlements.plist

分成两步,最终生成一个权限文件entitlements.plist
4.3 签名 Framework
这一步签名 Framework 目录下的所有 Mach-O 可执行文件(这点非常重要)
codesign -f -s "Apple Development: 888888888*qq.com (9999999999)" ./Payload/WeChat.app/Frameworks/andromeda.framework
codesign -f -s "Apple Development: 888888888*qq.com (9999999999)" ./Payload/WeChat.app/Frameworks/App.framework
codesign -f -s "Apple Development: 888888888*qq.com (9999999999)" ./Payload/WeChat.app/Frameworks/Flutter.framework
codesign -f -s "Apple Development: 888888888*qq.com (9999999999)" ./Payload/WeChat.app/Frameworks/ilink_network.framework
codesign -f -s "Apple Development: 888888888*qq.com (9999999999)" ./Payload/WeChat.app/Frameworks/libsubstrate.dylib
codesign -f -s "Apple Development: 888888888*qq.com (9999999999)" ./Payload/WeChat.app/Frameworks/Lottie.framework
codesign -f -s "Apple Development: 888888888*qq.com (9999999999)" ./Payload/WeChat.app/Frameworks/matrixreport.framework
codesign -f -s "Apple Development: 888888888*qq.com (9999999999)" ./Payload/WeChat.app/Frameworks/mm_dart_cpp.framework
codesign -f -s "Apple Development: 888888888*qq.com (9999999999)" ./Payload/WeChat.app/Frameworks/OpenSSL.framework
codesign -f -s "Apple Development: 888888888*qq.com (9999999999)" ./Payload/WeChat.app/Frameworks/ProtobufLite.framework
codesign -f -s "Apple Development: 888888888*qq.com (9999999999)" ./Payload/WeChat.app/Frameworks/WeChatRedEnvelop.dylib


4.4 签名 App
codesign -fs "Apple Development: 888888888*qq.com (9999999999)" --no-strict --entitlements=entitlements.plist ./Payload/WeChat.app
签名App
一气合成,这就签完名啦!
4.5 查看/验证签名

codesign -vv -d ./Payload/WeChat.app
查看签名情况

Framework 目录的检查同理可推,略过。下面这一步如果没有任何输出代表签名验证通过:codesign --verify ./Payload/WeChat.app

4.6 重新打包
zip -qr Simple_WeChat_8.0.5.ipa Payload/

4.7 安装ipa
这一步是最常规的操作了,也详细列出来吧,使用爱思助手:导入安装
非越狱机器顺利安装,没有任何错误!打开不会闪退!并看到插件成功注入:↓


本节使用的命令行在你完成单步理解后,完全可以做成 sh 脚本完成自动化操作,这里就不讲述了。最后,你就可以愉快的学习别人的代码并进行各种功能改进了!
0x05 友情提示

[*]在此我想说一下,使用别人的开源插件一定要要保留人家的版权信息并表示谢意,做人要厚道,不要像有个 Cydia 的 xx 号,拿了别人的插件加入各种信息进行获利,真不要脸!
[*]本文技术仅供技术交流,请勿用于非法用途。

0x06 总结
macOS、iOS的签名工具非常多,如果不理解其签名原理,则是知其然不知其所以然,从而耽误很多事情。在遇到问题的时候得深入研究,仔细探究其中的奥秘,避免完全做个“工具党”。
0x07 参考文献

《iOS应用逆向与安全之道》
https://item.jd.com/12800426.html
https://objccn.io/issue-17-2/





tree_fly 发表于 2021-5-18 18:02:06

前排膜拜小Q大神

dryzh 发表于 2021-5-18 19:01:36


前排膜拜小Q大神

creantan 发表于 2021-5-19 08:46:13

前排膜拜小Q大神

小七柒 发表于 2021-5-19 09:23:38

前排膜拜小Q大神

iamok 发表于 2021-5-19 11:45:29

膜拜大神!!!

zsj118106 发表于 2021-5-21 08:56:58

牛比,学习啦,虽然看不懂

phzapm 发表于 2021-5-21 16:59:03

来到论坛第二天,我看了很多,唯独楼主的这篇我看的津津有味有浅到深,感谢楼主

chanxinccx 发表于 2021-6-1 08:39:35

膜拜小Q大神,大哥牛皮6666

77127547 发表于 2021-6-2 21:59:46

感谢发布原创作品,PYG有你更精彩!
页: [1] 2 3 4 5 6 7 8
查看完整版本: 非越狱环境WeChat插件注入之旅