数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 4675|回复: 221

[外设] 老王家S28P智能手表破解编程过程,最终找到能够使用的APK固件分享

    [复制链接]
发表于 2023-1-20 22:15:26 | 显示全部楼层 |阅读模式
1、前言

某天逛淘宝买电子垃圾的商铺,发现有智能手表买(Rick And Morty),评论说超值,于是入手了一个。由于没有做好功课,发过来的不是店家描述的那款。拿到手开机傻眼了,停留在配对阶段,没有APP可用无法配对,进不了界面。就是下面蓝色的等待配对的界面。这可怎么办?翻看TB评论区一看,结果也有很多人中招,买过来连时间都不能看,这手表有何用!!!又不想浪费时间退货,不甘心,想折腾下,于是有了下面的过程。
image.png
image.png

2、拆开

由于是分析之后发帖,所以图片上焊了飞线。借用下评论区的一些图片。
IMG_20230119_211100.jpg
IMG_20230119_211115.jpg
image.png
image.png
IMG_20230119_211729.jpg
IMG_20230119_211749.jpg
IMG_20221211_111440.jpg
IMG_20230120_150941.jpg

3、分析

主控是APOLLO3 的AMA3B,Flash 1M,SRAM 384K,看网上资料还挺多的,官网也有对应的SDK下载,可以采用Keil和JAR等编译。有人说SDK写的很好,有丝滑的感觉。于是想体验一下。看板子丝印,其中有2个测试点没有标注丝印,这个会不会是SWD烧录口呢?焊上飞线试下果然是,更惊奇的是可以读取固件(后面附上),也就是说该手表可以烧自己的程序,玩腻了再烧回原来的固件。

这一下子来劲了,马上焊上飞线,接上逻辑分析仪测试时序。
IMG_20230119_211352.jpg
image.png

时序有了,但是要自己写程序,有一个问题是:你知道是哪个GPIO来控制的吗?比如屏的SCK是那根线?有人说可以用万用表量啊,但是仔细看看板子主控是BGA封装,根本无法测试,走线有些在内层。于是写了一个循环程序挨个判断是哪个GPIO,并用逻辑分析仪查看波形。
最终得出如下GPIO

马达          GPIO18

LCD
LPE           GPIO23
SDA          GPIO28
WR           GPIO33  
SCK          GPIO27
SCS          GPIO1
REST         GPIO26
LEDSW        GPIO4      高电平亮
LEDK        10欧姆接地(负极)
LEDA         始终为高电平(正极)LED打开时电压升高

TP
TP_LCD         GPIO2
INT        GPIO34
SDA        GPIO49      
SCL         GPIO48
RST        GPIO45

按键        GPIO24    按键输入

LCD亮需要LEDSW和TP_LCD都为高电平才可以


LCD初始化,应该是ST7789的屏,分辨率240*240

REST复位 拉低10ms
0x11                      sleep out
延时50ms
0x36 0x00
0x3A 0x05               Interface pixel format
0xB2 0xC0 0xC0 0x00 0x33 0x33  Porch control
0xB7 0x35            Gate control
0xBB 0x38            VCOM Setting
0xC0 0x2C            LCM Control
0xC2 0x01            VDV and VRH Command Enable 只有1字节
0xC3 0x1A            VRH Set
0xC4 0x20             VDV Setting
0xC6 0x0F              FR Control 2
0xD0 0xA4 0xA1     Power Control 1
0xE0    14bytes       Positive Voltage Gamma Control
0xD0 0x09 0x10 0x0A 0x0A 0x26 0x34 0x44 0x4A 0x37 0x12 0x13 0x2E 0x33
0xE1    14bytes       Negative Voltage Gamma Control
0xD0 0x09 0x10 0x0A 0x0A 0x26 0x34 0x44 0x4A 0x37 0x12 0x13 0x2E 0x33

0x21                       Display inversion on

0x2A 0x00 0x00 0x00 0xEF  0 ~239  分辨率240*240   
0x2B 0x00 0x28 0x01 0x17  40~279

0x29   Display on


这样接口可时序都有了,那就体验丝滑的感觉吧。写个GPIO模拟SPI的程序,点亮屏幕。
IMG_20230119_212502.jpg


4、变回原本的时钟
光显示个图片没啥用,还是显示个时间还有点用,于是东拼西凑折腾了时钟程序。借用了https://blog.csdn.net/weixin_44291381/article/details/121117488的程序 “240*240 TFT 显示屏绘制表盘手把手教学,粗暴易懂

在此表示感谢,最后效果图如下:
IMG_20230119_210912.jpg

主程序很简单,也不管什么时间精度了,就是个演示,在这里贴上吧。


  1. #include "am_mcu_apollo.h"
  2. #include "am_bsp.h"
  3. #include "am_util.h"
  4. #include "rg_display.h"
  5. #include "cmt_spi4.h"
  6. #include "stdlib.h"
  7. #include "math.h"
  8. #define pi 3.14159
  9. #define HLen 50
  10. #define MLen 60
  11. #define SLen 70
  12. #define HInterval 30
  13. #define OInterval 6
  14. int hour=0,minute=0,second=0;
  15. int tmphour=0,tmpminute=0,tmpsecond=0;
  16. bool DsiplayFlag=1;
  17. int        Tcount=0;

  18. #define InputKey 24
  19. unsigned char Key_read=0xFF;
  20. unsigned char Key_last=0xFF;
  21. unsigned char Key_temp=0;
  22. unsigned char key_hold = 0;
  23. unsigned int  key_hold_cnt=0;
  24. unsigned char Key_OK = 0;

  25. void DrawClockHand(int len, int value, int _interval, uint32_t color)
  26. {
  27.   float x, y;
  28.   x = len * cos(value * _interval * pi / 180 - pi / 2) + 120;
  29.   y = len * sin(value * _interval * pi / 180 - pi / 2) + 120;
  30.   drawLine(120, 120, x, y, color);
  31. }
  32. void ClearDrawClockHand(int len, int value, int _interval)
  33. {
  34.   float x, y;
  35.   x = len * cos(value * _interval * pi / 180 - pi / 2) + 120;
  36.   y = len * sin(value * _interval * pi / 180 - pi / 2) + 120;
  37.   drawLine(120, 120, x, y, C_BLACK);
  38. }

  39. int main(void)
  40. {
  41.     // Set the clock frequency.
  42.     am_hal_clkgen_control(AM_HAL_CLKGEN_CONTROL_SYSCLK_MAX, 0);

  43.     // Set the default cache configuration
  44.     am_hal_cachectrl_config(&am_hal_cachectrl_defaults);
  45.     am_hal_cachectrl_enable();

  46.     // Configure the board for low power operation.
  47.     am_bsp_low_power_init();

  48.     // Initialize the printf interface for ITM/SWO output.
  49. //    am_bsp_itm_printf_enable();

  50.     // Clear the terminal and print the banner.
  51. //    am_util_stdio_terminal_clear();
  52. //    am_util_stdio_printf("Fast GPIO Example\n");
  53.         
  54.     am_util_delay_ms(1000);

  55.                 am_hal_gpio_pinconfig(TPVCC,g_AM_HAL_GPIO_OUTPUT_12);
  56.                 am_hal_gpio_output_set(TPVCC);               
  57.                 am_hal_gpio_pinconfig(InputKey,g_AM_HAL_GPIO_INPUT_PULLUP);
  58.           am_hal_gpio_enable_read(InputKey);
  59.           ili9341_init();

  60.           rg_display_BMP();
  61. //                while(1);
  62.     DrawClockHand(SLen, second, OInterval, C_WHITE);        
  63.     DrawClockHand(MLen, minute, OInterval, C_GREEN);        
  64.     DrawClockHand(HLen, hour, HInterval, C_RED);

  65.     drawCircle(120,120,5,C_WHITE);        

  66.           while(1){
  67.                         am_util_delay_ms(20);
  68.                         Tcount++;
  69.                         if(am_hal_gpio_input_read(InputKey))Key_temp=0xFF;
  70.                         else Key_temp=1;
  71.                         if(Key_temp!=0xFF)
  72.                         {
  73.                                 if(Key_temp==Key_last) { Key_last=Key_temp;key_hold=1;key_hold_cnt++;
  74.                         }
  75.                         else {Key_last=Key_temp; key_hold=0;key_hold_cnt=0; }
  76.                         }
  77.                         else
  78.                         {
  79.                                 if(key_hold==1){Key_read= Key_last;Key_last=0xFF; Key_OK=1; key_hold=0;key_hold_cnt=0;}
  80.                         }               
  81.         
  82.                         if(Key_OK==1){DsiplayFlag = !DsiplayFlag;Key_OK=0;}
  83.                         if(DsiplayFlag)am_hal_gpio_output_set(LEDSW);
  84.                         else am_hal_gpio_output_clear(LEDSW);
  85.                
  86.                         if(Tcount == 50){
  87.                                 Tcount=0;
  88.                                 second++;
  89.                                 if(second==60){
  90.                                         second=0;
  91.                                         minute++;
  92.                                         if(minute==60){
  93.                                                 minute=0;
  94.                                                 hour++;
  95.                                                 if(hour==12)hour=0;
  96.                                         }
  97.                                 }
  98.                         }        
  99.         
  100.                         if(DsiplayFlag==1){                        
  101.                                 if(hour != tmphour){
  102.                                         ClearDrawClockHand(HLen, tmphour, HInterval);
  103.                                         tmphour=hour;
  104.                                 }
  105.                                 if(minute !=tmpminute){
  106.                                         ClearDrawClockHand(MLen, tmpminute, OInterval);
  107.                                         tmpminute=minute;
  108.                                 }
  109.                                 if(second != tmpsecond){
  110.                                         ClearDrawClockHand(SLen, tmpsecond, OInterval);
  111.                                         tmpsecond=second;
  112.                                 }
  113.                                 DrawClockHand(SLen, second, OInterval, C_WHITE);        
  114.                                 DrawClockHand(MLen, minute, OInterval, C_GREEN);        
  115.                                 DrawClockHand(HLen, hour, HInterval, C_RED);
  116.                                 drawCircle(120,120,5,C_WHITE);        
  117.                         }               
  118.                 }
  119. }
复制代码




5、破解原固件
上面只显示个表盘时钟显然不够折腾,看到评论区到处找能够用的app无果,那能否从固件入手,破解跳过配对过程是否可以?
下载了Ghidra,果然强大,能看到很多信息。甚至能看到下载什么app,就是lovewin apk
image.png
image.png

于是全网搜索该APP,国内网下载了个lovewin 2.0.56,安装后不能使用,尝试国外网站。搜到一些信息,如:
image.png
image.png

但是APP始终无法下载。墙太厚了!!
找了半天,与其浪费时间,何不用下万能的TB,于是花5大圆请别人下载,安装一次配对成功进入界面!!!(后面附上)
而且这个APP平台没有挂,能够与手表同步,实时测量心跳,感觉比那个什么“瑞克和莫蒂“的好,那个APP平台已经挂了。
看下界面吧,可能很多人买了这个款手表积灰的现在可以拿出来了。
IMG_20230120_195337.jpg
IMG_20230120_195350.jpg
IMG_20230120_195447.jpg

手机APP界面
Screenshot_20230120_213435_com.lovewinpro.jpg
Screenshot_20230120_213438_com.lovewinpro.jpg
Screenshot_20230120_213442_com.lovewinpro.jpg


6、魔改手表
有了能够用的APP和自编程序,于是想二合一,把手表装上用起来。魔改下:
首先引出SWD的3根线
IMG_20230120_150941.jpg
IMG_20230120_154246.jpg
IMG_20230120_154522.jpg

在后盖上打3个小孔以便穿线,最后合盖充电,哦,顺便更换下电池,原来的是200mAh的电池,在这里更换为300mAh的电话手表的电池。能够装上。希望待机时间长点。
充电显示有电流了191mA 。
IMG_20230120_144624.jpg
IMG_20230120_161347.jpg
IMG_20230120_170453.jpg


7、最后附上装完图片,其实2款手表我都有。
IMG_20230120_170444.jpg


8、附件
原手表固件和APK,注意固件分2个压缩包001和002(文件上传限制8M),2个都需要下载才可以。
FitHelper_1.0.20.zip.001.zip (7.92 MB, 下载次数: 29)

FitHelper_1.0.20.zip.002.zip (7.46 MB, 下载次数: 28)

watch_BIN.zip (461.6 KB, 下载次数: 25)


吐槽,TB评论区什么人都有,有打广告的引诱装APP的,有说找到app又什么信息都没有提供的,问了也不搭理的。搞这个就是个兴趣,学习下,大家共享下信息没什么啊,能损失什么呢?
搞不懂,小小的评论区见证了人生百态。
评论区阅读量有几千了,看来买这个手表的人还挺多,希望我发帖可以抛砖引玉,多多交流学习,谢谢观赏!

祝大家新年快乐!


补充内容 (2023-1-24 20:25):
感谢各位的捧场,谢谢!上面附件的描述有误,FitHelper APK是分为2个压缩包,需要2个一起下载才可以。关于该手表OTA升级功能我在111楼有详细的说明。

打赏

参与人数 33家元 +670 收起 理由
x067 + 20
newnet1234 + 20 優秀文章
goodanytime + 20 謝謝分享
mdw2352811 + 50 原創內容
fanzhihao + 60 牛人
xiaoxuanfeng + 20 原創內容
ch104517745 + 20 兔年大吉恭喜发财
stdzlqz + 20
xushu + 20 看到这篇文章就知道这款手表淘宝卖完了。.
2n3055 + 20 謝謝分享

查看全部打赏

本帖被以下淘专辑推荐:

发表于 2023-1-20 22:33:48 | 显示全部楼层
这……请收下我的膝盖……
可以拿它看小片片了……
回复 支持 2 反对 0

使用道具 举报

发表于 2023-1-20 22:42:54 来自手机浏览器 | 显示全部楼层
恭喜楼主获得一宝贝
回复 支持 反对

使用道具 举报

发表于 2023-1-20 22:44:59 | 显示全部楼层
这飞线,真厉害
楼主属蜘蛛的,鉴定完毕
回复 支持 反对

使用道具 举报

发表于 2023-1-20 22:50:03 | 显示全部楼层
这玩法太高极了,没法喷...
回复 支持 1 反对 0

使用道具 举报

发表于 2023-1-20 22:58:52 | 显示全部楼层
楼主也是一大神级别的人物,鉴定完毕。逻辑分析仪都有,厉害厉害!
回复 支持 4 反对 0

使用道具 举报

发表于 2023-1-20 23:03:54 | 显示全部楼层
这智能手表破解不是一般人做得了的。
回复 支持 反对

使用道具 举报

发表于 2023-1-20 23:06:01 | 显示全部楼层
大神级的牛人
回复 支持 反对

使用道具 举报

发表于 2023-1-20 23:26:23 | 显示全部楼层
比较专业的方法,需要好好学习。
回复 支持 反对

使用道具 举报

发表于 2023-1-20 23:34:46 来自手机浏览器 | 显示全部楼层
楼主造福一方,摩拜
回复 支持 反对

使用道具 举报

发表于 2023-1-20 23:59:39 | 显示全部楼层
楼主相当厉害了,这个属于二次开发了,应该上精华~
回复 支持 1 反对 0

使用道具 举报

发表于 2023-1-21 01:18:33 来自手机浏览器 | 显示全部楼层
大佬流弊啊
回复 支持 反对

使用道具 举报

发表于 2023-1-21 01:28:12 | 显示全部楼层
自己玩起来了啊
回复 支持 反对

使用道具 举报

发表于 2023-1-21 05:34:03 来自手机浏览器 | 显示全部楼层
牛人一个!更可贵的是还无私的分享给大家!应该升精!
回复 支持 反对

使用道具 举报

发表于 2023-1-21 07:39:54 来自手机浏览器 | 显示全部楼层
楼主牛B,我还算是电子爱好者么,请收下我的膝盖
回复 支持 反对

使用道具 举报

发表于 2023-1-21 08:26:04 | 显示全部楼层
还好这表有这么详细的测试点可以捣鼓一下。
回复 支持 反对

使用道具 举报

发表于 2023-1-21 08:35:09 来自手机浏览器 | 显示全部楼层
楼主太牛了
回复 支持 反对

使用道具 举报

发表于 2023-1-21 08:45:17 | 显示全部楼层
膜拜大神,此等操作非我这小白能学会的。
回复 支持 反对

使用道具 举报

发表于 2023-1-21 08:50:38 | 显示全部楼层

谢谢分享 学习一下
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2023-2-8 05:16 , Processed in 0.171601 second(s), 15 queries , Redis On.

Powered by Discuz!

© 2006-2023, smzj.net

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