非越狱iOS应用逆向-更改微信步数

系统环境

  • 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下载的微信是经过加密的,还需要砸壳.

非越狱iOS应用逆向-更改微信步数_第1张图片
Paste_Image.png

下载后解压,我把他放在了桌面上,然后又创建了一个空文件夹准备用来放dump出来的头文件

非越狱iOS应用逆向-更改微信步数_第2张图片
Paste_Image.png

打开终端,输入class-dump,可以看到class-dump的指令(我是10.12的系统,之前安装class-dump还费了点事,要更改下系统的权限,不然class-dump不允许安装)

非越狱iOS应用逆向-更改微信步数_第3张图片
Paste_Image.png

现在我们就可以输入命令dump出微信的头文件啦

$ class-dump -H /Users/zhangtaoran/Desktop/WeChat/Payload/WeChat.app -o /Users/zhangtaoran/Desktop/WeChatHeaders

但是过程肯定不会这么顺利,当我打开文件夹后只看到了一个CDStructures.h,里面什么都没有

非越狱iOS应用逆向-更改微信步数_第4张图片
Paste_Image.png

我一脸懵逼,可能我们从PP助手下载的越狱版微信仍然有壳?但我觉得这个可能性应该比较小,但是我们有了CDStructures.h这个线索,去Google和百度了一番,得知出现这种情况有两种可能:

  1. 还需要砸壳,砸壳工具有:AppCrackr、Clutch、dumpcrypted 等;由于 AppCrackr 、Clutch 暴力砸壳、操作简单,招致公愤,因此一些核心功能,已经下架,在高级系统中,已不能使用;因此,推荐: dumpcrypted 砸壳工具。工具获取及使用方法,参考:https://github.com/stefanesser/dumpdecrypted

  2. 当砸壳完毕后,使用 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个头文件

非越狱iOS应用逆向-更改微信步数_第5张图片
Paste_Image.png

定位与步数相关的文件

微信这种项目的命名应该是很规范的,我们想要修改步数就先尝试查找一下step相关的头文件,search出来的结果有很多,最后我定位到这个文件

非越狱iOS应用逆向-更改微信步数_第6张图片
Paste_Image.png

打开过后可以看到,这两个应该就是记录步数的属性

非越狱iOS应用逆向-更改微信步数_第7张图片
Paste_Image.png

这里的属性get方法应该就是判断HealthKit是否可用然后去里面取数据,我们就把他们两个的get方法都替换掉就好了

利用iOSOpenDev替换方法

利用 iOSOpenDev 创建一个 hook 的模板,就连手动调用 method-swizzling 的代码也省了。

非越狱iOS应用逆向-更改微信步数_第8张图片
Paste_Image.png

然后开始写代码修改掉那两个方法的实现,直接返回想要的数值

Paste_Image.png

build 一下生成 .dylib

非越狱iOS应用逆向-更改微信步数_第9张图片
Paste_Image.png

再用 dylib_insert 把动态库的地址注入 Mach-O

$ insert_dylib @executable_path/ModifyStepCount.dylib /Users/zhangtaoran/Desktop/WeChat/Payload/WeChat.app/WeChat 

然后就会在相同位置生成一个新的 Mach-O 文件。

Paste_Image.png

我们用 MachOView 就能看到新的动态库已经被注入了:
在Fat Binary -> Executable -> Load Commands -> LC_LOAD_DYLIB

非越狱iOS应用逆向-更改微信步数_第10张图片
Paste_Image.png

最后把这个文件改名重新改回 WeChat替换原来的文件,再和动态库一起放入原 WeChat.app

因为微信中还有watch app,我怕他还是加密的,我也将WeChat.app里面的Watch文件夹,连同PlugIns文件夹一起删去,怕它影响我们重签名

重签名并打包

现在工作已经完成一大半了,现在只需要对刚才修改好的微信重新签名并打包,我是用的免费证书,要注意的是,由于中国的开发者利用免费的证书大量对应用进行重签名,所以目前苹果加上了许多限制,免费开发者的provisioning证书有效时间从之前的30天改为7天,过期后需要重新签名。另外就是一个星期内最多只能申请到10个证书。我就用Xcode新建了一个工程,让苹果给我生成一个新的有效期为7天的描述文件,然后用这个描述文件来签名我们自己修改的微信。

简单的来说就是创建一个APP,让苹果给我们这个APP发了一个可以免费在真机上测试的证书,然后用我们修改后的微信伪装成为这个APP,就达成了非越狱环境下iOS App Hook

非越狱iOS应用逆向-更改微信步数_第11张图片
Paste_Image.png

成功生成描述文件

Paste_Image.png

然后我们就可以用iOS App Signer重新签名了,其实iOS App Signer是帮我们获取到本地上的开发者签名证书和所有的Provisioning文件,然后对结果做了一个筛选,去掉了那些过期的证书,然后用描述文件对APP进行签名,再对签好名的应用打包。

我们就选择好刚才生成的那个证书,简单地点一下开始,就等着他帮我们重签名并打包好吧

非越狱iOS应用逆向-更改微信步数_第12张图片
Paste_Image.png

最后就将重新打包好的ipa安装到手机上,搞定!

Paste_Image.png

由于 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

你可能感兴趣的:(非越狱iOS应用逆向-更改微信步数)