广汽丰田的风云行app,提供的车联网功能还是挺好用的,但是只能提供车辆的位置信息,不能提供行驶轨迹等功能。于是抓包看了下他的功能逻辑。
登录
// 登录地址(post):https://carapp.gtmc.com.cn/api/appgtmc/reg/action/AppUserInfoAction/appUserLogin.json// 参数(body)accessToken=&appVersion=4.3.0&checkCode=&deviceId=&deviceType=2&distinctId=&loginType=2&password=&phoneName=&phoneNumber=&pushId=返回值:
{ "data": { "jwt": "", "rData": { "birthday": "", "passWord": "111", "communtiyFlag": "0", "dealerName": "", "address": "", "kickOut": true, "dealerCode": "", "sex": "null", "resultCode": "", "description": "", "userId": 111, "uuid": "111", "telPhone": "111", "name": "1", "status": "0", "username": "11" } }, "success": true, "resultCode": 200, "elapsedMilliseconds": 0}jwt 就是登录凭证,有了这个登录凭证后续的请求都可以进行鉴权。
这里后端返回了passWord字段,个人觉得非常不合适。后端要么是直接返回的用户数据,要么就没有做非对称加密,直接数据库解码出用户的密码字段!通过网络劫持,很容易就嗅探出用户的密码了。
给广汽的邮箱和微信反应过这个问题,没有得到任何回应....
控制密码校验
// get 请求https://carapp.gtmc.com.cn/api/vhcApp/controlpwd/checkControlPwd?phone=&pwd=// header Authorization:{{jwt}}通过用户的手机号码和控制密码,jwt校验,进行用户身份识别.
返回:
{ "resultCode": 200, "errMsg": null, "elapsedMilliseconds": 35, "data": { "code": "1" }, "success": true}code:1 校验通过,经过测试,这个校验状态的有效期约为三分钟
获取车辆位置
// get 请求(vin 是车架号码)https://carapp.gtmc.com.cn/api/vhcApp/lookForCar/fixedPosition?vin=// header Authorization:{{jwt}}返回结构:
{ "resultCode": 200, "errMsg": null, "elapsedMilliseconds": 1009, "data": { "remissId": null, "latitude": "100", "being": 0, "longitude": "200", "status": 1 }, "success": true}其中 latitude longitude 就是车辆的经纬度了.
位置上报
以上的信息似乎就可以获取车辆的位置信息,画出行驶轨迹了。
然后,我在车辆行驶中时候抓包时候,发现车辆的位置一直是上一次停车的那个点。推测,车辆位置并不是实时上报,而是车辆停止,熄火后上报一次,功能也只用来追踪车辆的最终停止位置。
还能做什么
抓包研究的过程还是非常有意思的。虽然我们最初的结果没有达到,但是我们用这些数据依然可以做很多有意思的事情,比如用flutter把这些功能重写一遍?
原文地址:aocoding.com/2020/06/17/…