当智能喂食机停摆……第二篇

书接上一回:https://a-li.me/851.html

从配网代码的回调里面看到,在配网成功后,会通过EsptouchActivity的TCP_SEND和UDP_SEND来尝试向设备投递信息,tcp端口是2003,udp是2002,投递的内容是邮件地址,也就是用户账号

jd-gui里面tcp部分发送代码不能很好的反编译,但也能看个大概,并且可以通过udp的部分做对比参考,看起来并没有特别的封包格式,直接字符串投递过去,设备应该会回显这个email内容,app侧做一个简单对比来确认配置成功。

尝试通过go写这个tcp client 发送我的邮件地址过去设备,一开始没有成功,忘了他代码里面有个特别编码,在邮件地址前后增加两个冒号,添加后发送成功,设备成功回显,并且也有声音提示,抓包这边也开始看到数据包不断往来。

从路由器tcpdump的流量来看,设备想要通讯的域名是juzilink.com,但是一直dns失败,域名不存在,whois查询发现这个域名大概是1个月之前过期了……当前处于赎回宽限期

在路由上做一个域名劫持到我的笔记本之后,可以看到喂食器设备尝试通过udp7000端口进行通讯,并且在失败若干次之后会有类似于重启的操作重刷dhcp

同样的我们拿go做个简单的udp server,看看设备会发什么过来

初步看数据内容比较像经过base64编码,并且有一些拼接封包迹象。选段通过标准base64解密得到一些二进制内容,没有获得有效的信息。但是有意思的是,从udp server这边可以看到发包很频繁(按键触发后1秒1个,3分钟后降到2秒1个,后面会降到最长5秒1个的样子),可能为心跳包(也有可能有会话属性,只是因为我空实现没回包设备无限重试),从上面图也可以推断为心跳包,因为相邻每个包内容只有1个字符变化,怀疑原始数据就是时间戳之类的,而且从这个变化也可能可以反推出base64用的码表顺序。

然而实际上除了这个心跳之外,包括按设备上的按键,都没有触发有明显差异的数据包,更别说从控制中心下行的数据。所以控制中心和设备这侧的问题始终无法解决。

未完待续

当智能喂食机停摆……

国庆假期回家,如往常一样set好猫猫的饮用水、摄像头和喂食机,结果却发现喂食机App无法正常工作了,无法在列表中刷出我的喂食机设备。考虑到可以远程控制,必然有个官方后台服务做类似于控制中心的角色,感觉那个服务可能歇菜了。App已经不能在App Store搜索到,手机上的版本连全面屏都尚未适配。App中Copy Right是2016-2018,搜索到的官方公众号也在18年停更。木得办法着急出门只能让猫猫敞开吃了……

回来一查,这个小桔智能喂食机,中山厂家小桔互联出品,域名orangelink.cn 2021年到期,但已经找不到可以打开的主页,先给域名持有人罗先生的邮箱发个邮件问问(交叉对比的天眼查这家公司的法人信息)

话说还有点想让喂食机复活,有那么几个思路:

  1. 抓包理出机器和后台控制中心通讯使用的域名、协议等,倘若协议比较简单,可通过路由器dns host把原控制中心域名转发到自有服务器,再mock一个控制中心的实现即可。
  2. 如果网络协议难以分析,可以从app入手,可以拿android的安装包反编译看看有什么线索。
  3. 再不济,因为机器上有手动出粮开关,我可以外挂其他设备例如m5stack(esp32)来做控制和远程通讯,在桥接手动出粮开关即可

首先尝试思路1,通过手机上的App直接进行抓包,可以看到请求发往api.orangelan.com:443,这个域名解析到一个香港的ip,但是由于SSL连接错误无法进行下一步,因此没能看到请求细节,在电脑上telnet 443尝试可以连上但是秒被断开。如果需要进一步探测需要mock一个https的server,做路由dns host和mitm重签名,暂时放一放,看看App反编译的思路有没有提示。

从搜索引擎拿到一个小桔App的Android版apk,尝试丢到在线反编译网站,发现腾讯乐固的痕迹,看不到什么实质内容。参考网上方法尝试用Xposed脱壳,但是由于我只有x86 Android虚拟机,没有适配的Xposed框架支持,于是改用frida的方式,可以轻松拿到3个dex文件,选择其中最大的那个(另外两个大小可以推测不是业务内容),通过dex2jar转换成jar,然后就可以通过jd-gui查看部分代码内容。

代码内容里面,从com.orangelink.orangepet_tencent.common 中找到一个ServiceMethod的class,里面有各种api的url,简单来看后台应该由asp技术搭建(确实跟不上潮流了)

再看了下其他代码,内容还是不少的。不过理论上app里面只包含app到设备,app到控制中心的内容,并不包含设备到控制中心的通讯内容,这部分还需要抓设备的包才能看到,设备可能还不像手机可以方便的做https mitm。

App到设备这一段,可以在代码里面看到一个叫 Esptouch 的东西,看了下Expressif家的一个协议,用于给相关设备配置Wi-Fi,感觉是公开协议的话比较好实现。从com.orangelink.orangepet_tencent.device 中 EsptouchActivity.class 的一个点击事件可以看到,配网需要ap的ssid,bssid和密码

如果采用的是标准的Esptouch协议配网,那么实际上Expressif自家有个demo app就可以用。一开始尝试死活不能成功,demo app并不能成功使喂食机重新配网,后来看App中提示Wi-Fi必须是2.4G的不能是5G的,而我是2.4G+5G融合信号,想着可能有影响,于是用主路由纯2.4G信号进行配网,秒可以。

在路由上tcpdump喂食机的流量,比较诡异,喂食机连Wi-Fi之后,只和s1a.time.edu.cn做了ntp对时,并未抓到和控制中心的通讯包

而且断电重启之后发现黄灯闪烁,依然停留在配网模式。因此怀疑在配网成功之后,原喂食机App需要把用户信息包含密钥投递到喂食机,喂食机才能用这些信息和后台控制中心联网,所以接下来还要看看配网之后的设备初始化(用户绑定/设备远程注册)流程,未完待续……

参考内容:

https://www.tianyancha.com/brand/b0c8d9052

https://xz.aliyun.com/t/7670

https://www.jianshu.com/p/3ae7ef9b4d13

https://www.espressif.com/zh-hans/products/software/esp-touch/overview

https://www.espressif.com/sites/default/files/documentation/esp-touch_user_guide_cn.pdf

https://blog.csdn.net/flyingcys/article/details/49283273

记录一次 Android TV 网络访问排障

之前反复看了好久电视盒子,最高看到像冥王峡谷 S922芯片的怪兽,奈何钱包羞涩,最终还是选了比较成熟的中档 S905x3的系列,有很多选择,最终买的是 MECool KM1 4G 内存的版本。

之前用着一直没什么问题,最近总是出现一个系统提示 Wifi 已连接但无法访问互联网,实际上基础网络访问是没问题的,像腾讯视频之类的,但 youtube 就无法打开,奇怪的是同一路由下不管是手机还是电脑都能正常播放。

关于系统的那个提示其实历史悠久,很久之前 android 就开始有惊叹号、红叉问题,是关于 generate_204的问题,这个机制原本用途是在连上 wifi 之后,检查是否需要弹出Web认证,由于 Android 默认的检查URL 是在 google 系列服务器上(gstatic.com/google.com),导致无法完成这个过程,这个解决办法大家已有共识,包括 v2ex,miui 等均提供了 generate_204 url,通过 adb 修改即可。

然而修改 generate_204 url 并不能解决我电视盒子的问题,看 logcat 很久也没有看到什么线索,于是上周我把盒子还原了出厂,还原之后果然好使,然而并不知道为什么。过了几天之后,夫人反馈又出现无法联网提示。这次我认真盯了很久的 logcat,并且通过忘记 WiFi 等方法重试,终于给我盯到一个线索如下图

这里头终于有一个有用的信息,证书过期时间超出范围,准确的说,是盒子时间不对。盒子的时间是2015-01-01,但证书是17年开始生效的,于是 SSL 握手过程失败。

于是拿遥控器看了下盒子的时间设置,是自动对时的,改成手动调到2020年一个时间之后,故障现象消失。

adb shell 里面看了下对时的设置,ntp 服务器竟然没有设置

顺手设置一下 ntp

settings put global ntp_server ntp1.aliyun.com

重启一下设备之后自动时间同步终于同步了一个正确的时间。

那我现在很疑惑重置之后为何第一次可以成功同步时间,猜测初始化过程有额外的应用层的对时,后续系统的 NTP 对时还要靠上面配置。