逆向探索思路

目标:脱离无忧行的系统实现短信通知
思路:从通知入手,因为通知走apns,可能会可以把两个device注册到同一个user account上,这样就可以接收了
尝试1: 抓包看到push.it.10086.com,觉得这tm真的太明显了肯定是他push的。他可以通过ddpush、友盟、mipush、apns等各种方式push。
  1. 首先逆了ddpush这个自建服务的协议,结果发现他根本不推过来东西,我觉得他是自建的服务有问题,所以决定先看看能不能把这些push sdk搬到桌面环境里面
  1. 然后,我发现华为的push sdk似乎有js的sdk,研究了老半天发现是那种WebPush,需要开发者面板特殊配置的
  1. 接着逆了mipush的协议,小米的混淆开的太高,理解极其困难,2017年版的混淆较弱,看出来了是xmpp协议。结果测试发现mipush一样收不到东西。友盟的太复杂,简单测完也发现收不到东西
  1. 我意识到可能安卓的整个push都是废的,所以我去看了苹果的通知,这个是已知可以绑定到多个device(下线的时候会同时收到下线通知)且完全独立的。所以调研了apns的逆向难度,发现apns可能反而是逆向难度最低的???
  1. 于是我实验用用各种组合将两个设备绑定到同一个账号,发现完全不行。由于苹果只能通过apns进行remote push,我开始怀疑是不是不是通过这个push.it.10086.cn走的
  1. 所以我调查了所有能拿到push所需的deviceToken的sdk,然后用surge屏蔽了所有这些sdk的网络请求;结果发现竟然还能收到通知。而且,在登陆后首次连上电话服务器后才会有通知。可以断定这个通知肯定在这个电话服务器上
  1. 继续逆向发现deviceToken果然是通过jcsdk上去的,但是似乎只能允许设置一个token、而且一旦创建另一个连接,上一个连接就会被掉线,已经注册的token也会自动删除,所以始终一个号码只能对应一个设备的通知,局面无解
尝试2: 通过逆向jcsdk并port到dotnet
  1. 调研jcsdk的iOS版的时候意外发现他给的iOS版库完全没有strip!
  1. iOS的文档里提示可以通过设置sessId来实现多端登录,这不就是我们想要的吗
  1. 设置sessid后登陆发现果然可以同时在线了
  1. 尝试给dotnet sdk加上短信功能。打开日志发现可以正常解密收到的短信包,只不过没有正确使用对应的属性取到信息
  1. 借助于iOS版的符号lumina到了正式版的binary上,发现解析短信的模块MtcSmgw由MtcWgw魔改而来(代码都完全一样),只有使用的各种keyword都不一样,且没有对应的callback
  1. 借助于iOS的符号,逆向了windows sdk的回调逻辑,然后用detours的setdll工具hook了windows版sdk,把Wgw的消息转到了ImChannel上,这样就能通过MessageChannel收到消息了
  1. 在JCsample上面进行了测试,完整的通过了
  1. 尝试把JCSample转成命令行程序发现死活登陆不上去,猜测是运行所在线程的问题,所以用Application::Run跑起来了个eventloop然后用Dispatcher跑login逻辑,问题解决