如何将binwalk提取修改后的目录重新打包为.img镜像文件
binwalk提取后目录重打包为.img镜像的可行方案
完全可以实现,核心要抓两个点:匹配原镜像的文件系统格式和打包参数、完整保留原文件的权限、链接属性,不同场景的具体操作如下:
前置准备
- 先确认原镜像的文件系统类型:如果之前binwalk的提取日志没存,重新跑
binwalk 你的原.img文件路径,输出结果里会明确标注识别到的文件系统类型,嵌入式场景最常见的是SquashFS,Linux/安卓镜像常见EXT4、CPIO,引导分区常见VFAT。 - 针对SquashFS格式,提前查好原镜像的打包参数:执行
unsquashfs -s binwalk解出的原始squashfs块文件,记下输出里的压缩算法、块大小,参数不对打出来的镜像设备认不出来。 - 算下你修改完的目录总大小,打包的时候多留10%~20%的冗余,别卡着大小做,容易写不下。
分场景打包操作
1. SquashFS格式(路由器、嵌入式固件最常用)
直接用mksquashfs工具打包,参数和之前查到的原镜像参数保持一致即可,示例命令:
# 命令格式:mksquashfs [修改后的文件目录] [输出img路径] -comp [压缩算法] -b [块大小] -noappend mksquashfs ./squashfs-root ./new_firmware.img -comp gzip -b 131072 -noappend
注意:
-noappend参数必须加,否则新内容会追加到已有镜像末尾,直接破坏镜像结构。
2. EXT2/EXT3/EXT4格式(Linux发行版镜像、安卓系统分区常用)
两种操作方式选一种即可:
- 方式一(系统原生命令,所有Linux发行版自带):
- 生成指定大小的空镜像文件:
# count参数对应镜像大小,单位为M,比如count=2048就是生成2G大小的空文件 dd if=/dev/zero of=./new_system.img bs=1M count=2048- 将空文件格式化为对应版本的EXT文件系统:
# 按需替换为mkfs.ext2/mkfs.ext3,和原镜像的文件系统版本保持一致 mkfs.ext4 ./new_system.img- 挂载空镜像,拷贝修改后的文件(必须保留权限):
sudo mkdir -p /mnt/temp_img sudo mount -o loop ./new_system.img /mnt/temp_img # -rp参数表示递归拷贝、保留原文件权限/所有者/时间戳/链接属性 sudo cp -rp ./修改后的目录/* /mnt/temp_img/ sync sudo umount /mnt/temp_img - 方式二(专用打包工具,操作更简便):
安装make_ext4fs工具后直接执行单条命令即可,工具会自动处理格式化、权限保留流程:make_ext4fs -l 2048M ./new_system.img ./修改后的目录路径
3. CPIO/initramfs格式(系统引导镜像、initrd镜像常用)
进入修改后目录的根路径,直接执行打包命令:
# 未压缩格式 find . | cpio -o -H newc > ../new_boot.img # gzip压缩格式(大部分发行版initrd默认用该格式) find . | cpio -o -H newc | gzip > ../new_initrd.img
4. VFAT/FAT32格式(EFI引导分区、小容量存储镜像常用)
操作流程和EXT系列类似:
# 生成空镜像,示例为512M大小 dd if=/dev/zero of=./new_efi.img bs=1M count=512 # 格式化为vfat格式 mkfs.vfat ./new_efi.img # 挂载后拷贝文件,同步写入后卸载即可 sudo mount -o loop ./new_efi.img /mnt/temp_img sudo cp -rp ./修改后的目录/* /mnt/temp_img/ sync sudo umount /mnt/temp_img
关键注意事项
- 所有拷贝操作禁止用图形界面拖拽文件,很容易丢失权限、链接属性,优先用
cp -rp或者rsync -a执行拷贝,否则镜像大概率无法正常启动。 - 多分区合并的整包img不要直接把整个提取根目录打包:binwalk提取多分区镜像时会把每个分区单独解包,需要把每个分区对应的目录分别打包成分区镜像,再按原镜像的分区偏移用dd命令拼合为完整img,也可以直接替换原img中对应分区的块内容。
- 如果打包后的镜像无法正常识别,优先核对打包参数(压缩算法、块大小、文件系统版本)和原镜像是否一致,90%以上的识别失败问题都是参数不匹配导致的。
内容的提问来源于stack exchange,提问作者Ahmadreza Vakil
相关产品推荐
相关产品推荐

