关于逆向的例子网上很多牛人都有分享,包括微信消息禁止撤回、自动抢红包、虾米音乐VIP等等。为了满足一下自己的好奇心更为了能够深入的了解iOS内部原理,于是“站在巨人的肩膀上”利用周末简单学习一下,在此做个学习笔记,梳理一下基本知识、整理一下基本步骤(大神请忽略此文)。
1.要做什么
在手机不越狱的情况下,可以修改微信运动步数。当然网上也有很多教程(包括越狱的和非越狱的),可以直接拿来用。但为了知其所以然,所以打算自己动手一步步实现。
2.准备工作
需要用到的工具:已砸壳的ipa文件、iOSOpenDev、yololib、CaptainHook、iReSign(很好用的签名工具)。由于直接从AppStore里下载的App都是经过加密的,所以需要解密(即砸壳,需要有一部越狱设备),没有越狱设备直接去网上下载即可。
3.开始实现
(1)下载ipa完成后要确认下是否真的已被解密。先通过命令unzip weChat.ipa
解压得到weChat.app文件,再通过
命令otool -l WeChat.app/WeChat | grep -B 2 crypt
来查看是否已解密。结果如下:
cmd LC_ENCRYPTION_INFO // armv7架构
cmdsize 20
cryptoff 16384
cryptsize 49463296
cryptic 0 // 0代表解密、1代表加密
--
cmd LC_ENCRYPTION_INFO_64 // arm64架构
cmdsize 24
cryptoff 16384
cryptsize 53149696
cryptic 0 // 0代表解密、1代表加密
(2)安装iOSOpenDev来编写Hook代码实现你想要的功能。安装iOSOpenDev会遇到失败的情况,具体安装步骤以及失败的解决办法请参考这篇博客。(教程中的第五步的下载文件已失效,可以跳过该步骤)。安装成功后,新建工程选择CaptainHook Tweak,并将CaptainHook.h文件导入工程中。
至于如何用class-dump提取接口文件以及编写Hook代码,这里暂不介绍,网上教程很多。代码写完后,选择真机编译程序,成功后生成的动态库(xxx.dylib)便是我们需要注入到二进制文件中的程序。
(3)新建一正常项目,bundle Id可以自由设置,这样不会覆盖掉手机里已安装的原版微信。build一下,保存好生成的描述文件embedded.mobileprovision(名字貌似不可自定义)。
(4)下载yololib,将yololib、xxx.dylib、embedded.mobileprovision、解压后的wechat.app放在同一目录中,执行命令
./yololib WeChat.app/WeChat xxx.dylib
将动态库注入到微信的二进制文件中。成功后结果如下:
2017-03-21 01:28:00.199 yololib[39045:1159498] FAT binary!
2017-03-21 01:28:00.199 yololib[39045:1159498] Injecting to arch 9
2017-03-21 01:28:00.200 yololib[39045:1159498] Patching mach_header..
2017-03-21 01:28:00.203 yololib[39045:1159498] Attaching dylib..
2017-03-21 01:28:00.203 yololib[39045:1159498] Injecting to arch 0
2017-03-21 01:28:00.203 yololib[39045:1159498] 64bit arch wow
2017-03-21 01:28:00.206 yololib[39045:1159498] dylib size wow 72
2017-03-21 01:28:00.207 yololib[39045:1159498] mach.ncmds 76
2017-03-21 01:28:00.207 yololib[39045:1159498] mach.ncmds 77
2017-03-21 01:28:00.207 yololib[39045:1159498] Patching mach_header..
2017-03-21 01:28:00.210 yololib[39045:1159498] Attaching dylib..
2017-03-21 01:28:00.210 yololib[39045:1159498] size 66
2017-03-21 01:28:00.210 yololib[39045:1159498] complete!
注入成功后,再将xxx.dylib和embedded.mobileprovision拷贝到weChat.app目录下即可。
(5)新建目录Payload,将weChat.app放入该目录下执行命令zip -qry weChat.ipa Payload/
生成ipa文件,接下里对ipa进行重签名、打包即可安装到手机。
(6)对ipa签名和打包为了方便,可以选择用这个开源工具iReSign,很实用(entitlements.plist可以不用选择,会自动生成)。
(7)额外说明:如果想查看App原来的bundle Id,可通过系统自带命令行工具Plutil(property list utitlity)plutil -p ~/Desktop/xxx.app/Info.plist | grep CFBundleIdentifier
,更多信息请看这里。
4.遇到的坑
如果自定义enlitiments.plist,记得Team ID一定要填写生产证书ID,也可在开发者官网查看;
如果安装失败,试着删除weChat.app中的Watch、Plugins文件。
这仅仅是个开始、还有很多很多东西需要去学习和探索……
参考资料:
http://bbs.iosre.com/
https://www.ianisme.com/ios/2319.html
http://www.tuicool.com/articles/FF3QFjE
http://blog.csdn.net/chsadin/article/details/51613197