向日葵C1Pro插座逆向实战:MonkeyCode私有化部署打通智能充电自动化
标签: 软件逆向 | MonkeyCode | 智能家居 | Python自动化
【前言:为什么折腾这个?】
各位大佬好~ 最近入手了向日葵智能插座C1Pro,用途很简单——给我的电脑做智能充电管理。
![]()
背景: Codex跑起来基本24h不停,需要一个靠谱的方案自动控制电源开关,低电量开充、满电断电,防止过充。
结果: 买回来一看,向日葵APP压根没有开放个人API接口,想搞自动化控制只能对着APP手动点。
正好最近在玩 MonkeyCode私有化部署,迁移了一下自己本机的逆向工作流。抱着试试的心态,让它帮忙分析了一下向日葵Android APP(v15.5.8)。
结论前置:整个过程比我预期顺利太多,半小时出原型,直接上干货。
【一、逆向分析过程】
![]()
1.1 APK反编译定位核心入口
MonkeyCode私有化部署后,把APK扔进去自动反编译、定位关键函数。
定位结果:插座控制的核心入口在以前这种活可能要对着jadx翻一整天,现在AI直接梳理调用链,一步到位。
1.2 协议分析:两套API体系
MonkeyCode自动识别出向日葵插座的两套API:
| 功能 | 域名 | 协议格式 | 备注 | | 登录认证 | api-std.sunlogin.oray.com | 标准JSON | 常规登录流程 | | 设备控制 | slapi.oray.net | GET请求+query参数 | 核心控制接口 |
1.3 协议逆向:双层认证 + 动态签名
控制接口的认证比想象中复杂——实际上是双层认证叠加使用:
第一层:OAuth2 Bearer Token(登录态)
登录走标准JSON协议,但密码传输做了MD5预处理:
POST https://api-std.sunlogin.oray.com/authorization
Content-Type: application/json
{
“type“: “password“,
“account“: “手机号“,
“password“: MD5(明文密码), ← 客户端先哈希
“ismd5“: true ← 告诉服务端这是已哈希的
}
注意这个双MD5设计:客户端哈希一次传上去,服务端大概率还会再哈希一次存储。经典防撞库方案,但密码只哈希一次不做salt,强度有限。
返回的 access_token 会作为Bearer Token附加到后续所有请求,同时还需要两个硬编码的客户端标识:
Authorization: Bearer {access_token}
EX-Clientid: e8013768-a34e-4c30-9502-5c9a43d3086e ← APP唯一标识
EX-Client-Auth: 3yLLt7MwRs4#dPi9@!986^EMtIoyB6l0 ← 客户端密钥
第二层:请求级动态签名(防重放)
控制接口走独立域名 slapi.oray.net,用 GET请求 + URL参数 的方式通信(不是POST),每个请求都携带动态签名:
GET https://slapi.oray.net/plug?
_api=set_plug_status& ← 操作类型
sn=14958XXXXXXXX& ← 设备序列号
index=0& ← 端口号(多口插座用)
time=08101430& ← 当前时间 MMddHHmm
key=a1b2c3d4e5f6...& ← 签名值
status=1 ← 业务参数(开=1/关=0)
签名算法还原:
key = MD5( SN + “==smart-plug==“ + TIME_STR )
其中:
SN = “14958XXXXXXXX“ (设备序列号,12位)
分隔符 = “==smart-plug==“ (硬编码在APP中)
TIME_STR = “08101430“ (MMddHHmm格式)
拼接明文: “14958XXXXXXXX==smart-plug==08101430“
MD5结果: “a1b2c3d4...“
逆向定位过程:
在JADX中搜索关键字符串,直接命中,这是插座控制的核心路由类。签名逻辑大约20行代码,没有混淆、没有native层,属于一眼真级别的简单算法。
完整调用链:APK入口 → SunloginService → dg/lf.java(路由+签名)
→ pd/b.java(HTTP执行) → slapi.oray.net/plug
安全性评估:
| 维度 | 分析 | 风险等级 | | 签名强度 | MD5+字符串拼接,无HMAC,无密钥轮换 | 弱 | | 重放攻击 | 时间精度到分钟,1分钟窗口内可重放 | 中 | | 密钥管理 | 签名密钥=设备SN,相当于公开信息 | 弱 | | 传输安全 | 全链路HTTPS,但参数明文拼在URL中 | 中 | | 客户端密钥 | EX-Client-Auth硬编码在APK中 | 弱 |
总体评价:签名的目的更多是“防止误调用“而非“防止逆向“,对于IoT设备来说算行业平均水平,但安全性确实不高。
1.4 定时任务逻辑梳理
定时任务这块比较坑,MonkeyCode帮我理清楚了转换逻辑:
时间存储: 服务端存UTC时间(分钟数)
时间显示: 设备端显示北京时间(+8转换)
重复规则: 7位位掩码控制(bit0=周日 ... bit6=周六)
示例:repeat=62 → 二进制 01111110 → 周一到周五(工作日)
repeat=65 → 二进制 1000001 → 周六+周日(周末)
repeat=127 → 二进制 1111111 → 每天
北京时间 22:00 → 存储值 (2260 - 860) = 840 分钟(UTC)
搞定这个之后,定时开关、周期性任务都能精确控制。
【二、最终成果:Python控制脚本】
基于以上分析,最终输出一个完整的Python控制脚本,功能覆盖:
![]()
| 功能 | 说明 | 状态 | | 开关控制 | 远程开启/关闭插座电源 | 已实现 | | 状态查询 | 查询当前开关状态、设备在线情况 | 已实现 | | 定时任务 | 设置指定时间自动开关,支持重复规则 | 已实现 | | 倒计时 | 设置延时关闭(如充电2小时后自动断电) | 已实现 | | LED控制 | 控制插座指示灯开关 | 已实现 | | 断电恢复 | 设置断电后恢复状态(记忆/关闭/开启) | 已实现 |
核心代码结构:
class SunloginPlug:
login() # 登录获取token,自动缓存2小时
_plug_request() # 签名 + 发请求的统一封装
get_status() # _api=get_plug_status
set_status() # _api=set_plug_status
timer_add() # _api=plug_timer_add (JSON序列化)
timer_del() # _api=plug_timer_del
cntdown_add() # _api=plug_cntdown_add
set_led() # _api=set_plug_led
set_dfltstat() # _api=set_plug_dfltstat
【三、自动化工作流】
现在我的完整方案跑起来了:
本地Python脚本(定时执行)
↓
查询插座当前状态 + 电脑电池电量
↓
电量 < 20% → 发送“开启“指令 → 开始充电
电量 > 95% → 发送“关闭“指令 → 停止充电
↓
全程无需打开手机APP,24h自动循环
效果: Codex跑满24小时,电池始终维持在20%-95%之间,彻底告别过充焦虑。
【四、MonkeyCode私有化部署体验+教程】
4.1 为什么选私有化?
无安全围栏: 做协议分析类工作不会跟你扯“这可能涉及版权问题“之类的废话,直接干活
数据不出域: APK反编译、代码分析全在本地/私有云完成,敏感信息不外传
模型自由切换: DeepSeek/Qwen/GPT任切,哪个适合用哪个
成本可控: 一次性部署,后续仅承担服务器费用,无订阅制压力
4.2 部署环境准备
官方教程: MonkeyCode私有化部署Wiki
我的机器配置:阿里云ECS
CPU:2核
内存:4G
硬盘:40G
系统:Ubuntu 22.04 LTS
实测2c4g跑私有化+宿主机一体丝滑流畅,逆向工作流迁移上去后,云机24h自动处理,很方便。
部署方式选择:
| 方式 | 适用场景 | 复杂度 | | Docker一键部署 | 快速体验、测试环境 | ★☆☆ | | 宿主机直接部署 | 长期使用、性能要求高 | ★★☆ | | K8s集群部署 | 企业级、多实例 | ★★★ |
个人推荐宿主机直接部署,资源占用更低,响应更快。
4.3 逆向工作流一条龙
部署完成后,把逆向工作流完整迁移上去:
APK扔进去 → 自动反编译 → AI定位关键类 → 梳理调用链
→ 协议分析 → 生成可运行代码 → 本地直接测试
以前对着jadx翻一整天,现在半小时出原型,效率差距肉眼可见。
私有化后还能24h挂机跑自动化任务,比如批量分析APK、自动生成POC代码,云端版本做不到。
4.4 适合场景
硬件设备app端逆向(智能家居、IoT设备)
私有协议分析(APP无开放API时)
自动化脚本开发(签到、控制、数据采集)
敏感项目:金融、政务、企业内网工具
【五、声明与风险提示】
声明:
本文涉及的逆向分析仅针对个人购买的向日葵C1Pro设备
所有代码仅用于个人设备自动化控制,不对外提供服务
向日葵如果后续开放官方API,那自然是更好的选择,建议优先使用官方接口
私有化部署教程(有需求可自行研究)
🔗 开源地址:https://github.com/chaitin/MonkeyCode
📂 私有化部署:https://monkeycode.docs.baizhi.cloud/node/019eb0f3-9424-7c93-9489-4e584f989527
最后更新时间:2026-08-15
作者:吾爱 91vip
硬件:向日葵智能插座C1Pro
工具:MonkeyCode私有化部署 + Python 3.11
用途:Codex 24h运行智能充电管理
【互动区】
有搞硬件自动化的兄弟吗?还折腾过哪些设备的逆向?
MonkeyCode私有化部署做协议分析,你们还用来搞过什么项目?
有其他智能插座推荐吗?求避坑指南
有搞硬件自动化需求的兄弟可以参考一下思路,MonkeyCode私有化部署确实打开了很多可能性
|