nisosaikou 发表于 2021-4-25 14:46

分析博联智能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
    }
}
}
```

nisosaikou 发表于 2021-4-30 09:19

kangxing126 发表于 2021-4-29 06:55
感谢楼主分享!!能不能放上打log的smali文件啊?

可以用Android studio的插件 java2smali,非常方便的将java转成smali,你可以看一下

StarvedFish 发表于 2021-4-26 23:22

为什么都不加密,base64加密太低级了,类似的,我一直想对公司的软件吐槽,所以接口都是明文的

许小诺always 发表于 2021-4-25 15:44

感谢大佬分享.牛逼奉上

jswxtj 发表于 2021-4-25 16:09

{:1_893:}感谢大佬分享.

tuc 发表于 2021-4-25 16:21

膜拜大佬~~~

酱鸭腿 发表于 2021-4-25 18:38


感谢大佬分享

xixicoco 发表于 2021-4-25 19:44

好的,支持你哈

ROGm 发表于 2021-4-26 04:54

感谢大佬分享{:1_927:}{:1_921:}

nullable 发表于 2021-4-26 08:01

感谢大佬分享,收藏了先

senooo 发表于 2021-4-26 09:07

这样一来是不是就可以用esp8266 用博联的服务器了

jenny95 发表于 2021-4-26 10:10

这种协议和websocket类似,APP服务器一直保持心跳
页: [1] 2
查看完整版本: 分析博联智能APP协议