某灯具蓝牙遥控App逆向

查看 112|回复 11
作者:henry42   
淘宝买了个灯具,送了个遥控。家里的设备都是多半是自己写软硬件,以单片机接收红外的方式低成本接入米家,然后语音控制。结果到手才发现,这个灯具是,,,,,,,蓝牙的。所以怎么接入米家呢?
这是我寻求破解的第一个原因。
去咨询了客服,结果客服说,蓝牙遥控仅此一份,万一坏了,想买个替换的都不行。
这是我寻求破解的第二个原因。
在网上大致搜了下,才发现,这个灯具的蓝牙模块是外包出去的,根据遥控细节,找到了这家公司,发现这家公司应用商店有各种遥控app,下载了其中灯具相关的app,为了反编译比较方便,选了Android版本的,下载试用了下,果然能遥控。开搞!
第一步,反编译,发现了熟悉的io.flutter,原来是用flutter写的UI,那下一步肯定是从flutter调用native的桥上入手,看看它有哪些插件。flutter的插件都固定实现MethodChannel,所以很容易缩小范围。


po1.png (60.4 KB, 下载次数: 1)
下载附件
2025-7-23 16:25 上传

从调用蓝牙库的import头上,定位到了BLE_Plugin这个插件。查看细节,Flutter获取参数,给插件,插件JNI调用一个加密库,生成广播数据,然后重复广播,当然广播的内容有防重放攻击的一些策略。


po2.png (256.05 KB, 下载次数: 1)
下载附件
2025-7-23 16:25 上传

然后问题来了,JNI的几个参数由于混淆过,都是简单的字母,不太清楚代表什么含义,靠猜有点儿难过。那么最简单的就是通过android的Log系统,把你点击的每个事件的参数打印到控制台。那我就把加密库的每个native调用方法,都改写成简单的print方法,当然改写的方式不能用java,整个项目反编译成smali,改完,再打包回去。当然,打包的时候遇到一些签名、对齐等问题,这里于主题无关,此处不表。
简单的操作灯具的动作,譬如对码,调亮度,调色温,等等基本操作,把参数记下来。下面有两条路,一条是直接使用加密库,用个虚拟的Android环境。第二个是看看加密库本身有没有加壳,混淆。所幸,我这边是第二种,异常顺利,把加密库的逻辑改成c代码。


po3.png (534.84 KB, 下载次数: 1)
下载附件
2025-7-23 16:25 上传

然后一切都简单了,根据参数,生成广播数据,通过加密库加密广播数据,以一定逻辑广播出去。控制成功!
最后就是用ESP32模块接收红外信息,然后再转换成蓝牙广播。这一顿折腾,我终于可以用小爱同学愉快的来控制我的灯具了。

蓝牙, 灯具

冥界3大法王   

这让我想起了多年前办的工行U盾
让我折腾腿三次营业厅
最终发现给的光盘驱动竟然给错了品牌,还是被我自己琢磨出来的。什么工作人员呢,都该下岗。
leonsir   

高手啊,膜拜,请教一下flutter的安卓app有两个版本号,通过长版本验证强制升级弹窗应该怎么入手解除啊,长版本号在so文件里。
asdblue   

大神牛逼,这种小作坊的遥控确实还是得掌握在自己手里
n0rma1playe2   

感谢分享
free1031   

真是太有用了,感谢楼主
cpbjlwh   

太牛了!要经常地持续学习!
wang5170   

学习一下。谢谢
agnostic   

不明觉厉哈哈哈
jokerset   

哈哈,收藏一下,以后自己家里也搞一个
您需要登录后才可以回帖 登录 | 立即注册

返回顶部