Netgear路由器固件结构分析(chk格式)

全球领先的企业网络解决方案,及数字家庭网络应用倡导者美国网件公司-NETGEAR Inc. (Nasdaq 股票代码:NTGR)成立于1996年1月,一直致力于网络技术创新,专注于产品的可靠性和易用性提升,为全球商用企业用户和家庭个人用户提供使用简便的高质量网络解决方案。美国网件总部设在美国加州圣何塞(San Jose,CA),已经在全球 25 个国家设立分支机构,产品通过 37000 家经销商在全球28000 个零售终端进行销售。对于个人消费者,美国网件提供了高性能,高可靠性与易用的家庭网络,家庭存储、数字媒体以及其他产品使消费者能够轻松接入到互联网。对于企业用户而言,美国网件为他们的 IT 基础架构提供强大的数据存储、安全、交换、无线解决方案,且无需花费巨大成本。同时,美国网件也在为全球顶级运营商提供网络产品,帮助运营商为他们的用户构建数字家庭。

这里分析的型号为R7000,固件版本V1.0.11.134_10.2.119。首先我们用16进制工具查看固件头部数据:

前0x3A字节为Netgear的固件头,分析的结果为:

序号偏移说明
10x00-0x03固件标识,字符串*#$^
20x04-0x07固件头大小,值为0x3A
30x08regionIndex
40x09-0x0C软件版本,值为\x01\x01\x0B\x86,实际为1.0.11.134
50x0D-0x0FUI版本,值为\x0A\x02\x77,实际为10.2.119
60x10-0x13校验值,值为3C262DD3,不包含固件头
70x14-0x17填充数据,值为0x00000000
80x18-0x1B固件总长度,值为0x01E42000
90x1C-0x1F填充数据,值为0x00000000
100x20-0x23校验值,值为0x3C262DD3,不包含固件头
110x24-0x27校验值,值为0x0DC00A9A,仅固件头,填充此值为0计算的校验值
120x28-0x39硬件版本字符串,为U12H270T00_NETGEAR

校验算法:

#/usr/bin/python3

c0 = 0
c1 = 0
data = open("firmware.bin","rb").read()
for i in range(len(data)):
    c0 += data[i]
    c1 += c0
c0 &= 0xffffffff
c1 &= 0xffffffff
c0 = (c0 & 0x0ffff) + (c0 >> 16)
c0 = ((c0 >> 16) + c0) & 0xffff
c1 = (c1 & 0x0ffff) + (c1 >> 16)
c1 = ((c1 >> 16) + c1) & 0xffff
csum = (c1 << 16) | c0
print("0x%08X"% csum)

偏移0x3A-0x55为trx头,解析如下:

序号偏移说明
10x3A-0x3D标识符,标记此为TRX固件,字符串为HDR0
20x3E-0x41固件总大小,包括TRX头,小端序,值为0x01E42000
30x42-0x45固件校验值 CRC32,值0x311C1F30,不包含netgear头和trx头的前12字节
40x46-0x47flags,值为0
50x48-0x49version,值为1
60x40-0x4D加载器偏移,值为0x1c,实际为kernel偏移,从trx头开始算起
70x4E-0x51内核偏移,值为0x21e640,实际为rootfs偏移,从trx头开始算起
80x52-0x55文件系统偏移,实为空

TRX头和CRC32的算法可参考《asus路由器固件结构分析(trx格式)》这篇文章。

根据解析的偏移,同样可以编写binwalk对netgear固件头的识别方法,这里就不过多介绍了。使用本站的固件分析工具可以分析固件结构:

最终根据固件头可以知晓固件的结构:

序号偏移说明
10x0-0x39netgear 固件头
20x3A-0x55trx 固件头
30x56-0x21e679压缩的内核 kernel
40x21e67a-末尾文件系统 rootfs

参考文章:

https://mp.weixin.qq.com/s/o9v4V673ayyMTY1vGjveFg

https://kb.netgear.com/2649/NETGEAR-Open-Source-Code-for-Programmers-GPL

留下评论

您的电子邮箱地址不会被公开。 必填项已用*标注