系统环境
- macOS 10.12.2
- Xcode 8.2
- iOS 10.2
工具&软件:
- class-dump
- PP助手
- MachOView
- iOSOpenDev
- insert_dylib
- iOS App Signer
- 微信(越狱版) 6.5.3
分析微信
工欲善其事必先利其器,我们先将工具和软件都准备好,过程中会遇到很多问题,但我相信你能成功的。阻扰大家的主要是一些环境的搭建以及相关配置没设置好,结果导致dylib编译过程各种错误,重签名不成功,各种闪退等。所以本文里的每一步操作都会很详细的交代,确保大家都能操作成功。
我们先拿到用PP助手下载好的越狱版微信iOS客户端,因为从AppStore下载的微信是经过加密的,还需要砸壳.
下载后解压,我把他放在了桌面上,然后又创建了一个空文件夹准备用来放dump出来的头文件
打开终端,输入class-dump,可以看到class-dump的指令(我是10.12的系统,之前安装class-dump还费了点事,要更改下系统的权限,不然class-dump不允许安装)
现在我们就可以输入命令dump出微信的头文件啦
$ class-dump -H /Users/zhangtaoran/Desktop/WeChat/Payload/WeChat.app -o /Users/zhangtaoran/Desktop/WeChatHeaders
但是过程肯定不会这么顺利,当我打开文件夹后只看到了一个CDStructures.h,里面什么都没有
我一脸懵逼,可能我们从PP助手下载的越狱版微信仍然有壳?但我觉得这个可能性应该比较小,但是我们有了CDStructures.h这个线索,去Google和百度了一番,得知出现这种情况有两种可能:
还需要砸壳,砸壳工具有:AppCrackr、Clutch、dumpcrypted 等;由于 AppCrackr 、Clutch 暴力砸壳、操作简单,招致公愤,因此一些核心功能,已经下架,在高级系统中,已不能使用;因此,推荐: dumpcrypted 砸壳工具。工具获取及使用方法,参考:https://github.com/stefanesser/dumpdecrypted
当砸壳完毕后,使用 class-dump 仍然只导出 CDStructures.h一个文件,则可能架构选择错误,armv7对应的是iPhone5及以下的设备,arm64则是5s及以上的设备,所以微信也包含两个架构,armv7和arm64。关于架构与设备之间的对应关系可以从iOS Support Matrix上查看。理论上只要把最老的架构解密就可以了,因为新的cpu会兼容老的架构。我们这里加上armv7再输入命令。
class-dump --arch armv7 /Users/zhangtaoran/Desktop/WeChat/Payload/WeChat.app -H -o /Users/zhangtaoran/Desktop/WeChatHeaders
然后就看到文件开始跑了,非常多,有点小激动,算是成功了一小步,可以看到微信一共8393个头文件
定位与步数相关的文件
微信这种项目的命名应该是很规范的,我们想要修改步数就先尝试查找一下step相关的头文件,search出来的结果有很多,最后我定位到这个文件
打开过后可以看到,这两个应该就是记录步数的属性
这里的属性get方法应该就是判断HealthKit是否可用然后去里面取数据,我们就把他们两个的get方法都替换掉就好了
利用iOSOpenDev替换方法
利用 iOSOpenDev 创建一个 hook 的模板,就连手动调用 method-swizzling 的代码也省了。
然后开始写代码修改掉那两个方法的实现,直接返回想要的数值
build 一下生成 .dylib
再用 dylib_insert 把动态库的地址注入 Mach-O
$ insert_dylib @executable_path/ModifyStepCount.dylib /Users/zhangtaoran/Desktop/WeChat/Payload/WeChat.app/WeChat
然后就会在相同位置生成一个新的 Mach-O 文件。
我们用 MachOView 就能看到新的动态库已经被注入了:
在Fat Binary -> Executable -> Load Commands -> LC_LOAD_DYLIB
最后把这个文件改名重新改回 WeChat替换原来的文件,再和动态库一起放入原 WeChat.app
因为微信中还有watch app,我怕他还是加密的,我也将WeChat.app里面的Watch文件夹,连同PlugIns文件夹一起删去,怕它影响我们重签名
重签名并打包
现在工作已经完成一大半了,现在只需要对刚才修改好的微信重新签名并打包,我是用的免费证书,要注意的是,由于中国的开发者利用免费的证书大量对应用进行重签名,所以目前苹果加上了许多限制,免费开发者的provisioning证书有效时间从之前的30天改为7天,过期后需要重新签名。另外就是一个星期内最多只能申请到10个证书。我就用Xcode新建了一个工程,让苹果给我生成一个新的有效期为7天的描述文件,然后用这个描述文件来签名我们自己修改的微信。
简单的来说就是创建一个APP,让苹果给我们这个APP发了一个可以免费在真机上测试的证书,然后用我们修改后的微信伪装成为这个APP,就达成了非越狱环境下iOS App Hook
成功生成描述文件
然后我们就可以用iOS App Signer重新签名了,其实iOS App Signer是帮我们获取到本地上的开发者签名证书和所有的Provisioning文件,然后对结果做了一个筛选,去掉了那些过期的证书,然后用描述文件对APP进行签名,再对签好名的应用打包。
我们就选择好刚才生成的那个证书,简单地点一下开始,就等着他帮我们重签名并打包好吧
最后就将重新打包好的ipa安装到手机上,搞定!
由于 Objective-C 动态的特性,我们可以不用对二进制文件进行反编译,然后再对汇编指令进行修改,只需要直接添加一个动态库就能实现功能的更改了。
参考资料
听说你想撤回信息?:http://www.jianshu.com/p/ac7eddd644c3
iOSAppHook:https://github.com/Urinx/iOSAppHook
class-dump 和 iOSOpenDev 的使用:http://blog.csdn.net/chaoyuan899/article/details/39271197
Objective-C的hook方案(一): Method Swizzling:http://blog.csdn.net/yiyaaixuexi/article/details/9374411