比邻通讯协议逆向探究(版本3.7.5.0)

注:本博文只是作为研究学习用途,请不要用于非法、商业用途。


0x01登录:

首先打开比邻,接入Charles,发一个登录包体,看一下报文构造

比邻通讯协议逆向探究(版本3.7.5.0)_第1张图片

可以看到Query String如下:

{
    "random": -546376261,//随机数,暂时不知道含义
    "clientType": "IPHONE",//手机型号
    "version": "3.7.5.0",//软件版本
    "netType": "WIFI",//手机网络
    "platform": "APPSTORE"//下载渠道
}

postData:

{
    "username": "54324324",//账号
    "areaCode": "86",//区号,中国为+86
    "password": "f76f739b38be1f7c505f5370981fe4b4",//密码,应该就是MD5值
    "idfa": "D965A2ED-3598-44C3-8602-3B49C8D77D81",//未知
    "mac": "020000000000",//mac码
    "setupMark": "2358EA54-5908-4C54-BA55-7C63F034568B"//未知
}

可以看到IDFA和setupMark暂时不知道是什么内容,我们再抓一次包体,看一下是否是固定。

比邻通讯协议逆向探究(版本3.7.5.0)_第2张图片

其实验证下是否固定,或者是必要的算法生成的值,我们可以尝试修改一下IDFA和setupMark的值,发送一下看看返回。
我比较偏激的把这两个值直接删除掉发送了

{
    "result": "Err-603" //密码错误
}

好吧,确定比邻的服务器并不验证这两个值,那么我们就直接构造登录包登录把

直接登录后返回:

{
    "result": "success",
    "UserAccount": {
        "userId": "1867xxxx",
        "username": "1xxxxxxxxx0",
        "password": "1xxxxx6",
        "accessToken": "d1d0ea7431a43ab1aa134652160938b5",
        "refreshToken": "2cca7144d1ebfdb83f03d080f361f96d",
        "signature": "U5bs4AdocVH8uxFcVPIhNonEvU4=",
        "time": "1433832915",
        "isBindMobile": "true"
    }
}

0x02个人资料:

登录返回了这么多东西,我们还不知道都是干嘛的,看一下个人资料的包体把

比邻通讯协议逆向探究(版本3.7.5.0)_第3张图片

发现有三个参数accessToken cnonce signature

老样子,载入IDA

看到这么一个CLASS
比邻通讯协议逆向探究(版本3.7.5.0)_第4张图片

accessToken signature 是登录的时候返回的,但是cnonce 不是登录的时候返回的,而这三个值必然每次HTTP访问都会出现,那么我们就全局搜索cnonce

最后搜索到了BLHTTPTool::signatureParams 这个函数,看下汇编代码

比邻通讯协议逆向探究(版本3.7.5.0)_第5张图片

可以看出调用了BLCallService::getSignature(Bool b)
跟过去看一下很有料嘛,动态调试看下返回值

调试过程就不写了,挺多的,直接说调试结果:
返回值是BLAuthenticationSignature类型:

@interface BLAuthenticationSignature : NSObject
{
    unsigned int _reqTimestamp;
    unsigned int _keyTimestamp;
    NSString *_randNum;
    NSString *_signatureStr;
}

调试结果(抓包+动态调试):

{
    "signatureStr":"81d6fab49e8b2f15ef6125968eaccf977bee0f6a",
    "keyTimestamp":1433832733,
    "reqTimestamp":1433836532,
    "randNum":"DC37049E74DC4443AEB6C480FFCFD9F8"
}

比邻通讯协议逆向探究(版本3.7.5.0)_第6张图片

可以看到

cnonce = randNum
signature = signatureStr
keyTimestamp = keyTimestamp
reqTimestamp = reqTimestamp

确定了加密函数就是BLCallService::getSignature(Bool b),我们就开始分解这个函数把!

未完待续。

你可能感兴趣的:(Security,python,比邻,比邻协议)