浅析QQ一笔画红包,随心所欲领取任意难度的一笔画红包

Original
2021-02-17 / 1 评论 / 140 阅读 / 正在检测是否收录...

引言

无聊玩了下一笔画红包,发现点开一笔画红包后,QQ打开了网页,不同于其他红包,QQ一笔画红包实际上是一个Web页面,于是Fiddler代理模拟器调试一波。

前排提示!篇幅较长,图文并茂。十分钟成就你的黑阔梦(开玩笑)。本文仅限学习交流,请勿违反网络安全法律法规。

准备工作

  • 已安装QQ的雷电模拟器(手机修改WIFI代理也可)
  • Fiddler(任意抓包软件都可)

分析过程

打开QQ,点击一笔画红包,设置题目这里点击自定义,然后点击创建,在简单模式下随便连接两个点(根据经验,这里最好只连接两个点,因为两个点只有两个坐标,后面比较容易分析数据包)

选择一笔画.gif

在刚刚画好简单的一笔画点击确定的时候,看下Fiddler有几个session,我们来看下这几个session(其中有些包没用就不分析了)
  1. 第一个关键session
    这个包很明显能看出是上传一个png类型的图片到服务器,猜测可能是把刚刚画的一笔画的图片上传到服务器了。

upload packeg.png

  1. 第二个关键session
    这里右侧Fiddler request中Raw代表整个HTTP包结构,当前选择的TextView则可以只显示HTTP包中body的数据,很明显这是一个json数据,其中connects数组对象里有两对坐标点[{"x1":125,"y1":125,"x2":375,"y2":125}]vertexes数组对象里也是同样的两对坐标点。这应该就是一笔画的连接路径点了。

upload point.png

选择刚刚画好的简单的一笔画,塞钱输入支付密码发出去。

发红包.gif

点击刚才发出去的一笔画红包后,跳转到一笔画页面,注意,这一步骤我们抓到了几个比较有意思的数据包

点击红包.gif

  1. response是一个html页面,也就是点击一笔画红包用户看到的绘制一笔画红包的页面,html中title对应着qq上方的开始挑战
    html.png
  2. response是一个json数据包,其中包含着这个一笔画红包的基础信息(一笔画正确的连接点路径和成功连接后的一笔画图片),显而易见,当点击一笔画红包的时候,服务器已经把正确的一笔画路径点
[{"x1":125,"y1":125,"x2":375,"y2":125}]

下发了,也就是不管多么复杂的一笔画,服务器都会把他的正确的连接路径点发下来,当然,单纯给我们这些点如果一个个去对比连接,显然不是程序猿应该做的事,继续往下分析。
info.png

连接简单的一笔画路径,点击“开”拆开红包查看庐山真面目,进一步跟踪分析此步骤的每个数据包的作用。

gethongbao.gif

  1. 第一个session也就是点击“开”之后,这个包向服务器发送用户连接的一笔画路径点,如果是正确的路径点,服务器会返回相应的response。
    yes.png

还没结束!对这个session进一步分析。
在Fiddler中将这个包的request部分调整到TextView视图
yes1.png
这个数据包的request body部分的TextView视图,这个视图只显示request body提交的内容,我们可以专心分析这个部分,也就是当点击“开”之后,用户提交给服务器的数据,很明显的看到,这是个json请求体(数据已脱敏)

{"feedSid":"uin=3*******7&gameId=1************9&i=10","preCode":"771*********************647","oneStrokeId":16**********,"oneStrokeHbOrbit":[{"x1":125,"y1":125,"x2":375,"y2":125}],"sendUin":"3*******7","grapUin":"3*******7","hbListId":"1************************00","strokeType":1}

其中oneStrokeHbOrbit数组对象属性值[{"x1":125,"y1":125,"x2":375,"y2":125}]就是提交给服务器的路径点集合。那么现在回到之前从聊天框点击一笔画红包的时候,当点击一笔画红包,服务器会直接把红包的正确路径点通过response下发,也就是这个数组。

[{"x1":125,"y1":125,"x2":375,"y2":125}]

非常眼熟,用户通过连接一笔画,产生的路径点集合数组提交给服务器的数据,就是之前点击一笔画红包后服务器下发的一笔画路径点。

// 服务器下发的路径点
[{"x1":125,"y1":125,"x2":375,"y2":125}]
// 用户连接产生的路径点
[{"x1":125,"y1":125,"x2":375,"y2":125}]

至此,分析结束。

至此,分析结束。不,还没结束!

提一点猜想,无论一个一笔画红包的难度多么难,连接多少次杂乱无章的点,当点击一笔画红包的时候,服务器都会把正确的路径点下发,这样在点击拆红包的时候,下一个断点,把用户的连接路径点换成服务器下发的路径点,不就可以直接领取了吗?

试验一下

try.gif
遇到了问题!

通过对猜想的进一步实验,遇到了这样的问题。虽然可以把用户点击“开”之后向服务器提交的用户连接路径点替换成服务器下发的正确路径点,但是用户需要正确连接路径点,才能点击“开”这个按钮。也就是说,虽然拿到了服务器下发的正确的路径点,也只能跟着路径点一个个的手动连接,连接成功了,才能点击“开”这个按钮,才能替换接下来提交给服务器的路径点。

我们应该做点什么

这是正常从聊天框点击一笔画红包,服务器返回的正确的一笔画路径点

point.png

注意,在刚刚那个步骤,在从聊天框点击一笔画红包之前,用Fiddler打一个拦截,此时点击红包,Fiddler拦截到包,查看session并Go几下关注Fiddler response栏,直到response栏出现服务器下发的路径点。

ponitarr.png

将响应json稍微动一点手脚。在此之前,需要先把这些正确的路径点备份下来。

原数据(数据已脱敏)

{"ret":0,"data":{"connects":"[{\"x1\":75,\"y1\":75,\"x2\":225,\"y2\":75},{\"x1\":225,\"y1\":75,\"x2\":375,\"y2\":75},{\"x1\":375,\"y1\":75,\"x2\":225,\"y2\":375},{\"x1\":225,\"y1\":375,\"x2\":225,\"y2\":225},{\"x1\":225,\"y1\":225,\"x2\":375,\"y2\":375},{\"x1\":375,\"y1\":375,\"x2\":75,\"y2\":375},{\"x1\":75,\"y1\":375,\"x2\":225,\"y2\":675},{\"x1\":225,\"y1\":675,\"x2\":375,\"y2\":225},{\"x1\":375,\"y1\":225,\"x2\":225,\"y2\":225},{\"x1\":225,\"y1\":225,\"x2\":525,\"y2\":375},{\"x1\":525,\"y1\":375,\"x2\":375,\"y2\":375},{\"x1\":375,\"y1\":375,\"x2\":525,\"y2\":525},{\"x1\":525,\"y1\":525,\"x2\":675,\"y2\":375},{\"x1\":675,\"y1\":375,\"x2\":525,\"y2\":75},{\"x1\":525,\"y1\":75,\"x2\":225,\"y2\":225},{\"x1\":225,\"y1\":225,\"x2\":675,\"y2\":75},{\"x1\":675,\"y1\":75,\"x2\":525,\"y2\":375},{\"x1\":525,\"y1\":375,\"x2\":375,\"y2\":525},{\"x1\":375,\"y1\":525,\"x2\":75,\"y2\":225},{\"x1\":75,\"y1\":225,\"x2\":75,\"y2\":375},{\"x1\":75,\"y1\":375,\"x2\":525,\"y2\":525},{\"x1\":525,\"y1\":525,\"x2\":675,\"y2\":75},{\"x1\":675,\"y1\":75,\"x2\":375,\"y2\":525},{\"x1\":375,\"y1\":525,\"x2\":375,\"y2\":225},{\"x1\":375,\"y1\":225,\"x2\":375,\"y2\":75},{\"x1\":375,\"y1\":75,\"x2\":525,\"y2\":225},{\"x1\":525,\"y1\":225,\"x2\":525,\"y2\":75},{\"x1\":525,\"y1\":75,\"x2\":525,\"y2\":525},{\"x1\":525,\"y1\":525,\"x2\":525,\"y2\":675},{\"x1\":525,\"y1\":675,\"x2\":675,\"y2\":375},{\"x1\":675,\"y1\":375,\"x2\":225,\"y2\":675},{\"x1\":225,\"y1\":675,\"x2\":75,\"y2\":675},{\"x1\":75,\"y1\":675,\"x2\":225,\"y2\":525},{\"x1\":225,\"y1\":525,\"x2\":675,\"y2\":375},{\"x1\":675,\"y1\":375,\"x2\":75,\"y2\":375},{\"x1\":75,\"y1\":375,\"x2\":675,\"y2\":525},{\"x1\":675,\"y1\":525,\"x2\":375,\"y2\":525},{\"x1\":375,\"y1\":525,\"x2\":225,\"y2\":225},{\"x1\":225,\"y1\":225,\"x2\":75,\"y2\":525},{\"x1\":75,\"y1\":525,\"x2\":675,\"y2\":525},{\"x1\":675,\"y1\":525,\"x2\":675,\"y2\":675},{\"x1\":675,\"y1\":675,\"x2\":525,\"y2\":675}]","vertexes":"[{\"x\":75,\"y\":75},{\"x\":225,\"y\":75},{\"x\":375,\"y\":75},{\"x\":225,\"y\":375},{\"x\":225,\"y\":225},{\"x\":375,\"y\":375},{\"x\":75,\"y\":375},{\"x\":225,\"y\":675},{\"x\":375,\"y\":225},{\"x\":525,\"y\":375},{\"x\":525,\"y\":525},{\"x\":675,\"y\":375},{\"x\":525,\"y\":75},{\"x\":675,\"y\":75},{\"x\":375,\"y\":525},{\"x\":75,\"y\":225},{\"x\":525,\"y\":225},{\"x\":525,\"y\":675},{\"x\":75,\"y\":675},{\"x\":225,\"y\":525},{\"x\":675,\"y\":525},{\"x\":75,\"y\":525},{\"x\":675,\"y\":675}]","vertexCount":"23","img":{},"imgUrl":"https://qpay-onestroke-redpack-1251316161.cos.ap-*********.*********.com/*******/oneStrokeSubject/16********.png","id":"16**********"}}

处理后的数据(将connectsvertexCount数组对象属性删减到只剩两对坐标点)

{"ret":0,"data":{"connects":"[{\"x1\":75,\"y1\":75,\"x2\":225,\"y2\":75}]","vertexes":"[{\"x\":75,\"y\":75},{\"x\":225,\"y\":75}]","vertexCount":"23","img":{},"imgUrl":"https://qpay-onestroke-redpack-1251316161.cos.ap-*********.*********.com/*******/oneStrokeSubject/16********.png","id":"16**********"}}
现在用处理后的数据把Fiddler中response栏里的数据替换掉,也就是把很多点删减到只剩下两对坐标点。替换好后,点击Fiddler中的Run to Compoletio,将响应放行到QQ。Wow,QQ里的一笔画,现在竟然是一条线了。

open.png

连接路径点,点击“开”

error.gif

哦,大写的尴尬,不要放弃,你似乎少了一步。在点击“开”之前,将用户提交的路径点用之前备份的正确的服务器下发的路径点替换掉,因为这里的一笔画本身是一个很复杂的一笔画,复杂的点已经被服务器记下了,我们修改这里的路径点直至两个,是为了方便我们连出来然后可以点击“开”这个按钮,当然,你连接的是修改之后的路径点,只有两对。正确的路径点有很多很多,是之前备份下来的,所以这里要替换一下(在request body中替换)。替换掉oneStrokeHbOrbit数组对象的值。

success.gif

Congratulations!又一位黑阔诞生了。

完整操作视频

此处内容作者设置了 回复 可见

完结撒花

点击下方小红心↓ 表示你已成功变身黑阔。

6

评论 (1)

取消
  1. 头像
    学习
    Windows 10 · Google Chrome

    dalao

    回复