分析 JFFS2 文件系统的问题

逆向工程 固件 垃圾桶
2021-07-07 02:46:13

我提取了一个 NAND Flash 的内容并用 binwalk 对其进行了分析。
Binwalk 向我展示了转储包含一个大端 JFFS2 文件系统。我的下一步是将文件解压缩到一个目录中。为此,我只是使用了 binwalk。

binwalk -Me Dump

问题是 binwalk 通常会创建一个其他目录,该目录应该包含文件系统的所有文件夹和文件,但这是行不通的。
Binwalk 创建了目录,但它是空的。我已经安装了 Jefferson 以及对其工作很重要的所有东西,我尝试用我在互联网上找到的另一个转储来做同样的事情,它没有任何问题。

后来我发现我的CPU的字节序是little endian。我不知道这是否是导致问题的原因,老实说我不知道​​是否有办法更改 jffs2 文件的字节顺序以进行尝试。也许有人对此了解更多。

另一件一直困扰我的事情是,当我使用 file 命令检查 jffs2 文件时,它只返回“数据”。
同样,我不知道字节序是否导致了这个问题。我能说的是,当我检查在 Internet 上找到的其他转储时,jffs2 fs 处于小端,binwalk 可以创建包含所有文件的目录,并且文件命令还返回“jffs2 小端”,而不仅仅是“数据”。

字节序是否可能导致问题,有没有办法更改文件系统的字节顺序?

1个回答

可以直接挂载jffs2文件系统

用于在 linux 上挂载 jffs2 文件系统

安装 JFFS2 映像的一种方法是使用 mtdram 模块来模拟使用系统 RAM 的 MTD 设备。这适用于小于大约 32 MB 的 JFFS2 图像,但不适用于较大的图像,因为它需要分配大量系统 RAM。这个过程的基本步骤如下:

加载 mtdram 和 mtdblock 模块。使用 dd 命令将 JFFS2 映像复制到 /dev/mtdblock0。挂载 /dev/mtdblock0 作为 JFFS2 文件系统。

为了简化这个过程,EMAC 创建了一个脚本,它以 JFFS2 镜像、挂载点和镜像的擦除块大小为参数。此脚本的默认擦除块大小为 128 KiB,这是 EMAC 产品上使用的大多数 NOR 闪存和一些 NAND 闪存的正确值。可以从复制或创建映像的系统的 /proc/mtd 的内容中确定擦除块大小。例如,如果“erasesize”参数的值为 00040000,则设备的擦除块大小为 256 KiB(0x40000 = 262144 字节,262144 / 1024 = 256 KiB)。jffs2_mount_mtdram.sh 脚本如下所示。

#!/bin/bash

## Script to mount jffs2 filesystem using mtd kernel modules.
## EMAC, Inc. 2009

if [[ $# -lt 2 ]]
then
    echo "Usage: $0 FSNAME.JFFS2 MOUNTPOINT [ERASEBLOCK_SIZE]"
    exit 1
fi

if [ "$(whoami)" != "root" ]
then
    echo "$0 must be run as root!"
    exit 1
fi

if [[ ! -e $1 ]]
then
    echo "$1 does not exist"
    exit 1
fi

if [[ ! -d $2 ]]
then
    echo "$2 is not a valid mount point"
    exit 1
fi

if [[ "$3" == "" ]]
then
    esize="128"
else
    esize="$3"
fi

# cleanup if necessary
umount /dev/mtdblock0 &>/dev/null
modprobe -r mtdram &>/dev/null
modprobe -r mtdblock &>/dev/null

modprobe mtdram total_size=32768 erase_size=$esize || exit 1
modprobe mtdblock || exit 1
dd if="$1" of=/dev/mtdblock0 || exit 1
mount -t jffs2 /dev/mtdblock0 $2 || exit 1

echo "Successfully mounted $1 on $2"
exit 0

——

**developer@ldc:~$ sudo ./jffs2_mount_mtdram.sh rootfs.jffs2 /mnt/jffs2 256**

使用 jffs2_mount_mtdram.sh 在 /mnt/jffs2 上挂载名为 rootfs.jffs2 的 256 KiB 擦除块大小的映像