PM拓展:聊聊企业微信的hook


时间: 2022-07-14 02:37:27 人气: 30 评论: 0

编辑导语:企业微信在群发消息、批量添加好友等场景中,难以满足企业诉求,所以,某些企业便对企业微信进行hook,以实现企业的批量处理需求。本文作者对hook的原理及方案进行了分析,一起来看一下吧。

由于企业微信的限制策略,导致在群发消息、批量添加好友等场景难以满足企业诉求。在此背景下,某些企业便对企业微信进行hook,我们今天就来聊一下hook的原理及方案。

一、基本了解

首先我们要对企业微信(也是所有C/S架构)的数据传输有个基本了解:企业微信手机端、PC端按照一定规则将数据上报给服务端,同时也从服务端按照规则拉取最新数据到本地。企业微信通过开放的管理后台提供API接口给企业微信服务商,服务商通过接口和企业微信进行数据交互。

用发消息场景举个例子:

  1. 企业微信账号A,在手机客户端上向客户B(个人微信)发送一条消息,内容“我是周杰伦”
  2. 这条消息内容(连同发送者、接收者等信息)通过网络上报到企业微信服务端
  3. 企业微信服务端做一系列动作,如判断A和B是否是好友、B是否合法等等之后,将消息发送给客户B
  4. 客户B收到消息后,服务商通过API接口将这条消息拉取到自己的数据库里
  5. 同时,如果企业微信A在PC客户端处于登陆状态,企业微信服务端**将刚刚发送消息这件事告诉企业微信PC客户端,在PC客户端上也就能看到刚刚发送给客户B的聊天记录

二、如何hook

我们通常需要在设备上安装一个客户端软件(我们称其为小助手)用于hook企业微信的载体工具。

1)破解数据库/内存:拿到想要的数据

安装客户端后,一般**在当前硬件设备硬**上建立数据库,用于存储实时性比较强、数据量比较大的数据。通过破解数据库我们便能拿到必要的数据,比如企业微信的外部联系人列表即存储在本地的sqllite数据库里。

2)破解函数

通过函数可以拿到想要的数据以及操纵企业微信(技术老师通常叫:截取和下发)。

如图,在发消息场景下,我们通过破解点1,伪装成企业微信用户A调用“发送消息函数”原始数据,让该函数帮助我们发送消息(下发)。

(真实的发送消息场景,是一系列函数之间的调用,而不仅仅是一两个函数)

三、hookid是什么

hookid前面有定语,比如外部联系人hookid、账号hookid、群hookid、朋友圈hookid,在企业微信中,最常用的就是外部联系人hookid。

外部联系人hookid,即用于标定该外部联系人的唯一id。假如2个企业微信账号都和外部联系人A是好友关系,那么A在2个企业微信的好友列表里,hookid是相同的。

hookid是什么怎么生成的?

hooid不是系统自动生成的,是从企业微信在本地的sqllite数据库的外部联系人表中获取的某个字段。

四、为什么要绑定hookid?

还是拿群发举例子,如果想要发消息,数据需要从scrm下发给企业微信,完成群发。

发消息需要指明消息的接收人是谁。但问题是,scrm的外部联系人列表是从官方API接口获取的,而我们最终只能通过hook获取的外部联系人列表来完成群发,两个列表的口径并不一致,这时就需要利用hookid来完成数据的绑定。

五、如何绑定hookid

1)差异化同步流程

小助手客户端从企业微信客户端同步完成数据后,**通知小助手服务端。

触发条件:登录小助手客户端,并从小助手中打开企业微信。

服务端接到小助手客户端的同步完成通知,**从库中获取该企业微信账户已经绑定hookid的列表。

触发条件:服务端获得小助手同步完成的通知。

将已绑定的hookid下发给小助手。

触发条件:拉取到完整的hookid列表。

下发方式:一次下发200个hookid,当所有hookid都给到小助手客户端后,**告知小助手客户端。

小助手将已绑定的hookid在本地数据库打上标记。

触发条件:被服务端告知,hookid已经同步完毕。

服务端向小助手客户端下发指令:上报无hookid外部联系人。

小助手上报服务端未绑定hookid的外部联系人。

内容:外部联系人头像、昵称、hookid。

方式:一次给200个外部联系人信息,所有未绑定用户都给到服务端后,**告知服务端。

服务端将官方数据和小助手客户端上报数据,根据头像和昵称进行绑定。

2)增量同步逻辑

  • 服务端获取未绑定hookid列表
  • 将未绑定hookid列表下发给小助手(头像、昵称等)
  • 小助手从自己的库里和服务端下发的列表进行比对,将比对结果相同的联系人上报给服务端,上报完成后通知服务端
  • 触发条件:比对完成后。如果没有相同的,则?
  • 服务端将官方数据和小助手上报数据,根据头像和昵称进行绑定
  • 触发条件:接受到小助手上报完成通知

3)备注绑定逻辑

  • 服务端为某个hookid生成一个备注内容,并下发给小助手
  • 小助手为用户修改备注,修改后,企业微信内部**将新的备注上报给企业微信服务端
  • 数据同步模块**定时从企业微信官方拉取到该用户对应的备注内容
  • 服务端根据备注内容,找到该备注对应的hookid,进行绑定
  • 服务端通过官方接口,将备注还原

最后,分享一张企业微信(hook)服务商的整图:

 

本文由 @Shanker 原创发布于人人都是产品经理,未经许可,禁止转载

题图来自 Unsplash,基于 CC0 协议

给作者打赏,鼓励TA抓紧创作!
评论