车智赢app请求参数解析
app:车智赢-v3.13.0
接口:https://dealercloudapi.che168.com/tradercloud/sealed/login/login.ashx
解析流程:
该app有root检测,但是只检测无对应措施,也无双向验证,可以正常抓包请求,经过请求发现,_sign,udid,pwd三个参数有做加密,同样使用jadx进行反编译
直接搜索接口地址,直接进去查看,在本页搜索LOGIN_URL看一下有谁调用,loginByPassword方法创建了一个post请求,视乎直接对密码进行md5加密,我们直接查看一下encodeMD5方法
直接手动写个md5加密进行验证,发现和抓包到的加密密码一致
1 |
|
也可以再hook一下loginByPassword和loginByPassword方法,看一下是否和我们的结果一样,结果一致
直接搜索_sign,结果不多,可以都点进去看一下,这里直接进到这个key_sign里面去
发现这里定义了请求头里面的一些参数,我们直接搜KEY_SIGN看下有谁调用了,getRequestParams方法这里视乎对sign加密前的参数做了一些处理,我们看一下signByType方法
我们直接hook一下signByType方法看一下,发现加入的参数就是请求体,再看一下signByType的逻辑,就是循环请求体,然后拼接键值对,再开头和结尾加一个KEY_V2,这个参数固定是W@oC!AH_6Ew1f6%8,所以我们得先解决uuid是什么
接下来搜索”udid” 结果不多,我们直接看第二个,再看下getUDID方法,发现好像是一个3des加密,encode3Des方法传入两个参数,一个是Context还未知,一个是sb,我们对sb参数简写一下,REPORT_VAL_SEPARATOR是”|”固定,
1 |
|
我们也可以hook一下encode3Des方法,看一下传入的参数是什么样的,然后我们再去追究一下sb的参数内容是什么
回到getUDID方法处,先看下getDeviceId(context)是什么,进去之后发现getDeviceId反编译未成功,我们重新把app拖进去反编译一下,getUDI方法总体逻辑没变,只是里面的一些参数名称变了getDeviceId方法变成了getIMEI方法,这里不用管,反编译问题,我们进去看getIMEI是什么
进去之后发现调用了getIMEIbyAndroidIDandUUID方法,返回的是一个随机uuid,这个可以直接用str(uuid.uuid4())方法生成
第二个参数System.nanoTime(),百度了一下这个方法,有点类似于开机到现在系统的时间差,比如你开机的时间错是11111,现在的时间是11222,那么System.nanoTime()就是两者之差,我们也可以直接用random再两个范围内随机获取
1 |
|
第三个参数getDeviceId,点进去看一下,发现有一个saveDeviceId和一个getDeviceId方法,我们猜测这个id应该跟系统有关,可能是先存了,在获取,所以我们可以直接hook saveDeviceId这个方法
hook之前需要先清空缓存,毕竟先做了存储,发现这个id跟https://dealercloudapi.che168.com/tradercloud/v100/push/regdevice.ashx
这个接口的返回数据一样,猜测是这个接口对deviceid做了处理,我们可以先将deviceid固定,到后面测试的时候,将其切换成空试试,搜了一圈,这个玩意视乎和一个叫做个推id的东西有关
接下来我们看encode3Des方法,明文已知,iv值是固定值appapich,现在就差加密的key,我们直接看getDesKey方法,发现最终调用的是native的方法,对应的so文件名称是native-lib
我们直接hook getDesKey方法,看下会返回什么,多请求几次发现值始终是固定的,这下key也知道了appapiche168comappapiche168comap
我们再hook一下encode3Des方法,然后加加密参数放到在线网站里面进行加密尝试,发现结果相同,说明是标准的3des加密 我们直接改写python代码
经过测试之后,也是发现deviceid是可以为空的
1 |
|