广汽丰田的风云行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把这些功能重写一遍?