分析博联智能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
-
包名
-
初始Activity
分析包架构
因为本设备当前控制方式为网络流量控制,所以我们可以重点分析网络发送的代码。经过包结构和代码的初略分析,发现BLBaseHttpAccessor
这个类向外发送数据。
分析BLBaseHttpAccessor
这个类中有许多关于网络的方法,其中主要包括了下载以及get
、post
请求。
来分析一下post
方法。
我们想要知道在代码执行的过程中,发送的数据。通过解包,插入代码来输出这些值。
解包、封包、签名
用baksmali、smali进行解包和封包。
修改smali汇编代码。
用smali进行封包后签名,安装运行,查看日志。
日志分析
安装app进入设备管理页面,用adb logcat
查看运行日志。
分析协议
经过日志的观察与分析,发现了开和关的控制指令。
协议:
编码规则
payload中的data是由base64编码。
关:ZZ {"pwr":0}
开:ZZÃ {"pwr":1}
状态不变:ZZA{}
返回的状态。
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
脚本,修改其中的关键信息,模拟向服务器发送控制包。服务器正常相应,物联网设备正常关闭和开启。实验成功。
数据包格式:
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
}
}
}