吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5|回复: 0
收起左侧

[原创] 向日葵远程控制-自动逆向实战

[复制链接]
91vip 发表于 2026-8-28 10:09
向日葵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.netGET请求+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
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,那自然是更好的选择,建议优先使用官方接口

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

&#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私有化部署确实打开了很多可能性




发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-8-28 11:46

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表