بررسی دستگاه NVR 10 کانال 4K مدل (NBD8010S-KL)

 بررسی دستگاه NVR 10 کانال 4K مدل (NBD8010S-KL)

چندین سال پیش یه دستگاه NVR 10 کانال 4K مدل (NBD8010S-KL) خریدم که عکسش رو پایین می بینید. مدل دقیقش NBD8010S-KL-V2 یا نسخه 2 هست.

مشکل اینجاست که این دستگاه با نرم افزار XMeye کار میکنه و چندوقتی بود که تصاویر رو توی گوشی نشون نمیداد. توی تنظیمات دستگاه یه قسمتی داره که مینویسه به سرور XMEye توی چین وصل شده یا نه. که وقتی وصل نمیشه مینویسه probing DNS. مشکل اینترنتم نبود چون با شرکت های مختلف تست کردم و مشکل Firewall و اینا هم نبود و طبق صحبتم با چند نفر گفتن از چین قطع شده و عموما از اواخر تابستون تا اوایل اسفند قطع میشه! حتی یه DVR هشت کانال جای دیگه دیدم که همین مشکل رو داشت. من شک کردم که شاید مشکلی نداشته باشه چون توی جستجوهام توی اینترنت و بقیه کشورها چیزی ندیدم.(البته چندجا دیدم که روی Probing DNS) مونده بود ولی راه حلی ندیدم. تصویر زیر مشخصات داخل دستگاه هست:

فکر کردم که شاید بخاطر فیلت.رینگ و اینا باشه که اگه یه مودم OpenWRT داشتم حتما از فیلت.رشکن ردش میکردم ببینم کار میکنه یا نه. ولی چنین چیزی نداشتم و مجبور شدم یه دستگاه دیگه بخرم. متاسفانه یا خوشبختانه دستگاه جدید همین مدل ولی بروزترش بود و XMeye اش هم کار میکرد. اینم مشخصاتش:

مدل دقیقش NBD8010S-KL-V3 یا نسخه 3 هست. برخلاف قبلی که نسخه 2 بود. اینم مشخصات داخل دستگاه:

همونطور که مشخصه Cloud XMEye connected هست و همه چی کار میکنه. در این بین من رفتم و دستگاه قبلی V2 رو به تنظیمات کارخونه بردم و اونم درست شد.

اما چون فعلا دستم بود و خواستم ببینم چطور کار میکنه باعث شد که ماجرای جالبی رو شروع کنم. میخواستم موقتا واردش بشم و کاری کنم تا با وایر.گارد به اینترنت وصل بشه. از طریق NMAP و شبکه تست کردم ببیینم SSH یا Telnet بازه یا نه، که نبود. رابط کاربری ای که خود NVR اجرا میکنه اسمش Sofia هست. مثل شکل زیر:

برنامه ای نوشته شده به اسم sofiactl که از طریق شبکه به دستگاه وصل میشه و یکسری اطلاعات رو میشه از دستگاه گرفت. با دردسر زیادی نصبش کردم و فکر میکردم شاید بشه باهاش دسترسی کامل گرفت ولی اینجوری نبود. مثلا با دستور زیر تونستم این خروجی رو بگیرم:

./sofiactl.pl --host 192.168.2.40 --port 34567 --user admin  --command SystemInfo
System running:1146 day(s): 3 year(s), 1 month(s), 21 day(s), 19 hour(s), 48 minute(s)

DeviceRunTime = 0x001932E4
HardWareVersion = Unknown
VideoOutChannel = 1
VideoInChannel = 0
DigChannel = 4
SerialNo = **********
SoftWareVersion = V4.03.R11.C6380202.12201.140000.0000000
HardWare = NBD8008R-PL
ExtraChannel = 0
AudioInChannel = 0
BuildTime = 2021-07-0216:25:44
AlarmInChannel = 0
AlarmOutChannel = 0
UpdataTime =
TalkOutChannel = 1
CombineSwitch = 0
TalkInChannel = 1
EncryptVersion = Unknown
UpdataType = 0x00000000
Build info:

basic_video_analytics =
oem_manufacturer_id =
major =
oeminfo =
cloud_service =
release =
minor = 0
build_options =
advanced_video_analytics =
platform = TI
onvif_client_nvr =
onvif_server_ipc =
build_number = 0
platform_id = 0
OK

جالبه که روزهایی که دستگاه روشن بوده رو نوشته و بنظرم عدد درستی هم هست. برای این میگم جالب که توی رابط گرافیکی دستگاه چنین چیزی رو ندیدم جایی بنویسه. البته با فکتوری ریست هم پاک نمیشه. نکته بعدی مدل دستگاه بود که NBD8008R-PL نوشته بود. به غیر از اون چیز خاصی نداشت و کار خاصی نمیشه کرد. پس راه های دیگه رو امتحان کردم.

آپدیت نرم افزار (فریمور)

توی اینترنت با کلی دردسر فهمیدم این مدل با چه فریموری سازگاره. اگه عکس بالا رو نگاه کنید نسخه نرم افزار مال 2 جولای 2021 هست. برای پیدا کردن مدل دقیقش تا بتونم فریمور جدید رو دانلود کنم این وبسایت رو دیدم و آموزش داد که توی بخش V4.03.R11.C6380202.12201.140000.0000000 (نسخه نرم افزار) قسمت مهم اون C6380202 هست. (توجه کنید که دستگاه V3 که جدید خریدم C6380251 هست و نمیشه فریمور جدیده رو روی قدیمی نصب کرد و بالعکس). اون پارت نامبر رو جستجو کردم و منو به این صفحه برد. همونطور که از عکس پایین مشخصه آخرین آپدیت همونیه که نصب شده و بعد از اون آپدیت جدید نیومده. اینجا آپلودش کردم اگه بدرد کسی میخوره.

راه دیگه اینه که مستقیم به دستگاه وصل بشم و ببینم توش چه خبره…

استفاده از درگاه UART

برای این کار باید از طریق UART به دستگاه وصل بشم. توی دستگاه های Embedded در 99 درصد مواقع یک سیستم لینوکسی اجرا میشه. چه دوربین چه DVR و چه NVR یا حتی دستگاه ضبط و پخش ماشین و… این دستگاه ها یک رابطی برای اتصال به بیرون طراحی میکنن که مثلا توی کارخونه بتونن دستگاه رو برنامه ریزی کنن یا تست کنن یا اگه خراب شد بتونن عیب یابی کنن. این درگاه عموما مخفیه و از طریق سه تا پین یا پایه با بیرون در ارتباطه. GND یا زمین مشترک، TX یا پین ارسال اطلاعات از دستگاه به بیرون و RX یا پین ارتباط بیرون با دستگاه. اینکه این پین برای هر دستگاه کجاست و چجوری پیداش کنیم و… واسه خودش پست مجزا میخواد ولی اینجا1 یا اینجا2 یا اینجا3 یا اینجا4 توی یوتیوب میتونید آموزشش رو ببینید.

توی عکس بالا من این سه تا رو پیدا کردم و این سه تا سیم باید با یک مبدلی مثل ماژول FTD232 به کامپیوتر وصل بشه. وقتی به سیستم وصل کنید و دستگاه رو روشن کنید خروجی زیر میاد:

System startup

U-Boot 2010.06-svn1560 (May 06 2021 - 19:15:51)

Check Flash Memory Controller v100 ... Found
@hifmc_spi_nor_probe(), SPI Nor(cs 0) ID: 0x20 0x70 0x18 <Read>
@hifmc_spi_nor_probe(), SPI Nor(cs 0) ID: 0x20 0x70 0x18 <Found>
eFlashType: 20.
Flash Name: XM_XM25QH128A{0x207018), 0x1000000.
@hifmc_spi_nor_probe(), XmSpiNor_ProtMgr_probe(): OK.
@XmSpiNor_enable4ByteAddrMode(), isn't support 4-byte mode.
Block:64KB Chip:16MB Name:"XM_XM25QH128A"
CONFIG_CLOSE_SPI_8PIN_4IO = y.
read->iftype[0: STD, 1: DUAL, 2: DIO, 3: QUAD, 4: QIO]: 1.
Current level[6], lock_level_max:7.
at xm_get_locked_range() sr:0x18, level:6.
lk[6 => 0x800000]
SRx val: {[1, 0x38], [0, 0x0], [0, 0x0], [0, 0x0]}.
SPI Nor total size: 16MB
In:    serial
Out:   serial
Err:   serial
USB0:
Starting the EHCI controller
scanning bus 0 for devices... 1 USB Device(s) found

NOTE: No storage devices were found on any of the ports!

device name usb!
Unknow device type, name:usb!
@XmBoard_resetSwitch(), boardType: 0x1C.
@HiWdt_start(), nSecs: 900.
Press CTRL-C to abort autoboot in 0 seconds16384 KiB hi_fmc at 0:0 is now current device
at do_logoload pType: cramfs.
### h264dvr.jpg UbootLogoload complete: 59577 bytes loaded to 0x82000000
@do_jpgd(),Cmd: decjpg <Jpeg Addr> <Vo Buf Addr>
@load_jpeg(), jpeg loading ...
@load_jpeg(), <<addr=0x82000000, size=0x20000, vobuf=0x8dd00000>>
@do_jpgd(), decode jpeg...
PicType: 6 ,Output Addr, Y: 8dd00000,UV: 8dd7b800
<<imgwidth=800, imgheight=600, linebytes=832>>
decode success!!!!
@do_jpgd(), decode jpeg success.
@do_jpgd(), display jpeg...
stMaxRect.u32Width:800, stMaxRect.u32Height:600.
DRV_HDMI_ProdCrgAllResetSet udelay(20000).
HDMI_INFO:DispFmt2HdmiTiming[419] ,Non CEA video timing:16
HDMI_INFO:Hdmi_PixelFreqSearch[163] ,u32Fmt16.
srcAddr: 0x82000000, dstAddr: 0x81000000, filename: boot/zImage.img.
find_squashfs_file: name bin, start_block 0, offset 2653, type 1
find_squashfs_file: name boot, start_block 0, offset 2757, type 1
read inode: name boot, sb 0, of 2757, type 1
find_squashfs_file: name zImage.img, start_block 0, offset 2685, type 2
read inode: name zImage.img, sb 0, of 2685, type 2
### get_squashfs_file OK: loade 2467058 bytes to 0x81000000
## Booting kernel from Legacy Image at 81000000 ...
   Image Name:   Linux-4.9.37
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    2466994 Bytes = 2.4 MiB
   Load Address: 80008000
   Entry Point:  80008000
   Loading Kernel Image ... OK
OK

Starting kernel ...

توضیح زیادی نداره، بعد از اینکه اجرا میشه میره میبینه آی سی فلش XM25QH128A هست، (16 مگابایت) چندتا پارتیشن داره اونا رو میخونه و میریزه توی رم و هسته لینوکس رو اجرا میکنه و تمام. اگر دقت کنید میبینید که وسط کار گفته Ctrl+C رو بزن تا بریم توی Uboot. اگه اونو بزنید وارد محیط u-boot میشید.

توی این محیط، قبل ازینکه سیستم اصلی اجرا بشه یکسری پارامترها برای اجرا تعیین میشن. عموما میشه از طریق این محیط دسترسی Root گرفت. (اگر متوجه نمیشید قضیه چیه، ارجاعتون میدم به اون چهارتا لینک بالا در یوتیوب) من وارد محیط شدم و این خروجیش بود:

Press CTRL-C to abort autoboot in 0 secondshisilicon # <INTERRUPT>
hisilicon # <INTERRUPT>
hisilicon # <INTERRUPT>
hisilicon # <INTERRUPT>
hisilicon # <INTERRUPT>
hisilicon # <INTERRUPT>
hisilicon # <INTERRUPT>
hisilicon # printenv
bootcmd=sf probe 0;sf read 0x84000000 0xf60000 0x20000;logoload 0x84000000;decjpg;sf read 0x82000000 0x50000 0x500000;squashfsload 82000000;bootm 0x81000000
bootdelay=0
baudrate=115200
ethaddr=00:0b:3f:00:00:01
ipaddr=192.168.1.10
serverip=192.168.1.1
netmask=255.255.0.0
bootfile="uImage"
da=mw.b 0x82000000 ff 1000000;tftp 0x82000000 u-boot.bin.img;sf probe 0;flwrite
du=mw.b 0x82000000 ff 1000000;tftp 0x82000000 user-x.cramfs.img;sf probe 0;flwrite
dr=mw.b 0x82000000 ff 1000000;tftp 0x82000000 romfs-x.cramfs.img;sf probe 0;flwrite
dw=mw.b 0x82000000 ff 1000000;tftp 0x82000000 web-x.cramfs.img;sf probe 0;flwrite
dl=mw.b 0x82000000 ff 1000000;tftp 0x82000000 logo-x.cramfs.img;sf probe 0;flwrite
dc=mw.b 0x82000000 ff 1000000;tftp 0x82000000 custom-x.cramfs.img;sf probe 0;flwrite
up=mw.b 0x82000000 ff 1000000;tftp 0x82000000 update.img;sf probe 0;flwrite
tk=mw.b 0x82000000 ff 1000000;tftp 0x82000000 zImage.img; bootm 0x82000000
dd=mw.b 0x82000000 ff 1000000;tftp 0x82000000 mtd-x.jffs2.img;sf probe 0;flwrite
de=mw.b 0x82000000 ff 1000000;tftp 0x82000000 u-boot.env.bin.img;sf probe 0;flwrite
jpeg_addr=0x8dc00000
jpeg_size=0xb85f9
vobuf=0x8dd00000
appVideoStandard=PAL
appSystemLanguage=English
appCloudExAbility=XXXXXXX=
bootargs=mem=120M console=ttyAMA0,115200 root=/dev/mtdblock1 rootfstype=squashfs mtdparts=hi_sfc:320K(boot),3968K(romfs),7040K(usr),1600K(web),2816K(custom),128K(logo),512K(mtd) coherent_pool=2M
appRunningOut3Days=XXXXX
loadlogo=sf probe 0;sf read 0x84000000 0xF60000 0x20000;logoload 0x84000000;decjpg
stdin=serial
stdout=serial
stderr=serial
verify=n
ver=U-Boot 2010.06-svn1560 (May 06 2021 - 19:15:51)

Environment size: 1645/65532 bytes
hisilicon #

در ادامه روش های مختلفی هست که روت بشیم. اول از همه bootargs رو اینجوری تغییرش دادم از:

bootargs=mem=120M console=ttyAMA0,115200 root=/dev/mtdblock1 rootfstype=squashfs mtdparts=hi_sfc:320K(boot),3968K(romfs),7040K(usr),1600K(web),2816K(custom),128K(logo),512K(mtd) coherent_pool=2M

به این:

bootargs=mem=120M console=ttyAMA0,115200 root=/dev/mtdblock1 rootfstype=squashfs mtdparts=hi_sfc:320K(boot),3968K(romfs),7040K(usr),1600K(web),2816K(custom),128K(logo),512K(mtd) coherent_pool=2M init=/bin/sh

یعنی آخرش یه init=/bin/sh اضافه کردم. بعدش باید دستورات bootcmd رو به صورت دستی و به ترتیب خودمون اجراش کنیم:

bootcmd=sf probe 0;sf read 0x84000000 0xf60000 0x20000;logoload 0x84000000;decjpg;sf read 0x82000000 0x50000 0x500000;squashfsload 82000000;bootm 0x81000000

یعنی خط به خط اینجوری:

sf probe 0
sf read 0x84000000 0xf60000 0x20000
logoload 0x84000000
decjpg
sf read 0x82000000 0x50000 0x500000
squashfsload 82000000
bootm 0x81000000

وقتی دستور آخر رو بزنیم میره و اون Bootargs رو اجرا میکنه و باید به ما دسترسی روت بده. متاسفانه این روش برای من کار نکرد. قبل از اینکه ادامه بدیم توجهتون رو جلب کنم به یه بخشی که لوگوی بوت رو از توی پارتیشن میخونه. الان برای من لوگوی X265 میاد. ولی انگار میشه از طریق فریمور و اون پارتیشن تغییرش داد. اگر میبینید اینهمه برند مختلف همشون رابط گرافیکیشون یکیه، دلیلش همینه. فقط لوگوی بوت رو عوض میکنن.

در ادامه علاوه برا init=/bin/sh بقیه دستورات مشابه رو هم اجرا کردم ولی جواب نداد:

init=/bin/bash
init=/bin/sh
init=/bin/ash
single
init=/bin/busybox sh

در حالت عادی وقتی بوت میشه و مینویسه Starting kernel … دیگه بعدش چیزی بهم نشون نمیده. بنظرم مشکل همینجاست. چون انگار یا کنسول رو قطع میکنه یا میبره به یه مسیر دیگه. به همین دلیل در کنار دستور console=ttyAMA0,115200 این دستور هم کنارش نوشتم console=ttyS0,115200 و console=ttyS1,115200ولی بازم بهم کنسول رو نشون نداد. حتی این console=ttyS0,115200 و console=ttyS0,115200 رو با دستورات init=/bin/bash و بالایی ها ترکیب کردم و جواب نداد مثلا:

mem=120M console=ttyAMA0,115200 console=ttyS0,115200 root=/dev/mtdblock1 rootfstype=squashfs mtdparts=hi_sfc:320K(boot),3968K(romfs),7040K(usr),1600K(web),2816K(custom),128K(logo),512K(mtd) coherent_pool=2M single

انگار این دستگاه خیلی مقاومه!

استفاده از فریمور اصلی دانلود شده

بهتون گفتم که آخرین فریموری که منتشر شده رو اینجا پیدا کردم. خب وقتی فریمور خام رو داریم چه نیازی به اینکارا بود. با استفاده از برنامه Dumpbuilder در ویندوز یا استفاده از دستور binwalk -eM firmware.bin در لینوکس میتونیم پارتیشن های فریمور رو جدا کنیم. دستور Binwalk با آرگومان e یعنی استخراج (Extract) کن و آرگومان M در زبان روسی به معنای Recursive هست. یعنی تکرار شونده یعنی فایل ها رو تا جای ممکن استخراج کن. مثلا داخل همین فایل bin خودش 6 تا پارتیشن زیر بود:

custom-x.cramfs.img
logo-x.cramfs.img
romfs-x.cramfs.img
u-boot.bin.img
user-x.cramfs.img
web-x.cramfs.img

با اون دستور، این 6 تا پارتیشن هم تا جای ممکن باز یا استخراج میشن. چیزای زیادی داخل این پارتیشن ها بود ولی چیزی که علاقمند بودم رسیدن به /etc/passwd در فایل romfs بود. کسایی که به لینوکس آشنایی دارن میدونن که توی این فایل نام کاربری و رمز اکانت های سیستم ذخیره میشه. مهمترینش root.

توجه کنید که توی این فایل، رمز رابط کاربری گرافیکی NVR که همون Sofia هست وجود نداره. اون توی فایلی دیگه به اسم Account1 هست. در هر حال این خروجی passwd بود:

root:absxcfbgXtb3o:0:0:root:/:/bin/sh

رمز ما اینه: absxcfbgXtb3o که کد شده هست. سرچ کردم تو اینترنت و مثل اینکه قبلا شکسته شده و در تمام سیستم های بر اساس چیپ HiSilicone این رمز ساده وجود داره: xc3511

کنارش یک فایل -passwd هم بود توش این شکلی بود:

root:ab8nBoH3mb8.g:0:0::/root:/bin/sh

اینم ab8nBoH3mb8.g قبلا شکسته شده و رمز اصلی اینه: helpme

فعلا نمیدونم -passwd به چه دردی میخوره. اگر میخوایید درباره این چیزا بخونید، اینجا1 و اینجا2 و اینجا3 و اینجا4

در ادامه در فایل init.d/rcS رو باز کردم. چون وقتی هسته اصلی لینوکس شروع میشه اولین کار اجرا کردن دستورات این فایل هست.

#!/bin/sh

/etc/init.d/dnode

mkdir -p /dev/.udev
udevd --daemon
udevadm trigger
EnvPartCheck&
sleep 3
mount -t squashfs /dev/mtdblock2 /usr   
mount -t squashfs /dev/mtdblock3 /mnt/web
mount -t squashfs /dev/mtdblock4 /mnt/custom
mount -t cramfs /dev/mtdblock5 /mnt/logo
mount -t jffs2 /dev/mtdblock6 /mnt/mtd
if [ $? -ne 0 ];then
 echo "Clean up the old data in the 'mtd' partition."
 /sbin/flash_eraseall -j -q /dev/mtd6 
 mount -t jffs2 /dev/mtdblock6 /mnt/mtd
fi

mount -t ramfs  /dev/mem        /var
#mount -t usbfs none /proc/bus/usb/

mkdir -p /mnt/mtd/Config /mnt/mtd/Log /mnt/mtd/Config/ppp /mnt/mtd/Config/Json

if [ ! -f /mnt/mtd/Config/HvrMode ] && [ -f /mnt/custom/HvrMode ]; then
	cp /mnt/custom/HvrMode /mnt/mtd/Config/
fi
if [ -f /mnt/mtd/Config/ppp/3gdigal ]; then
	chmod 777 /mnt/mtd/Config/ppp/3gdigal
fi
cd /usr/etc
./loadmod
ifconfig eth2 up
ifconfig eth2 192.168.1.12
echo 4096 > /proc/sys/vm/min_free_kbytes
echo 655360 > /proc/sys/net/core/rmem_max
routedaemon&
dogtest &

#BurnSataHub &

#telnetd &

timecheck &

macGuarder &

sleep 3
netinit &
sleep 1

ifconfig eth0 down
ifconfig eth0 up
echo 655360 > /proc/sys/net/core/rmem_max

/usr/etc/pppd pty /etc/ppp/pppoe-start file /etc/ppp/pppoe-options &

/mnt/custom/extapp.sh &

#unrar x /usr/bin/Sofia.rar /var/
cp /usr/bin/Sofia.tar.lzma /var/
cd /var/
tar -axf /usr/bin/Sofia.tar.lzma

chmod 777 /var/Sofia
rm /var/Sofia.tar.lzma -fr
dvrHelper /lib/modules /usr/sbin/SofiaRun.sh 127.0.0.1 9578 1

یکسری کارای متداول میکنه و در آخر برنامه Sofia.tar.lzma رو از فشرده خارج و اجرا میکنه. نکته جالب اینجاست که دستور telnetd کامنت شده تا اجرا نشه. مثل اینکه در فریمورهای قدیمی Telnet باز بوده و هرکسی میتونسته با داشتن رمز به دستگاه وصل بشه. در فریمورهای جدید اینو کلا بستن. اگر بشه این خط رو از کامنت دراوورد و تمام این فایل ها رو دوباره به حالت اولیه .bin رسوند و داخل NVR نصب کرد. با داشتن رمز و باز بودن تلنت به دستگاه وصل میشیم.

برای این کار باید اون فریمور 2021 رو که قبلا گفتم دانلود کنم. اون قسمت romfs رو باز کنم این فایل رو تغییر بدم و دوباره به همون شکل اول بذارم سرجاش. این وسط یک نکته هست:

یکی از راه ها استفاده از پروگرامر TNM5000 یا نسخه ارزون اون CH341 هست. یعنی شما فریموری که توی خود دستگاه هست رو استخراج میکنید و تغییر میدید و میذارید سر جاش. اینجا رو ببینید. من قبل از اینکه کاری بکنم فریمور رو از خود دستگاه خروجی گرفتم (بهش میگن dump) ولی نه برای تغییر دادنش بلکه برای پشتیبان گیری که اگر اتفاقی افتاد بتونم به حالت سالم دستگاه برگردم. برای این کار در بیشتر مواقع باید آی سی فلش رو با لحیم کاری از دستگاه جدا کنید و بخونیدش و عموما نمیشه بدون لحیم کاری از خود دستگاه خوند.

اما اگر توی وبسایت ها نگاه کنید متوجه میشید که اکثرا همین کار رو میکنن چون فایل فریمور اصلی در دسترس نیست. اما برخی اوقات مثل اینجا و شرایط خودم، این فایل رو داشتم.

اول از همه با دستور file نگاه کردم ببینم فریمور اصلی با پسوند bin داخلش چیه. خروجی این بود:

YK_HZXM_NBD8016R-PL-V2_V4.03.R11.7601.Nat.OnvifC.20210702.bin: Zip archive data, at least v2.0 to extract, compression method=deflate

برخلاف فریمورهای متداول، این فایل یه فایل فشرده zip هست که خودشو به اسم bin معرفی کرده. تو خود ویندوز با winrar بازش کردم. جالب اینجاست که از اولش نیازی به binwalk و Dumpbuilder نبود.

custom-x.cramfs.img
logo-x.cramfs.img
InstallDesc
romfs-x.cramfs.img
u-boot.bin.img
user-x.cramfs.img
web-x.cramfs.img

بازش کردم و توش همون پارتیشن ها در کنار یک فایل InstallDesc بود.

{
	"UpgradeCommand":	[{
			"Command":	"Burn",
			"FileName":	"u-boot.bin.img"
		}, {
			"Command":	"Burn",
			"FileName":	"web-x.cramfs.img"
		}, {
			"Command":	"Burn",
			"FileName":	"custom-x.cramfs.img"
		}, {
			"Command":	"Burn",
			"FileName":	"user-x.cramfs.img"
		}, {
			"Command":	"Burn",
			"FileName":	"romfs-x.cramfs.img"
		}],
	"Hardware":	"NBD8008R-PL",
	"SupportFlashType":	[{
			"FlashID":	"0x00EF4017"
		}, {
			"FlashID":	"0x00EF4018"
		}, {
			"FlashID":	"0x00C22017"
		}, {
			"FlashID":	"0x00C22018"
		}, {
			"FlashID":	"0x00C22019"
		}, {
			"FlashID":	"0x00C84017"
		}, {
			"FlashID":	"0x00C84018"
		}, {
			"FlashID":	"0x001C7017"
		}, {
			"FlashID":	"0x001C7018"
		}, {
			"FlashID":	"0x00207017"
		}, {
			"FlashID":	"0x00207018"
		}, {
			"FlashID":	"0x000B4017"
		}, {
			"FlashID":	"0x00206018"
		}, {
			"FlashID":	"0x000B4018"
		}, {
			"FlashID":	"0x00A14018"
		}, {
			"FlashID":	"0x00A12818"
		}, {
			"FlashID":	"0x00ef4019"
		}, {
			"FlashID":	"0x00ef7019"
		}, {
			"FlashID":	"0x00c84019"
		}, {
			"FlashID":	"0x00204018"
		}],
	"DevID":	"C63802021100100000400000",
	"HardWareVersion":	1,
	"Vendor":	"General",
	"WifiDriverType":	"mt7601Usta",
	"CompatibleVersion":	1,
	"CRC":	"441604310636",
	"Mx8Q":	"xR2gaLE3GCOTYC+XkC8wPnD92ijWDb+4V6DjGZqCo0+8JfvXV5/x6Ks+fJVhGHTnK9S5IhLv3GHTdwnoXE07ukyXbiqe3z/7jQvEhIiRDI5Br2AIL+BeMB5XqLEgXYkaRP+vC+MyogJ7ggnc2WNIgfKbAum88/0mDuXj1avleijaTWU="
}

این فایل نحوه آپگرید کردن دستگاه رو بهش میگه. دوتا متغیر Mx8Q و CRC رو جلوتر میگم ممکنه چی باشه.

چیزی که من میخواستم فایل romfs-x.cramfs.img بود. این فایل خودش img هست. باید اول از اون حالت دربیاد.

با دستور زیر از حالت img خارج کردم:

dumpimage romfs-x.cramfs.img -o romfs-x.cramfs

حالا فایل cramfs شده. این یک نوع فایل سیستم هست. توی چنین دستگاه هایی که بهشون embedded میگن استفاده میشه. دلیل استفاده از این نوع فایل سیستم اینه که فقط خواندنیه تا دستگاه نتونه فایل خودشو خراب کنه و هر اتفاقی بیافته همون فایل اصلی رو بخونه. البته نسخه جدیدتش SquashFS هست.

مشکل اینجاست که بازم با دستور فایل نشون داد که این SquashFS هست ولی پسوند cramfs بهش دادن!

romfs-x.cramfs: Squashfs filesystem, little endian, version 4.0, xz compressed, 3583130 bytes, 213 inodes, blocksize: 262144 bytes,

و واقعا هم هست و اشتباهی نشده چون نوع فشرده سازی xz هست نه Zlib. توی cramfs فقط zlib هست. در هر حال با دستور unsquashfs romfs-x.cramfs بازش کردم و یک فولدر بهم داد که همون فایل های لینوکسی توش بود. همونطور که قبلا گفتم، هدف اجرا کردن telnetd بود. (البته توی sbin نگاه کردم دیدم باینریش هست هنوز). بعد از تغییر فایل rcS باید همین مسیر رو بگردم و فایل bin رو بسازم. پس:

mksquashfs squashfs-root/ newromfs-x.cramfs -comp xz

با روش xz دوباره SquashFS از اون فولدر ساختم. ولی پسوندش رو همون cramfs گذاشتم. بعدش اینجا باید با mkimage دوباره فایل img بسازم. فایل های img هدر دارن و دستگاه باید تشخیص بده که این فایل مخصوص چه معماری ای هست و… راهش اینه که این اطلاعات رو دستی از دستور file بگیرم و خودم تک به تک بذارم سر جاش.

$ file romfs-x.cramfs.img
romfs-x.cramfs.img: u-boot legacy uImage, linux, Linux/ARM, OS Kernel Image (gzip), 3584000 bytes, Fri Jul  2 08:26:14 2021, Load Address: 0X050000, Entry Point: 0X430000, Header CRC: 0X69F4CF7D, Data CRC: 0XA036CF64

ولی دادم هوش مصنوعی برام یک خط دستور نوشت که خودش این مقادیر رو از فایل اصلی برمیداره و پاس میده به فایل جدید:

dumpimage -l romfs-x.cramfs.img | awk '/Load Address/ {a=$4} /Entry Point/ {e=$7} END {print a,e}' | while read A E; do   mkimage -A arm -O linux -T kernel -C gzip -n "linux" -a $A -e $E -d newromfs-x.cramfs newromfs-x.cramfs.img; done

حال این فایل romfs-x.cramfs.img رو ریختم توی پوشه moded در کنار فایل هایی که تغییر نداده بودم و با level 9 فشرده کردم. مثل خود فایل اصلی که نوشته بود: compression method=deflate

cd Moded && zip -r -9 ../moded.bin . && cd ..

فایل bin رو از طریق رابط وب دستگاه نصب کردم ولی متاسفانه کار نکرد. چیزای دیگه ای هم بعدا تست کردم ولی خب اونا هم کار نکردن. بنظرم چندتا دلیل برای این موضوع هست:

1- کلا روشی که این دستگاه های چینی فریمورشون آپدیت میشه فرق داره. دیدید که از اول فایلش zip بود و به اسم bin خروجی گرفته شده بود.

2- ممکنه بگید چون فایل رو تغییر دادی و crc کل فایل رو بهم زدی، دستگاه آپدیت رو قبول نکرده. بنظرم اینجوری نیست چون یکی قبلا یه چیزایی درباره CRC و Mx8Q نوشته بود.

3- چینی ها کلا با ویندوز کاراشون رو انجام میدن. از دستگاه های صنعتی بزرگ تا خط تولید آیفون. حتی کیت توسعه این آی سی (Hi3536CV100 core board development board) وجود داره و برنامه هاش ویندوزیه انگار. در نتیجه برنامه هایی که برای تغییرات این فایل توسط کارخونه وجود داره قطعا ویندوزیه. به عنوان مثال برنامه ای که از طریق ساعت دستگاه، رمز فراموش شده رو بهتون میده، اونم ویندوزیه.

4- شاید میشد از طریق پروگرامر و dump بتونم تغییر بدم ولی روشیه که تجهیزات و ابزار نیاز داره و من ندارم.

5- دستگاه جدید V3 هم بررسی کردم و وضعیت بدتره. مثلا توی U-boot ازم پسورد میخواد. U-boot تحت لایسنس GPLv2 هست. یعنی هر تغییری باید به طور متن باز منتشر بشه. پس کارخونه باید رمز رو در اختیار من و دیگران بذاره که نذاشته و اینجا نقض لایسنس کرده.(مثل اینکه بهش میگن فایل اصلاحی). در ضمن توی دستگاه جدید آی سی Hisilicone عوض شده و احتمالا XM8536 باشه. مثل اینکه خود شرکت Xiongmai تولید کرده.

وقت و حوصله برای پیگیری بیشتر نداشتم ولی فعلا دستگاه دستمه و شاید بفروشم. اگر چیزی بیشتری درباره این قضیه میدونید تو کامنت ها بگید تا شاید کمک کنه.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *