向日葵远程控制-自动逆向实战

向日葵C1Pro插座逆向实战:MonkeyCode私有化部署打通智能充电自动化

标签: 软件逆向 | MonkeyCode | 智能家居 | Python自动化


【前言:为什么折腾这个?】

各位大佬好~ 最近入手了向日葵智能插座C1Pro,用途很简单——给我的电脑做智能充电管理。

背景: Codex跑起来基本24h不停,需要一个靠谱的方案自动控制电源开关,低电量开充、满电断电,防止过充。

结果: 买回来一看,向日葵APP压根没有开放个人API接口,想搞自动化控制只能对着APP手动点。
正好最近在玩 MonkeyCode私有化部署,迁移了一下自己本机的逆向工作流。抱着试试的心态,让它帮忙分析了一下向日葵Android APP(v15.5.8)。

结论前置:整个过程比我预期顺利太多,半小时出原型,直接上干货。


【一、逆向分析过程】

1.1 APK反编译定位核心入口

MonkeyCode私有化部署后,把APK扔进去自动反编译、定位关键函数。




定位结果:插座控制的核心入口在

dg/lf.java

以前这种活可能要对着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中搜索关键字符串

“==smart-plug==“

,直接命中

dg/lf.java

,这是插座控制的核心路由类。签名逻辑大约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
CPU2核
内存: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,那自然是更好的选择,建议优先使用官方接口

私有化部署教程(有需求可自行研究)

&#128279; 开源地址:https://github.com/chaitin/MonkeyCode
&#128194; 私有化部署:https://monkeycode.docs.baizhi.cloud/node/019eb0f3-9424-7c93-9489-4e584f989527

最后更新时间:2026-08-15
作者:吾爱 91vip
硬件:向日葵智能插座C1Pro
工具:MonkeyCode私有化部署 + Python 3.11
用途:Codex 24h运行智能充电管理


【互动区】

有搞硬件自动化的兄弟吗?还折腾过哪些设备的逆向?
MonkeyCode私有化部署做协议分析,你们还用来搞过什么项目?
有其他智能插座推荐吗?求避坑指南

有搞硬件自动化需求的兄弟可以参考一下思路,MonkeyCode私有化部署确实打开了很多可能性


免费评分

参与人数 2 吾爱币 +2 热心值 +1 收起
理由
Eric00 + 1 + 1 我很赞同!
hy511 + 1 用心讨论,共获提升!

查看全部评分

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容