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

本文探讨了比邻通讯协议的登录过程和个人资料信息。通过对比邻的登录包进行分析,发现IDFA和setupMark字段并非验证关键,可以直接构造登录包实现登录。在个人资料部分,通过IDA反编译和动态调试,发现了用于加密的函数,并揭示了其在HTTP请求中的重要角色。后续将深入解析该加密函数。
摘要由CSDN通过智能技术生成

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


0x01登录:

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

这里写图片描述

可以看到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暂时不知道是什么内容,我们再抓一次包体,看一下是否是固定。

这里写图片描述

其实验证下是否固定,或者是必要的算法生成的值,我们可以尝试修改一下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个人资料:

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

这里写图片描述

发现有三个参数accessToken cnonce signature

老样子,载入IDA

看到这么一个CLASS
这里写图片描述

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

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

这里写图片描述

可以看出调用了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"
}

这里写图片描述

可以看到

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

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

未完待续。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值