首页
社区
课程
招聘
[原创]浅谈网络摄像头分析
2021-2-8 16:30 14291

[原创]浅谈网络摄像头分析

2021-2-8 16:30
14291

ps:(2021/3/6 重新排版 因为之前写这篇文章用了十几分钟草草了事,排版稀烂,今天看到版主加优,所以从新排版,并且把内容精细化 也不能辜负版主一篇用心)

 

某宝买了两款热销网络视频监视器,一款一百多元,一款上千块
拆下来看了下主板,大体模块是一样的,有wifi模块和一个SOC SD口。
查看丝柔并没查到CPU信息, 猜测价格差距这么大 应该是Soc集成的cpu不同。
研究摄像头板子主要目的是想研究sensor内核模块的实现,来修改原始位图来达到某种效果,比如,加水印,替换原始图片等等

下面来调试一下这款板子,调试口有4个(左侧小孔),但只需要三个针脚就可以。

 

在串口中接入针脚,使用rs232线连接,连接前最好使用万用表测量下电压 防止接线错误
不同板子有可能也会使用rs485.(会影响putty输出信息)

 


在Windows使用putty 设置:串口115200连接 再接通摄像头电源
因为之前启动到了命令行界面,但是因为封装的命令行都是无效的
可能需要切换tty才可以正常使用bin中的命令,
或者需要/bin/ls /sbin/ls 类似完整路径才可以使用命令行,具体没实现过

 

因为只是为了研究内核模块所以直接在启动界面进入u-boot

一些启动信息,内核是linux3.18.20
可以看到按crtl+u进入u-boot
help查看uboot支持命令行,
内核启动地址为80008000
看过u-boot源代码的同学都应该知道,u-boot使用了一个技巧,因为linux内核完整数据有一个 linux header, 所以在加载时实际减去了header本身大小,实际内核加载地址为80007fc0

 

进入u-boot命令行 help查看一下支持的命令

使用sf 命令可以读取flash固件信息到内存
从启动信息来看有flash大小为16MB。
但是并没有给出固件存储格式
在用sf read之前得先使用sf probe 0命令才可以读取flash的信息

 

读取16mb 到0xa00000000
sf read 0xa00000000 0x0 0x1000000

 

在使用putty设置log日志
md 0xa00000000 0x1000000
打印内存信息,log会记录打印信息
得到文本日志,,在更改二进制文件时需要考虑大小端问题,
因为我这个arm是小端所以需要,python来更改一下

 

在linux中跑一下.py 代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/env python3
#注意python是格式敏感语言
import binascii
 
hex_file = open('putty.log','r')
bin_file = open('hex2bin.bin','wb')
index=0
while True:
    line = hex_file.readline().strip()      #delete head and tail spance
    if not line:
        break
 
    strs = line.split(' ')               #分割方法,以空格分割整个行
 
    index=1
    while index<5:
        string=strs[index]
        bin_file.write(binascii.a2b_hex(string[-2:]))
        bin_file.write(binascii.a2b_hex(string[-4:-2]))
        bin_file.write(binascii.a2b_hex(string[-6:-4]))
        bin_file.write(binascii.a2b_hex(string[:-6]))
        index+=1

得到的二进制文本使用binwalk分析一下,binwalk hex2bin.bin
得到结果如下:

文件系统分别是squashfs和 jffs2
使用命令 binwalk -Me hex2bin.bin提取分析文件系统

 

找几个关键文件信息如/etc/配置信息(root用户密码在此文件中)
启动信息Src启动脚本
其中我在squashfs-root中看到了如下脚本

1
2
3
4
5
6
7
8
9
10
#!/min/sh
 
/bin/tar xzf /dav/r2_modules.tgz -C /home/
if [ -e /home/r2_modules ]
then
cd /home/r2_modules
./load3516cv300 -a -sensor jxf22 -osmem 64 -total 128 -offline
cd /dav
fi
#rm -rf /home/r2_modules

其中释放了 r2_modules压缩包,并且使用load3516cv300加载模块
百度了一下3516cv300是海思的一款soc

 

并且使用readelf查看ko模块信息

cpu架构信息为v5TE

 

其中压缩包里有一个ko模是hi3516_sensor.ko
想搜索一下这个源代码但是在SDK和Google并没有找到。

 

把hi3516_sensor.ko托入IDA

这款sensor应该也是使用i2c来传输数据的
其中sensor_dev_init
sensor_hw_init 来初始化驱动设备

 

对我感兴趣的应该属于 sensor_i2c_read这个函数
其中sensor_i2c_read_0和sensor_i2c_read_1
分别会根据逻辑调用sensor_i2c_read

用IDA反编译看了一下 sensor_i2c_read

 

sensor_i2c_read 函数在while(1)中循环获取数据
使用i2c_transter来获取传感器信息。

 

后续就是编写自己的ko,
使用squashfs和 jffs2来制作固件信息,烧写到flash中
在看过Camera v4l2源码架构时,上层是使用中断来获取数据
自己在这里编写ko来 HOOK这个函数,或者HOOK IRP也可以获取传感器信息,随笔。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2022-3-6 17:39 被kanxue编辑 ,原因:
收藏
点赞3
打赏
分享
最新回复 (2)
雪    币: 595
活跃值: (4215)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
慢热型 2021-2-9 00:47
2
0
组装app遥控车带摄像头,玩起来挺爽的
雪    币: 36
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
挽住风 2021-2-13 16:07
3
0
 涉猎广泛
游客
登录 | 注册 方可回帖
返回