OpenWrt固件结构分析(uImage格式)
OpenWrt项目是一个针对嵌入式设备的Linux操作系统。OpenWrt不是一个单一且不可更改的固件,而是提供了具有软件包管理功能的完全可写的文件系统。这使您可以从供应商提供的应用范围和配置中解脱出来,并且让您通过使用适配任何应用的软件包来定制设备。对于开发人员来说,OpenWrt是一个无需围绕它构建完整固件就能开发应用程序的框架; 对于普通用户来说,这意味着拥有了完全定制的能力,能以意想不到的方式使用该设备。
OpenWrt固件采用的是uboot形式的固件,称为u-boot legacy uImage。
在浏览器中输入官网地址:https://openwrt.org/

选择一个型号固件进行下载SYSUPGRADE版本的映像:

使用本站的固件分析工具分析固件结构:

解析后结果如下:
| 序号 | 偏移 | 说明 |
| 1 | 0x0-0x3F | 固件头 |
| 2 | 0x40-0x1E613A | 压缩的内核映像 kernel |
| 3 | 0x1E613B-0x1E613B | 文件系统映像 rootfs |
其中固件结构的第一部分uImage( 0x0-0x3F )是比较关键的,下面我们通过本站固件分析工具的结果和16进制工具打开固件分析了解其具体结构:

| 序号 | 偏移 | 说明 |
| 1 | 0x00-0x03 | 标识符,标记此为OpenWrt固件 \x27\x05\x19\x56 |
| 2 | 0x04-0x07 | 固件校验值 CRC,值为0xB2E38022 |
| 3 | 0x08-0x0b | 时间戳,值为0x612EAB18 |
| 4 | 0x0c-0x0f | kernel映像长度,值为0x1E60FB |
| 5 | 0x10-0x13 | kernel加载点地址,值为0x80000000 |
| 6 | 0x14-0x17 | kernel入口点地址,值为0x80000000 |
| 7 | 0x18-0x1b | kernel映像校验值 CRC,值为0x2283DF27 |
| 8 | 0x1c | 系统: Linux |
| 9 | 0x1d | CPU: MIPS |
| 10 | 0x1e | 映像类型: OS Kernel Image |
| 11 | 0x1f | 压缩类型: lzma |
| 12 | 0x20-0x3f | 映像名称字符串 |
具体内容可以参考OpenWrt或Uboot源码。