滴滴青桔逆向:如何还原被破坏的二维码

前情提要:早在半个多月前,我就发现了有车的二维码被人用马克笔人为破坏了。关键是软件里还只支持扫码骑行,也就是说二维码在被破坏的情况下没有人能骑走这辆车。当时车还有很多,我大可以再换一个车骑;但是呢,我又不想让破坏者得逞。于是我就开始研究破解方案,然后就有了这期复盘。
首先我的思路是既然破坏者只破坏了二维码,那么一定就会有它的疏漏。比如——车上的那个唯一串码数字。
当时我有了基于这个方案的思路,既然这串数字ID没被涂,那么就一定有办法通过发包传入这个ID来在底层手动地创建订单。只要车上的ID在这里被使用到了,就还有一线生机。
到了具体落地的时候,我就想协议层的活还是太重了,然后我就把思路转变到了“如何重新生成二维码”上。如果这个方案不行的话那就不得不去看通信协议层了。
于是我找了一辆正常的车,把二维码用手机拍了下来。
二维码解码可得,目标链接如下:
1 | https://z.didi.cn/htw?id=42E80EF&p=2 |
但直接访问这个链接依然不行,提示我们打开微信小程序或滴滴APP扫码骑行。似乎我们又回到了原点。
于是我把目光聚集在查询参数上,注意到里面有一个名为id的参数,值是42E80EF。那这个值是哪来的呢?原本我以为是厂商预生成的一个随机字符串,不过看到这种格式感觉很像是十六进制,然后我立马进行进制转换,换回十进制就是70156527!和二维码下面的那串数字一模一样。
这下没悬念了,拿到ID之后自己构造参数然后把链接重新生成回二维码,最后软件里扫这个手动构造的二维码就可以正常骑了。
实践一下:
文章开头那个照片,来源是我发现的第二辆被人为破坏的二维码。当时是下晚自习了,人都走完了。现场就剩下了那辆谁都骑不了的单车,还好我之前逆向过以上的内容,如法炮制就成功不用跑腿了(我是不是还得谢谢他帮我留了辆车?)
——当然,开头那个图下面的id并不太能看清。因为看不出来5前面到底是1还是7。
结合车背和车把上的ID数值对比,可知准确ID为70156481。其十六进制表达为42E80C1。
最终URL为:https://z.didi.cn/htw?id=42E80C1&p=2
收工,结束。
