注:本博文只是作为研究学习用途,请不要用于非法、商业用途。
首先打开比邻,接入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"
}
}
登录返回了这么多东西,我们还不知道都是干嘛的,看一下个人资料的包体把
发现有三个参数accessToken
cnonce
signature
老样子,载入IDA
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)
,我们就开始分解这个函数把!
未完待续。