逆向微信

简单实现微信的双开

Posted by Roylee on 2018-04-28

背景

在最新版的微信中,终于支持了账号切换的功能,这满足了很多人对于使用多个微信账号的需求。但是,在同一个 APP 中切换账号还是比较麻烦的,也是不够及时的。尤其是,女票需要几个账号把工作与生活分离开来

当然,可以用多个设备解决问题嘛。不过,谁会愿意一天到晚带着好几个手机呢


准备工具

我这里为了方便没有自己对微信进行砸壳,而是直接在某助手上下载砸壳微信的 ipa 包,这年头真是工具解放双手啊

接下来就是进行 Hook 操作了,去年的时候用的还是 iOSOpenDev, hook 之后还要进行重签名操作,相对来说繁琐一点。后来,出了个 MonkeyDev,是对 iOSOpenDev 的升级,倒是省去了很多操作:hook 签名一步完成

因此,最后采用 MonkeyDev 进行微信的 hook 操作

MonkeyDev 使用文档


另一个微信

接下来就是重点了,对微信进行 hook 操作,实现双开功能。主要做的是两部分:

绕开微信验证

由于一个设备只能安装一个 boundleid 的 APP,要想实现微信双开,逆向的微信的 boundleid 肯定是我们自定义的,我这里是com.roylee.xin。而微信,会在服务端对接口上报的 boundleid 进行校验,不是微信的 boundleid 是不让使用的(SAD😞)

一开始,还在想有没有什么更底层的方式,可以重写系统的什么函数方法之类的来修改当前 APP 的 boundleid,真是百思不得姐啊

最后还是得换个思路,既然 boundleid 都是获取的,那就修改获取的方法就好了:直接 hook NSDictionaryobjectForKey:,当 keykCFBundleIdentifierKey 的时候返回微信的 boundleid。当然,这还是很暴力的,对于所有字典的操作都会稍有影响的,哈哈

hook boundle id

微信保活

微信终于可以双开存在了,但是一个尴尬的问题还是挺要命的:APP 一旦挂起后,逆向的微信肯定是无法收到消息的推送的。这还怎么玩???

想要找办法同样接受微信的推送?我还是放弃了。解决办法还是让自己的这个微信始终后台运行吧。。。

目前来说,比较合适的方式还是后台定位,然后微信一直处于后台定位的状态,这样就能一直保活了(APP 内的消息总是能收到的啦)

优化后台定位

当然,后台实时定位是很耗电的

为了解决这个问题,这里采用了后台定位与后台任务申请轮询的方式:

  • 首先,利用 CLLocationManager 进行定位功能的实现
  • 最后,为了省电就不能实时定位。这里配合 UIBackgroundTaskIdentifier,每 120s 向系统申请一次后台任务,然后时间到了快要结束任务挂起 APP 的时候开启后台定位刷新,刷新几秒后再停止刷新,之后再申请后台任务。。。就这样一直循环下去

这里用单独一个类 BackgroundTask 来做后台任务的申请与销毁:

background task

后台定位刷新的核心代码如下:

keep alive

location

其他优化

修改微信的顶部名称

change name

设置中增加后台定位开关,利用 Reveal 查看设置中的控件类名,然后配合 class-dump 导出微信的头文件,同时用 Hopper 猜想微信设置页面的实现,最后重写 NewSettingViewControllerreloadTableData 方法,添加一个开关

setting


最后

大功告成,程序员还是很有用的。。。