前言

寒假在家里闲着翻到了以前中国移动送的监控摄像头 和家亲HDC-55,里面安装的是中国移动自己定制的系统。
隐私安全是我们的头等大事,监控设备是涉及家庭隐私的设备,而且近期运营商监控被破解上传的视频又逐渐增多。就算没有人刻意破解你的监控,但你的数据还是可以被运营商很容易的调取出来!

所以,只有将所有服务掌握在在自己手里,使用可信的软件,才能更大化的保证安全。
我便萌生了为摄像头刷入自定义固件的想法。

起初我尝试使用OpenIPC,但在反复折腾编译后始终无法令摄像头工作,最后发现这貌似是OpenIPC在某次更新后出现的BUG(issue #1631),于是转战对君正SOC有更好适配的Thingino固件。

而且Thingino的社区人员也很热情积极,希望大家在使用开源代码后,也可以为社区贡献一份自己的力量,不论大小

本教程需要

  1. 一个中国移动HDC-55网络摄像头(请根据下文确认CPU型号、CMOS图像传感器型号、网卡型号、Nor大小)
    长这样
  2. 一个USB to TTL工具
  3. 一张空闲的SD卡(建议256M以上总空间)
  4. 一台电脑
  5. 有一定的动手能力与足够细心的你

注意事项

  1. Thingino基于MIT协议开源,确保你了解其内容
  2. 本程序/文章不做任何担保
  3. 创作不易,转载还请注明出处~~

探索过程

拆解,获得终端输出

破解这种嵌入式设备的第一步思路就是确定CPU型号和原始固件类型了,这些信息都可以在设备的tty日志中得到。
但难点之一出现了: 如何找到设备的UART引脚?

找到UART引脚并连接

大部分这种智能设备(包括电视盒子、网络监控等等)在设计时都会预留一个UART引脚用于调试,但隐藏的深度和引脚易用性就因设备而异了。
在拆解HDC-55监控设备后,我找到了这样一个可疑的引脚J5

位于下层电路板上的排针

那么如何确定这究竟是不是UART引脚,以及引脚定义呢?


我使用了一种暴力的手段:试 (当然,你也可以用万用表测量得到)
首先我可以确定,如果这些引脚确实是串口,那么它们必定分别是GND, RX, TX。而且我只需要插两根线GND, RX 就可以轻易判断了。
那么使用一点简单的排列知识,可以得出共有6种排列,所以纯纯的试工作量并不大,在试了4遍后我就得出了引脚定义,如下图,注意在TX引脚的右侧有一个三角形指示。

串口引脚定义

使用你的tty转USB工具,我的是CH340,接在摄像机的UART端口上:

1
2
3
4
5
CH340  |  监控
---------------
GND <--> GND
TXD <--> RX
RXD <--> TX

具体接线方式不限,只要你能把线接通就好,我是这么接的:

接线

打开串口:

Windows建议使用Putty,将COM5换成你在设备管理器里看到的COM

Putty

Linux可以使用sudo minicom -D /dev/ttyUSB0打开串口

获得终端输出并分析芯片型号与储存大小

终端部分输出信息如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
U-Boot SPL 2013.07 (Mar 29 2019 - 09:52:27)
pll_init:365
l2cache_clk = 450000000
pll_cfg.pdiv = 8, pll_cfg.h2div = 4, pll_cfg.h0div = 4, pll_cfg.cdiv = 1, pll_cfg.l2div = 2
nf=36 nr = 1 od0 = 1 od1 = 1
cppcr is 02404900
CPM_CPAPCR 0470890d
nf=50 nr = 1 od0 = 1 od1 = 1
cppcr is 03204900
CPM_CPMPCR 0320490d
nf=50 nr = 1 od0 = 1 od1 = 1
cppcr is 03204900
CPM_CPVPCR 0320490d
cppcr 0x9a7b5510
apll_freq 860160000
mpll_freq 1200000000
vpll_freq = 1200000000
ddr sel mpll, cpu sel apll
ddrfreq 400000000
cclk 860160000
l2clk 430080000
h0clk 300000000
h2clk 300000000
pclk 150000000
DDRC_DLP:0000f003


U-Boot 2013.07 (Mar 29 2019 - 09:52:27)

Board: ISVP (Ingenic XBurst T20 SoC)
DRAM: 128 MiB
Top of RAM usable for U-Boot at: 84000000
Reserving 435k for U-Boot at: 83f90000
Reserving 32784k for malloc() at: 81f8c000
Reserving 32 Bytes for Board Info at: 81f8bfe0
Reserving 124 Bytes for Global Data at: 81f8bf64
Reserving 128k for boot params() at: 81f6bf64
Stack Pointer at: 81f6bf48
Now running in RAM - U-Boot at: 83f90000
MMC: msc: 0
the manufacturer ef
SF: Detected W25Q128

In: serial
Out: serial
Err: serial
Net: Jz4775-9161
Hit any key to stop autoboot: 0
the manufacturer ef
SF: Detected W25Q128

--->probe spend 3 ms
SF: 2621440 bytes @ 0x40000 Read: OK
--->read spend 318 ms
## Booting kernel from Legacy Image at 80600000 ...
Image Name: Linux-3.10.14__isvp_bull_1.0__
Image Type: MIPS Linux Kernel Image (lzma compressed)
Data Size: 1777359 Bytes = 1.7 MiB
Load Address: 80010000
Entry Point: 803d8810
Verifying Checksum ... OK
Uncompressing Kernel Image ... OK

Starting kernel ...

......省略一部分输出

[ 5.777797] RTL871X: module init start
[ 5.781696] RTL871X: rtl8189fs v4.3.24.11_26052.20180108
[ 5.789361] RTL871X: build time: Mar 26 2019 10:49:25
[ 5.794610] wlan power on

......省略

[Main.cpp][270]Total Memory:2048 kb
[BSP][Capture.c][CaptureGetChannels:195]Test
00[ 11.973465] sc2235 0-0030: sc2235 chip found @ 0x30 (i2c0)
:00:11|info digital chn num:0
00:00:11|trace CConf[ 11.982106] tx_isp: Registered sensor subdevice sc2235 0-0030
igLocation::getLatest().iLanguage = 0.
[BSP][Video.c][SystemGetVideoMode:186]get video mode = 0
[ 12.587442] sc2235h high-temperature-logic.
[ 12.670478] ###### image_tuning_v4l2_open 4329 #######
[ 12.681726] sc2235_set_analog_gain() high temperature, BLC_reg: 0x0ffe.
[ 12.688657] sc2235_set_analog_gain() high temperature, lvl 0, blc_target: 0x11.
[BSP][initial.c][jz_stream_start:2299]===>>>width=1920 height=1080
[BSP][initial.c][jz_stream_start:2361]IMP_FrameSource_GetChnAttr chn=0
w=1920, h=1080

Board: ISVP (Ingenic XBurst T20 SoC)得到CPU型号为君正T20芯片
DRAM: 128 MiB得到NOR储存大小为16MBDRAM: 64MiB等同于8MB NOR,以此类推。
00:00:11|trace CConf[ 11.982106] tx_isp: Registered sensor subdevice sc2235 0-0030得到CMOS图像传感器型号为sc2235
[ 5.781696] RTL871X: rtl8189fs v4.3.24.11_26052.20180108得到wifi模块为RTL8189F系列的,拆机后发现是RTL8189FTV

定制专属于HDC-55监控的Thingino

在Thingino官网查找后,发现虽然有一个HDC-55型号,但是芯片、图像传感器的型号都对不上。
于是我决定自己从源码构建设备固件

注意事项

请确保你的监控参数与下面所述一致,否则你可能需要做一些自己的修改

  • CPU:君正T20 (Ingenic XBurst T20 SoC)
  • 储存大小和类型:16MB NOR
  • CMOS图像传感器型号:SC2235
  • 无线网卡型号:RTL8189FTV (rtl8189fs)

如果完全一致,那么你可以直接照抄目光呆滞下面的教程

环境搭建

Windows

Windows用户建议使用Windows Subsystem for Linux(WSL)。

  1. 安装方式见官方文档

  2. 安装后请使用最新的Ubuntu 24.04.1 LTS发行版,低版本Ubuntu发行版的dd命令版本较低,编译到最后会出现错误。

    • 输入dd --version确保你的dd命令版本在9.0以上
  3. 配置你的PATH变量,确保没有空格出现

    1
    export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/wsl/lib:/snap/bin
  4. 安装必要的工具

    1
    2
    sudo apt-get update
    sudo apt install git dialog u-boot-tools unzip make libncurses-dev flex cmake cpio bison build-essential whiptail wget rsync gawk file curl bc
  5. 配置代理

    建议配置代理编译,否则会非常慢,而且有文件下载失败风险

    • 在开始菜单中打开WSL Settings,调整”网络”选项如下图

    WSL Settings

Linux

Linux用户请自行确保dd工具版本在9.0以上,之后根据自己的发行版安装依赖

以Ubuntu为演示:

1
2
sudo apt-get update
sudo apt install git dialog u-boot-tools unzip make libncurses-dev flex cmake cpio bison build-essential whiptail wget rsync gawk file curl bc

克隆代码

将Thingino源码克隆至本地

1
2
git clone --depth=1 --recurse-submodules \
--shallow-submodules https://github.com/themactep/thingino-firmware

进入目录并标记依赖安装完成

1
2
cd thingino-firmware
touch .prereqs.done

自定义监控配置文件

经过我的研究,最终编写出了适配文件

监控配置 wanjiaan_hdc55_t20_sc2235

1
nano configs/cameras/wanjiaan_hdc55_t20_sc2235

写入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
# NAME: Wanjiaan HDC55 (T20, SC2235, RTL8189FTV)
# MODULE: t20x_sc2235_rtl8189ftv
BR2_PACKAGE_THINGINO_KOPT_MMC0=y
BR2_PACKAGE_THINGINO_KOPT_MMC0_PB_4BIT=y
BR2_PACKAGE_THINGINO_KOPT_MMC1=y
BR2_PACKAGE_THINGINO_KOPT_MMC1_PC_4BIT=y
BR2_THINGINO_AUDIO=y
BR2_THINGINO_BUTTON=y
BR2_THINGINO_MOTORS=y
BR2_THINGINO_SDCARD=y
FLASH_SIZE_16=y
U_BOOT_ENV_TXT="$(BR2_EXTERNAL)/environment/wanjiaan-hdc55-t20-sc2235.uenv.txt"

Ctrl + S保存,Ctrl + X退出

模板文件 t20x_sc2235_rtl8189ftv

1
nano configs/modules/t20x_sc2235_rtl8189ftv

写入以下内容:

1
2
3
4
5
6
# NAME: T20X, SC2235, RTL8189FTV
# FRAG: soc toolchain ccache brand rootfs kernel system target uboot
BR2_PACKAGE_WIFI=y
BR2_PACKAGE_WIFI_RTL8189FS=y
BR2_SENSOR_SC2235=y
BR2_SOC_INGENIC_T20X=y

环境变量 wanjiaan-hdc55-t20-sc2235.uenv.txt

这个文件内的几个GPIO引脚定义我最后都是一个一个试出来的
真是太难了>﹏<

1
nano environment/wanjiaan-hdc55-t20-sc2235.uenv.txt

写入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
day_night_color=true
day_night_ir850=true
day_night_ir940=false
day_night_ircut=true
day_night_max=15000
day_night_min=500
day_night_white=false
disable_eth=true
enable_updates=true
gpio_default=61O
gpio_button=81i
gpio_ircds=7
gpio_ircut=82
gpio_led_b=72O
gpio_led_r=61O
gpio_mmc_cd=59
gpio_speaker=63O
gpio_motor_h=78 77 76 75
gpio_motor_v=51 52 53 54
motor_maxstep_h=3920
motor_maxstep_v=400
motor_speed_h=1100
motor_speed_v=700
gpio_wlan=62O
wlandev=8189fs
timezone=Asia/Shanghai

编译固件

下面就是根据写好的配置文件来编译固件了,Thingino提供了一个TUI界面来方便的编译。

  1. 启动引导式安装

    1
    ./user-menu.sh
  2. 打开 ”2 Guided Compilation

  3. 选择监控设备配置文件

    • 打开“Step 2: Select Device”,选择刚才编写的wanjiaan_hdc55_t20_sc2235配置文件,按Enter确认

    选择设备配置

  4. 选择 “Step 3: Make Firmware”开始编译固件,之后便是漫长的等待了
    开始编译

  5. 编译完成后,固件被输出到了上级目录中,即为../output/wanjiaan_hdc55_t20_sc2235/images/目录

刷写固件与设置环境

文件准备

  1. 准备一张SD卡,格式化为FAT32文件系统。
  2. 将输出固件目录中的thingino-wanjiaan_hdc55_t20_sc2235.bin复制到SD卡根目录
  3. 在SD卡根目录下创建uenv.txt根据自己的情况写入下面内容(保证文件最后空着一行):
    1
    2
    3
    4
    wlanssid=WIFI名称
    wlanpass=WIFI密码
    hostname=喜欢的名字(可选)

  4. 将SD卡插入监控设备

正式刷写

确保你的监控处于断电状态,UART接线正常,SD卡正常

  1. 在给监控通电的同时,在终端按Ctrl + C中断引导

  2. 确保SD卡正常,输入mmc rescan; mmcinfo来检查SD卡

    如果你的卡被成功识别,则输出应类似于这样:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    isvp_t20# mmc rescan; mmcinfo
    Device: msc
    Manufacturer ID: 1b
    OEM: 534d
    Name: 00000
    Tran Speed: 50000000
    Rd Block Len: 512
    SD version 3.0
    High Capacity: Yes
    Capacity: 59.6 GiB
    Bus Width: 4-bit
    isvp_t20#
  3. 运行fatls mmc 0来查看SD卡内文件,并确认你的固件文件名,我此处是thingino-wanjiaan_hdc55_t20_sc2235.bin

    1
    2
    3
    4
    5
    6
    7
    8
    isvp_t20# fatls mmc 0
    system volume information/
    16777216 thingino-wanjiaan_hdc55_t20_sc2235.bin
    69 uenv.txt

    2 file(s), 1 dir(s)

    isvp_t20#
  4. 对于16MB NOR设备,运行setenv flashsize 0x1000000; ; 对于8MB NOR设备,运行setenv flashsize 0x800000;

  5. 逐行运行下面刷写命令,注意第三条命令要替换为你的实际文件名

    1
    2
    3
    4
    5
    setenv baseaddr 0x82000000;
    mw.b ${baseaddr} 0xff ${flashsize};
    fatload mmc 0:1 ${baseaddr} thingino-wanjiaan_hdc55_t20_sc2235.bin;
    sf probe 0; sf erase 0x0 ${flashsize};
    sf write ${baseaddr} 0x0 ${filesize};

    如果运行正常,输出应该类似于下图

    正常输出

  6. 使用reset重启设备

启动设备

最激动人心的时候到了

装回去之前…

还是接好UART串口,观察串口输出。

如果一切正常,你可以使用root用户root密码登录shell

登陆后会要求修改root密码,正常修改即可,进入后你可以找到监控的IP地址(或者你可以按一下监控后面的按键聆听IP地址)

安装回去

如果你认为一切正常,就可以把监控装回去了,之后可以通过ssh访问设备

然后你可以在浏览器上通过IP访问监控页面,用户名密码即为root和刚才修改的密码

记得在 Settings -> RTSP/ONVIF Access 页面修改设备的ONVIF/RTSP密码

远程访问

IPv6

如果你的监控有IPv6,那么意味着你可以直接使用RTSP协议获取监控的视频画面,只需在光猫中关闭防火墙或者放行相应端口即可。

但是中国大部分家庭宽带都会封80端口,这意味着无法使用onvif协议来进一步控制监控,也无法访问监控网页。

我尝试了修改onvif.conf,但似乎onvif端口仍然是80,这可能是Thingino的一个BUG。

如果仍然要使用,可能需要端口转发或者反向代理等手段,我没有尝试

IPv6手段的缺点是目前的普及率仍不理想,可能在其他没有IPv6的Wifi环境下无法使用,需要开启流量

内网穿透

我们可以使用内网穿透来将监控设备暴露到公网,这样做的好处是IPv4/v6支持取决于服务器,而且80端口通常是开放的

下载frpc

https://github.com/fatedier/frp/releases/latest下载最新版的frp, 选择mipsle架构,解压后将frpc复制到SD卡中,并根据你的情况创建配置文件frpc.toml

持久化运行

之后创建系统服务,实现持久化运行

/etc/init.d中创建S97frpc文件

1
vi /etc/init.d/S97frpc

写入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/bin/sh

. /etc/init.d/rc.common

FRPC_DIR="/mnt/mmcblk0p1"
FRPC_BIN="$FRPC_DIR/frpc"
FRPC_CONF="$FRPC_DIR/frpc.toml"

start() {
starting
if [ ! -f "$FRPC_BIN" ]; then
echo "Error: frpc binary not found at $FRPC_BIN"
exit 1
fi
if [ ! -f "$FRPC_CONF" ]; then
echo "Error: frpc config not found at $FRPC_CONF"
exit 1
fi # 这里是修正的地方,将 } 改为 fi
start-stop-daemon -S -x "$FRPC_BIN" -b -m -p /var/run/frpc.pid -- -c "$FRPC_CONF"
[ $? -eq 0 ] && echo "frpc started successfully" || echo "Failed to start frpc"
}

stop() {
stopping
start-stop-daemon -K -x "$FRPC_BIN" -p /var/run/frpc.pid
[ $? -eq 0 ] && echo "frpc stopped successfully" || echo "Failed to stop frpc"
}

case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
stop
sleep 1
start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac

exit 0

设置为可执行:

1
chmod +x /etc/init.d/S97frpc

之后可以使用service frpc start|stop|restart控制

手机应用

Thingino是支持onvif协议的,手机应用推荐使用tinyCam(谷歌商店中可以搜到)

或者onvier也可以正常连接

最后……

都看到这里了,也希望你可以支持一下作者。

可以发条评论什么的(

ee