连信协议整体框架
点击上方↑↑↑蓝字[协议分析与还原]关注我们
“ 连信协议的整体框架说明。”
前一阵搞连信协议搞废了,风控一直过不去,没法过8,再加一堆其它稀里糊涂的问题,看样子从协议搞连信此路不通,放出来给,给大家一起玩玩,希望对大家有帮助。
我慢慢写,大家慢慢看,有问题可以消息或留言互动,尽量解决。
01
—
整体情况
连信的协议,大的框架上,有几分像微信,其实本质上并不像。
它的android版和ios版大体上协议框架是一样的,有一些密钥和域名的细微差别,还有,就是android版分析难度比较大,我没去搞它。
下面介绍下整个软件的流程。
首先,打开软件,这里有风控,数盟的风控,shuzilm域名的http报文,作为风控界的小白,我之前都没关注过这里,在协议的主体实现之前,把它都直接忽略了,后来发现,注册完就是半死不活的号,不能被别人看见,不能主动加别人,才在各路高人的提示下接触它,这个风控,可以过,使用真机产生数据配合即可,数盟的数据,可以解密了来看,但是否过了风控的结果数盟的服务器不告诉你,应该有其它接口可以得到。
同时,还有三个HTTP,从打开软件就开始存在,应该是连信自己家族的风控,大年哥的产业,上报各类动作和状态,另外里面数据太多,我研究了很久,有几个数据不知道来路,估计是钻进了牛角尖,这是一种犯罪,不过,好在已经没耐心了。
其次,登录,是使用第三方手机号验证码登录,当然,这个第三方仍然是连信大家庭内的第三方,连尚系的产品,所谓肥水不流外人田的典范。
这个第三方登录之后,是连信自己真正的服务器的登录,http或https封装,里面再使用一个RSA公钥加密传输数据进行密钥协商,android的公钥我没搞定。ios和android的RSA公钥是不同的。服务器返回本次登录后使用的AES加密的key和iv数据。
登录之后,会建立一个TCP长连接,里面传输的是各种消息,另外,还有http短连接,里面传输一些如更新,token,同步,注册,认证等数据,但二者的加密方式是一样的。
每次切换到后台等一会再切换回来,连信APP都会更新一次token,相当于重新上线,大概率是系统实现bug。
登录成功后,就可以进行收发消息、站街、加好友、发朋友圈等操作了。
当然,运行过程中会上传很多的log之类的信息,每个APP内的操作,都会有数据上报,上报到51y5.net相关的域名,这应该是连信自己的风控,里面的数据,到这里我基本上看得直接放弃了。
总体流程相关的信息基本就是这样子。
02
—
风控相关
连信的协议,看着很容易实现,找到RSA公钥,以及几个固定的key和iv,就能加密所有的数据,但是,等到做完了,会发现,风控很有点难。
首先,在程序启动时,调用了数盟的风控,检测一些基本的设备信息,例如网卡,mac,ip,运营商,各种设备id等各类信息,有兴趣研究的朋友可以到网上搜索数盟检测的数据分析:
这个数据通过http://idaa.shuzilm.cn/report接口上报,然后服务器当然是返回成功给客户端啦。
这个里面有个cdid,是数盟自己生成的id,个人推测,数盟的客户可以通过这个id到数盟自己的服务器上查询是否可以通过风控。
其次,连信登录使用手机号登录,很挑手机号的,至少网上的接码平台的手机号,基本没法用,有些能注册,但注册完是死号,不会被推荐给别人,也不会被附近的人看见,也不能给加别人好友或者打招呼,不过被动的操作还是可以的,更多的是注册完直接弹出异常不让登录。
有一个简单的是否死号的识别方法,就是注册后进入连信的第一步,会有一个推荐页面,推荐的数据的前几个,如果带彩色圈圈,则是活号,在协议实现上,则可以看推荐的数据的uid,如果都是很小的数值,则推荐的全是机器人,无疑,你被认定是死号了,例如推荐数据是这些的时候,就是死号了:
推荐数据的获取链接为:
http://short.lianxinapp.com/recommend/v5/getRecommendUser.json
最后,这些风控都过了,还不行,前面已经提到了,连信的运行过程中,每个APP内的操作以及log日志,都会上报到连信相关的服务器。上报的信息很杂乱,主要用到如下几个url:
http://kepler.51y5.net/alps/fcompb.pgs
http://dcmdaa.51y5.net/dc/fcompb.pgs
http://taichi-pub.51y5.net/alps/fcompb.pgs
https://log.lianxinapp.com/logs/v2/realtime
这里面,log url中传输的内容稍微清晰,没有加密,外层https传输:
--X5uNEck44kxP1C1l38Q_KF2f1kxwtThFjqi6p
Content-Disposition: form-data; name="logType"
1000
--X5uNEck44kxP1C1l38Q_KF2f1kxwtThFjqi6p
Content-Disposition: form-data; name="isGzip"
0
--X5uNEck44kxP1C1l38Q_KF2f1kxwtThFjqi6p
Content-Disposition: form-data; name="file"
{"index":{"_index":"zhangxin-client-20xxxx","_type":"log","_id":"xxxx"}}
{"pfm":"xxxx","uid":"xxx","ver":"200422","ts":xxxx,"@timestamp":"2020xxxx+0800","did":"xxxxx","log_code":1000,"imei":"xxxx","mac":"xxxxx","channelId":"xxxx","uiType":1,"pth":"1p","extra":"{\"uid\":\"xxxx\",\"mid\":\"xxxx\"}","action":"1","comp":"12"}
--X5uNEck44kxP1C1l38Q_KF2f1kxwtThFjqi6p--
而几个51y5的链接的post请求数据体,则比较复杂,使用AES CBC加密,不过格式基本统一,外层格式如下:
其中headpb的数据为protobuf编码,encdata为加密数据,加密key iv几个链接各自独立,各个平台也各自独立。
encdata加密前的数据格式如下:
其中encpb1和encpb2均为protobuf编码。
响应体也同样是加密的,外层:
内层encdata:
看着是不是很清爽,这是我抽象了很久才整理成这样的,其实里面还有一些东西稀里糊涂的。
03
—
未完待续
今天就写到这里了,如果有需求,后面会把更多细节补上,望大伙不吝赐教,共同进步。
长按进行关注,时刻进行交流。
如果文章对你有帮助,还请多点“赞”,多点“在看”,多“分享”
本文地址:https://blog.csdn.net/yeyiqun/article/details/107502788
上一篇: JS简单--面试题