分析博联智能APP协议
# 分析博联智能APP协议## 本文章只用于学习交流
本文章只用于学习交流,任何人或组织不得用文章中涉及的技术进行违法犯罪活动。
## 关于博联智能(BroadLink)
杭州博联智能科技股份有限公司(BroadLink)成立于2013年,是专业的智能家居解决方案提供商,专注AI+IOT技术创新和应用,致力于打造全球领先的数字化服务平台。博联在智能单品、家居生态互联、智慧地产、智慧酒店、智慧家装、智慧楼宇及智慧养老等领域为客户提供有竞争力、安全可信赖的解决方案与服务。
目前,公司业务遍及百余个国家,服务超5000万户家庭。自主研发的智能单品年销售量超 500 万件;智能模块年发货量超 3500 万片,客户涵盖了市面上所有的主流家电电工品牌;智慧酒店落地58个城市,改造客房近万间;智慧地产解决方案落地全国 25 个城市,与 18 家位居国内 TOP50 的地产商展开合作,覆盖全国百余个楼盘批量项目。目前,BroadLink DNA互通平台已经成为全球最大的物联网 PaaS 平台之一,在AI结合IoT落地领域居全球领先。
博联智能坚持围绕客户需求持续创新,帮助每个家庭、企业、行业实现数字化转型,构建万物互联的智能世界。
> 关于博联智能来自官网。
## 数据传输方式
现在主流的物联网app的数据传输方式主要分为两种,第一种是通过蓝牙连接进行传输数据,第二种是通过网络流量进行数据传输。
确定数据传输的方式很简单,只要关闭蓝牙或者数据流量(包括WiFi),如果在关闭时,无法控制物联网设备,则可以大致地确定传输方式。
在本实验中,关闭了设备的蓝牙,能够正常的控制物联网设备,但是在关闭数据流量(WiFi)后,无法控制物联网设备,确定当前控制方式为网络数据控制方式。
## jeb分析
用jeb 3.0进行分析。
### 分析Manifest
- 包名
!(https://gitee.com/nisosaikou/pb/raw/master/img/20210316102909.png)
- 初始Activity
!(https://gitee.com/nisosaikou/pb/raw/master/img/20210316103317.png)
### 分析包架构
!(https://gitee.com/nisosaikou/pb/raw/master/img/20210316103648.png)
!(https://gitee.com/nisosaikou/pb/raw/master/img/20210316150729.png)
因为本设备当前控制方式为**网络流量**控制,所以我们可以重点分析网络发送的代码。经过包结构和代码的初略分析,发现`BLBaseHttpAccessor`这个类向外发送数据。
### 分析`BLBaseHttpAccessor`
这个类中有许多关于网络的方法,其中主要包括了下载以及`get`、`post`请求。
来分析一下`post`方法。
!(https://gitee.com/nisosaikou/pb/raw/master/img/20210316154219.png)
我们想要知道在代码执行的过程中,发送的数据。通过解包,插入代码来输出这些值。
## 解包、封包、签名
用baksmali、smali进行解包和封包。
!(https://gitee.com/nisosaikou/pb/raw/master/img/20210316143709.png)
修改smali汇编代码。
!(https://gitee.com/nisosaikou/pb/raw/master/img/20210316152001.png)
用smali进行封包后签名,安装运行,查看日志。
## 日志分析
安装app进入设备管理页面,用`adb logcat`查看运行日志。
!(https://gitee.com/nisosaikou/pb/raw/master/img/20210316152213.png)
## 分析协议
经过日志的观察与分析,发现了开和关的控制指令。
!(https://gitee.com/nisosaikou/pb/raw/master/img/20210316152547.png)
协议:
- 其它的基本都没有变化。在改变物联网设备的状态时,主要改变的是`msgId`、`时间戳`和`payload`。
- `msgId:`设备编号-当前时间戳
- `时间戳:`当前时间戳
- `payload`
> **关**:paVaWsLDAgsJAAAAeyJwd3IiOjB9
>
> **开**:paVaWsPDAgsJAAAAeyJwd3IiOjF9
>
> **状态不变:**paVaWrPBAQsCAAAAe30=
### 编码规则
payload中的data是由base64编码。
> **关**:`ZZ {"pwr":0}`
>
> **开**:`ZZÃ {"pwr":1}`
>
> **状态不变**:`ZZA{}`
返回的状态。
```json
ZZ⻃{"pwr":0,"ntlight":0,"indicator":1,"usbpwr":0,"maxworktime":0,"usbmaxworktime":0,"ntlbrightness":100,"current":0,"volt":-1,"power":0,"totalconsum":-1,"overload":-1,"childlock":0}
ZZA{"pwr":1,"ntlight":0,"indicator":1,"usbpwr":0,"maxworktime":0,"usbmaxworktime":0,"ntlbrightness":100,"current":-1,"volt":-1,"power":-1,"totalconsum":-1,"overload":-1,"childlock":0}
```
## 协议的思路总结
app和服务器一直处于一个交互发包的状态。
平常的情况下,app会向服务器发送心跳包。payload::data为`paVaWrPBAQsCAAAAe30=`。
如果app改变了物联网设备的状态,其中的payload::data就会改成对应的控制码。
服务器一直向app返回当前物联网设备的状态信息。
## 验证
写一个`bash`脚本,修改其中的关键信息,模拟向服务器发送控制包。服务器正常相应,物联网设备正常关闭和开启。实验成功。
数据包格式:
```json
POST https://app-service-chn-467a8f05.ibroadlink.com/device/control/v2/sdkcontrol?license=FAFHbgwKto7KIndSfYfvoF2fn4d9mo1O38bC2daV1YDIVSNtqPJHN0lydeBilOoARbIdXQAAAABhrY5+pJiOhusZn3NFrm8nbqcPo0m/vr7IlyWSeEQyNV1pfrZPeC/egGXMQWfKNpZTLy+ybRiPJmSZnlsrGQMMsEkbxXTfoUSQjDzWcfVjcAAAAAA= HTTP/1.1
Content-type:application/x-java-serialized-object
system:android
appPlatform:android
language:zh-cn
timestamp:1615858966
appVersion:1.6.13
loginsession:1a852f2aff09f773fa025798c81c72a6
lid:1401476e0c0ab68eca2277527d87efa0
licenseid:1401476e0c0ab68eca2277527d87efa0
userid:11d83f8482bfe8e3b2c3c8b62f330895
User-Agent:Dalvik/2.1.0 (Linux; U; Android 8.0.0; Pixel 2 Build/OPD1.170816.010)
Host:app-service-chn-467a8f05.ibroadlink.com
Connection:Keep-Alive
Accept-Encoding:gzip
Content-Length:952
{
"directive": {
"header": {
"namespace": "DNA.TransmissionControl",
"name": "commonControl",
"interfaceVersion": "2",
"messageId": "0000000000000000000024dfa7eedc5b-1615859500",
"timstamp": "1615859500"
},
"endpoint": {
"devicePairedInfo": {
"did": "0000000000000000000024dfa7eedc5b",
"pid": "00000000000000000000000068750000",
"mac": "24:df:a7:ee:dc:5b",
"devicetypeflag": 0,
"cookie": "eyJkZXZpY2UiOnsiaWQiOjEsImtleSI6ImZmMTIzZTA3ZTJkN2Q3NDBjNDljNzE3YWE3NjEwYjM0IiwiYWVza2V5IjoiZmYxMjNlMDdlMmQ3ZDc0MGM0OWM3MTdhYTc2MTBiMzQiLCJkaWQiOiIwMDAwMDAwMDAwMDAwMDAwMDAwMDI0ZGZhN2VlZGM1YiIsInBpZCI6IjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDY4NzUwMDAwIiwibWFjIjoiMjQ6ZGY6YTc6ZWU6ZGM6NWIifX0="
},
"endpointId": "0000000000000000000024dfa7eedc5b",
"cookie": {}
},
"payload": {
"data": "paVaWsLDAgsJAAAAeyJwd3IiOjB9",
"notpadding": 0
}
}
}
``` kangxing126 发表于 2021-4-29 06:55
感谢楼主分享!!能不能放上打log的smali文件啊?
可以用Android studio的插件 java2smali,非常方便的将java转成smali,你可以看一下 为什么都不加密,base64加密太低级了,类似的,我一直想对公司的软件吐槽,所以接口都是明文的 感谢大佬分享.牛逼奉上 {:1_893:}感谢大佬分享. 膜拜大佬~~~
感谢大佬分享 好的,支持你哈 感谢大佬分享{:1_927:}{:1_921:} 感谢大佬分享,收藏了先 这样一来是不是就可以用esp8266 用博联的服务器了 这种协议和websocket类似,APP服务器一直保持心跳
页:
[1]
2