闲鱼上看到一个配置不错、带金属外壳和POE供电的Hi3516DV300摄像头,价格超级便宜,只要50块,于是买了回来打算破解掉自己用。
先上个整机和拆机图片。
先备份固件
hitool加tftp上传,备件整个镜像。
uboot分析:
查看emmc和内存大小,参考https://whycan.com/t_4145.html
破解linux登录密码:
参考https://blog.csdn.net/coderwuqiang/article/details/50354270
分析启动过程和固件内容:
B分区改成可读写的,A分区保留只读,随便作。
跑sample程序:
报错,更新内核,由于有双分区,这里先更新B分区,A分区作为保险措施,搞挂了从A分区恢复,自己编译个内核和拷贝对应的ko文件到板子上,用原来的加载脚本进行加载。640M,不合法。
重启问题
没跑应用时,总是会隔一段时间重启一次,然而lsmod查看,却没发现有加载看门狗,而且奇怪的时,在uboot命令上也会重启,说明可能用了外部硬件看门狗,或是外接了MCU进行保活复位之类的。
考虑到这个板子软硬件水平确实一般,还是先排除掉外部看门狗。
先统计重启间隔,发现很有规律,总是5分钟重启一次,不管是uboot下还是正常运行,reboot复位一次,重启时间不累加,会重新开始5分钟计时,从这里可以排除掉外部硬件看门狗。
于是猜测是祼写了看门狗寄存器,查看Hi3516DV300芯片手册,找到看门狗寄存器描述,用挂载的himd.l查看0x12050000和0x12051000这两段寄存器,发现寄存器果然是有值的,这就清楚了,是uboot的应用程序直接操作的看门狗寄存器。怪不得板子上有个himm应用程序,但是却没有himd,估计应用也是直接调的himm来操作寄存器吧。
几点感想:
- 整体软硬件定制水平一般,软硬件猜测是100%照搬官方DEMO来做的,海思SDK直接一行代码都不用改,甚至连默认sensor都是一样的,编译出来的sample都能运行,这点就很离谱。(IRCUT管脚不一样)这点也说明海思方案的牛逼之处,官方提供的东西太成熟了,支持的器件列表也多,客户选型的方案多,大多数都不用改,直接拿来就可以用,门槛实在是低,然而现在已经是后海思时代了,sign~,可恶的美帝,但是,就算现在美国停止制裁,或是海思攻克了芯片制造难关,海思的人员流失和这三年音视频监控领域被其他芯片侵吞的份额,海思应该也回不到从前了吧。
- BOM成本严重超出了设备性能需求,单个摄像头配了1G内存和8G emmc,但只出一路码流,帧率10fps,就算加上要运行的人脸检测算法,估计都可以降低配置。
- 摄像头用途存疑,看设备里的OEM是便利蜂,一家连锁便利店,带人脸检测,但市面有已经有很多便宜的支持人脸检测的摄像头,但却要用这个BOM严重溢价,外形隐蔽,没有红外灯,且不知道是哪家公司的产品来做人脸检测,严重怀疑和黑产有关。
- 设备加密水平一般,uboot未设置密码,启动全程带打印,文件系统虽然有双分区,但配置文件都是明文的,里面甚至还可以看到用户名和登录密码。
- 反破解只靠一招看门狗,有点太low了。
- 应用程序用了多进程,看名字有的是用来板级管理的,有的是负责IOT通信的,有的是免责码流的,有的人负责人脸检测的,猜测码流是通过管道的方式进行发送。
- 固件里还能找到产测包和PQTool,离谱。产测手段就是起一个脚本,里面先跑一个thttp服务器,然后每5秒跑一个sample_venc程序,这个samle_venc会抓一张jpg图像并放到http服务器的根目录下,用浏览器可以查看这张图片是否正常。
- 板子自带了简单异常恢复手段,基本就是跑后台脚本,定时用ps查看各个进程是否存在,不存在时再拉起对应的进程。
- IR-CUT只能固件,不能动态切,但考虑到没有红外灯,不切也正常。
记录:
bootargs=mem=640M mac=ee:bb:03:01:32:36 console=ttyAMA0,115200 clk_ignore_unused root=/dev/mmcblk0p3 rootfstype=ext4 ro init=/linuxrc rootw bootargsA=mem=640M mac=ee:bb:03:01:32:36 console=ttyAMA0,115200 clk_ignore_unused root=/dev/mmcblk0p3 rootfstype=ext4 ro init=/linuxrc rootwait blkdevparts=mmcblk0:1M(boot),12M(kernelA),32M(rootfsA),12M(kernelB),32M(rootfsB),-(user) bootargsB=mem=640M mac=ee:bb:03:01:32:36 console=ttyAMA0,115200 clk_ignore_unused root=/dev/mmcblk0p5 rootfstype=ext4 ro init=/linuxrc rootwait blkdevparts=mmcblk0:1M(boot),12M(kernelA),32M(rootfsA),12M(kernelB),32M(rootfsB),-(user) setenv bootargs 'mem=640M mac=ee:bb:03:01:32:36 console=ttyAMA0,115200 clk_ignore_unused root=/dev/mmcblk0p3 rootfstype=ext4 ro init=/bin/sh rootw' setenv bootargsA 'mem=640M mac=ee:bb:03:01:32:36 console=ttyAMA0,115200 clk_ignore_unused root=/dev/mmcblk0p3 rootfstype=ext4 ro init=/linuxrc rootwait blkdevparts=mmcblk0:1M(boot),12M(kernelA),32M(rootfsA),12M(kernelB),32M(rootfsB),-(user)' setenv bootargsA 'mem=640M mac=ee:bb:03:01:32:36 console=ttyAMA0,115200 clk_ignore_unused root=/dev/mmcblk0p3 rootfstype=ext4 ro init=/bin/sh rootwait blkdevparts=mmcblk0:1M(boot),12M(kernelA),32M(rootfsA),12M(kernelB),32M(rootfsB),-(user)' setenv bootargsB 'mem=640M mac=ee:bb:03:01:32:36 console=ttyAMA0,115200 clk_ignore_unused root=/dev/mmcblk0p5 rootfstype=ext4 rw init=/linuxrc rootwait blkdevparts=mmcblk0:1M(boot),12M(kernelA),32M(rootfsA),12M(kernelB),32M(rootfsB),-(user)' setenv bootargsB 'mem=640M mac=ee:bb:03:01:32:36 console=ttyAMA0,115200 clk_ignore_unused root=/dev/mmcblk0p5 rootfstype=ext4 rw init=/bin/sh rootwait blkdevparts=mmcblk0:1M(boot),12M(kernelA),32M(rootfsA),12M(kernelB),32M(rootfsB),-(user)' port=10008 [2023/4/29 22:49:53:588] default_username=admin [2023/4/29 22:49:53:588] default_password=bianlifeng666