某寶買了兩款熱銷網(wǎng)絡視頻監(jiān)視器,一款一百多元,一款上千塊
拆下來看了下主板,大體模塊是一樣的,有wifi模塊和一個SOC SD口。
查看絲柔并沒查到CPU信息, 猜測價格差距這么大 應該是Soc集成的cpu不同。
研究攝像頭板子主要目的是想研究sensor內核模塊的實現(xiàn),來修改原始位圖來達到某種效果,比如,加水印,替換原始圖片等等
下面來調試一下這款板子,調試口有4個(左側小孔),但只需要三個針腳就可以。
在串口中接入針腳,使用rs232線連接,連接前最好使用萬用表測量下電壓 防止接線錯誤
不同板子有可能也會使用rs485.(會影響putty輸出信息)
在Windows使用putty 設置:串口115200連接 再接通攝像頭電源
因為之前啟動到了命令行界面,但是因為封裝的命令行都是無效的
可能需要切換tty才可以正常使用bin中的命令,
或者需要/bin/ls /sbin/ls 類似完整路徑才可以使用命令行,具體沒實現(xiàn)過
因為只是為了研究內核模塊所以直接在啟動界面進入u-boot
一些啟動信息,內核是linux3.18.20
可以看到按crtl+u進入u-boot
help查看uboot支持命令行,
內核啟動地址為80008000
看過u-boot源代碼的同學都應該知道,u-boot使用了一個技巧,因為linux內核完整數(shù)據(jù)有一個 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 代碼如下
#!/usr/bin/env python3#注意python是格式敏感語言import binascii hex_file = open('putty.log','r')bin_file = open('hex2bin.bin','wb')index=0while 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
得到結果如下:
文件系統(tǒng)分別是squashfs和 jffs2
使用命令 binwalk -Me hex2bin.bin提取分析文件系統(tǒng)
找?guī)讉€關鍵文件信息如/etc/配置信息(root用戶密碼在此文件中)
啟動信息Src啟動腳本
其中我在squashfs-root中看到了如下腳本
/bin/tar xzf /dav/r2_modules.tgz -C /home/if [ -e /home/r2_modules ]thencd /home/r2_modules./load3516cv300 -a -sensor jxf22 -osmem 64 -total 128 -offlinecd /davfi#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來傳輸數(shù)據(jù)的
其中sensor_dev_init
sensor_hw_init 來初始化驅動設備
對我感興趣的應該屬于 sensor_i2c_read這個函數(shù)
其中sensor_i2c_read_0和sensor_i2c_read_1
分別會根據(jù)邏輯調用sensor_i2c_read
用IDA反編譯看了一下 sensor_i2c_read
sensor_i2c_read 函數(shù)在while(1)中循環(huán)獲取數(shù)據(jù)
使用i2c_transter來獲取傳感器信息。
后續(xù)就是編寫自己的ko,
使用squashfs和 jffs2來制作固件信息,燒寫到flash中
在看過Camera v4l2源碼架構時,上層是使用中斷來獲取數(shù)據(jù)
自己在這里編寫ko來 HOOK這個函數(shù),或者HOOK IRP也可以獲取傳感器信息,隨筆。