固件修改及编译记录
字数 953 2025-08-22 12:22:48

固件修改及编译技术详解

一、固件解包与修改

1.1 固件结构分析

使用binwalk分析固件结构:

binwalk dcs932l_v1.14.04.bin

典型结构组成:

  • U-Boot引导程序
  • uImage头
  • LZMA压缩的内核系统

1.2 固件解包

binwalk -Me dcs932l_v1.14.04.bin

1.3 文件系统修改与重新打包

  1. 修改文件系统内容
  2. 打包为cpio格式:
find . | cpio -H newc -o > ../initrd.cpio
  1. 使用LZMA压缩(注意保持原字典大小):
./lzma e initrd.cpio initrd.cpio.lzma -d20

1.4 内核重组

  1. 截取内核头部:
dd if=50040 of=kernelHead bs=1 count=4038656
  1. 合并内核:
cp ./kernelHead ./kernel
cat initrd.cpio.lzma >> kernel
  1. 压缩内核:
./lzma e ./kernel ./kernel.lzma -d25

1.5 uImage处理

  1. 截取uImage头:
dd if=dcs of=uImageHeader bs=1 count=64
  1. 合并uImage:
cp uImageHeader uImage
cat kernel.lzma >> uImage

1.6 CRC校验处理

  1. 计算data CRC(使用WinHex工具)
  2. 修改uImage头中的:
    • header CRC
    • image大小
    • data CRC

或使用mkimage自动生成:

sudo apt-get install u-boot-tools
mkimage -A MIPS -O linux -T kernel -C lzma -a 0x80000000 -e 0x803B8000 -n "Linux Kernel Image" -d kernel.lzma uImage

mkimage参数说明:

  • -A: CPU架构
  • -O: 操作系统
  • -T: 镜像类型
  • -C: 压缩类型
  • -a: 加载地址
  • -e: 入口地址
  • -n: 镜像名称
  • -d: 输入文件

二、固件烧录方法

2.1 通过U-Boot烧录

  1. 设备启动时进入U-Boot
  2. 选择TFTP加载选项:
    1: Load system code to SDRAM via TFTP.
    
  3. 输入设备IP、服务器IP和固件文件名

2.2 注意事项

  • 建议先加载到内存测试,不要直接刷入Flash
  • 刷错固件可能导致设备变砖

三、OpenWrt固件编译

3.1 环境准备

  1. 获取源码:
git clone https://github.com/openwrt/openwrt
  1. 安装依赖:
sudo apt-get install gcc g++ binutils patch bzip2 flex bison make autoconf gettext texinfo unzip zip unrar p7zip p7zip-rar p7zip-full sharutils subversion libncurses5-dev ncurses-term zlib1g-dev gawk git-core libssl-dev
  1. 更新feed:
./scripts/feeds update -a
./scripts/feeds install -a
make package/symlinks

3.2 配置与编译

  1. 默认配置:
make defconfig
  1. 菜单配置:
make menuconfig
  1. 编译:
make V=99

编译完成后固件位于:

./bin/targets/ramips/rt305x/

文件系统目录:

./build_dir/target-mipsel_24kc_musl/root-ramips

四、Ralink SDK固件编译

4.1 工具链安装

  1. 安装编译工具链:
cp RT288x_SDK/toolchain/buildroot-gcc342.tar.bz2 /opt
tar jxvf buildroot-gcc342.tar.bz2
  1. 安装LZMA:
tar xvfz RT288x_SDK/toolchain/lzma-4.32.7.tar.gz
cd RT288x_SDK/toolchain/lzma-4.32.7
./configure
make
make install
  1. 安装MKSQUASHFS:
cd RT288x_SDK/toolchain/mksquash_lzma-3.2
make
make install

4.2 内核配置要点

Machine selection --->
  System type--> (选择板子型号)
  DRAM Size (32M) ---> (选择内存大小)
  Kernel NVRAM (启用NVRAM)
  Compress ramdisk by lzma instead of gzip (用lzma打包镜像文件)

General setup --->
  Kernel->user space relay support

Block layer --->
  Enable the block layer
  IO Schedulers --->
    Default I/O scheduler (No-op) --->

Networking --->
  Networking options --->
    Packet socket
    Unix domain sockets
    TCP/IP networking
    Generic IEEE 802.11 Networking Stack
    IEEE 802.11 WEP encryption (802.1x)

Device Drivers --->
  Network device support --->
    Network device support
  Character devices --->
    Ralink GPIO Support
    Ralink GPIO LED Support
  USB support --->
    Support for Host-side USB
    USB device filesystem

File systems --->
  Kernel automounter support
  Kernel automounter version 4 support
  Filesystem in Userspace support
  Pseudo filesystems --->
    /proc file system support
    /proc/kcore support
    Sysctl support (/proc/sys)
    sysfs file system support

4.3 文件系统修改

修改路径:

source/vendors/Ralink/RT3052/

关键文件:

  • rcS: 启动脚本
  • inittab: init进程配置文件
  • motd: Ralink图标
  • fstab: 文件系统信息
  • RT2860_default_vlan: nvram默认配置文件

添加文件方法:

  1. 在ROMFS_DIRS后添加目录
  2. 在Makefile中添加文件引用

五、启动脚本配置示例

#!/bin/sh

# 挂载文件系统
mount -a

# 创建静态设备节点
mounted=`mount | grep mdev | wc -l`
if [ $mounted -eq 0 ]; then
  mount -t ramfs mdev /dev
  mkdir /dev/pts
  mount -t devpts devpts /dev/pts
  mdev -s
fi

# 创建设备文件
mknod /dev/spiS0 c 217 0
mknod /dev/i2cM0 c 218 0
mknod /dev/rdm0 c 254 0
[...其他设备节点...]

# 设置用户账户
login=`nvram_get 2860 Login`
pass=`nvram_get 2860 Password`
echo "$login::0:0:Adminstrator:/:/bin/sh" > /etc/passwd
echo "$login:x:0:$login" > /etc/group
chpasswd.sh $login $pass

# 网络配置
lan_if="br0"
ifconfig lo up
ifconfig eth2 0.0.0.0
ifconfig ra0 0.0.0.0
brctl addbr br0
brctl addif br0 ra0
brctl addif br0 eth2
brctl setfd br0 1
brctl setmaxage br0 1

# IP配置
ip=`nvram_get 2860 wan_ipaddr`
nm=`nvram_get 2860 wan_netmask`
gw=`nvram_get 2860 wan_gateway`
ifconfig $lan_if $ip netmask $nm
route del default
[...路由配置...]

# 启动服务
web.sh
schedule &
telnetd

六、注意事项

  1. 保持与原固件相同的压缩参数(如LZMA字典大小)
  2. 修改uImage时注意CRC校验
  3. 烧录前先在内存中测试
  4. 编译环境建议使用低版本make
  5. 文件系统修改后要确保权限正确
  6. 关键配置文件备份后再修改
固件修改及编译技术详解 一、固件解包与修改 1.1 固件结构分析 使用binwalk分析固件结构: 典型结构组成: U-Boot引导程序 uImage头 LZMA压缩的内核系统 1.2 固件解包 1.3 文件系统修改与重新打包 修改文件系统内容 打包为cpio格式: 使用LZMA压缩(注意保持原字典大小): 1.4 内核重组 截取内核头部: 合并内核: 压缩内核: 1.5 uImage处理 截取uImage头: 合并uImage: 1.6 CRC校验处理 计算data CRC(使用WinHex工具) 修改uImage头中的: header CRC image大小 data CRC 或使用mkimage自动生成: mkimage参数说明: -A : CPU架构 -O : 操作系统 -T : 镜像类型 -C : 压缩类型 -a : 加载地址 -e : 入口地址 -n : 镜像名称 -d : 输入文件 二、固件烧录方法 2.1 通过U-Boot烧录 设备启动时进入U-Boot 选择TFTP加载选项: 输入设备IP、服务器IP和固件文件名 2.2 注意事项 建议先加载到内存测试,不要直接刷入Flash 刷错固件可能导致设备变砖 三、OpenWrt固件编译 3.1 环境准备 获取源码: 安装依赖: 更新feed: 3.2 配置与编译 默认配置: 菜单配置: 编译: 编译完成后固件位于: 文件系统目录: 四、Ralink SDK固件编译 4.1 工具链安装 安装编译工具链: 安装LZMA: 安装MKSQUASHFS: 4.2 内核配置要点 4.3 文件系统修改 修改路径: 关键文件: rcS : 启动脚本 inittab : init进程配置文件 motd : Ralink图标 fstab : 文件系统信息 RT2860_default_vlan : nvram默认配置文件 添加文件方法: 在ROMFS_ DIRS后添加目录 在Makefile中添加文件引用 五、启动脚本配置示例 六、注意事项 保持与原固件相同的压缩参数(如LZMA字典大小) 修改uImage时注意CRC校验 烧录前先在内存中测试 编译环境建议使用低版本make 文件系统修改后要确保权限正确 关键配置文件备份后再修改