最近在看文件系统基础结构等知识,本来重点是想看EXT4文件系统,但是目前没有找到比较详细说明EXT4文件系统详细结构的,用EXT3的对应着找结果有点出入,在想是不是我用hexdump的参数有问题,于是找了一个FAT32文件系统来试验hexdump参数的使用,结果准确找到了文件内容,在这里记录一下。

  •   操作系统:linux(centos6.5)
  •   文件系统:FAT32(来自于U盘)
  •   工具:hexdump,windows自带计算器

        hexdump是linux操作系统中用来查看文件二进制内容的一种工具,win10打开windows自带计算器方法:windows+R然后输入Calc.exe回车

  •   参考书目:《数据重现-文件系统原理精解与数据恢复最佳实践》(马林 著)

  步骤:

  FAT32文件系统结构:

保留区 FAT区 数据区

1、查看文件系统相关信息:

  df -T

解释:df可查看文件系统磁盘空间使用情况,-T选项可查看文件系统类型,以下是查看结果:

  

可以看到文件系统/dev/sdb为文件系统类型为vfat也就是FAT32类型(具体的目录就是插入的u盘),下面就是对该文件系统进行追踪。这里要追踪的文件是:childTEXT.txt,可从挂载点查看文件内容,childTEXT.txt的基本情况如下:

  

  文件内容及基本信息:

  

2、查看引导扇区,得到每扇区字节数、每簇扇区数、保留扇区数、FAT表占用扇区数、FAT表个数、根目录起始簇号,进而定位FAT表、根目录、数据区位置。

  命令:hexdump -s 0 -n 512 -C /dev/sdc

解释: 选项-s指偏移量,单位是字节,默认是十进制,也可以在数字前加上"0X"表示十六进制;

      -n选项表示要读取的字节数,只能用十进制表示,引导扇区占一个扇区,一般为512个字节;

       -C选项可以输出十六进制对应的ASCII码,要注意这里的是大写的C,小写的c选项表示单字节字符显示;

     /dev/sdc为文件系统名

查看结果:

  

 2.1得到基本数据:

  首先可以看到偏移0x1fe-1ff处为“55aa”也就是引导扇区的结束标志。

  0x0b-0x0c是每扇区字节数:0x0200(十进制的512)

  0x0d是每簇扇区数:0x10(十进制的16)

  0x0e-0x0f是保留扇区数:0x26(十进制38)

  0x10是FAT表个数:0x02(十进制2)

  0x24-0x27是一个FAT表扇区数:0x3e71(十进制15985)

  0x2c-0x2f是根目录起始簇号:0x02(十进制2)

2.2定义FAT表

      从FAT32文件系统结构可以看出,FAT区紧跟在保留区后面,因此引导扇区中获取保留区扇区数后就可以得到FAT区起始位置。

      FAT起始字节=保留区扇区数*每扇区字节数

      0x26*0x200=0x4c00(十进制19456)

计算FAT区大小:FAT区所占字节数=每FAT表所占扇区数*每扇区字节数*FAT表个数

        0x3e71*0x200*0x02=0xf9 c400(十进制16,368,640)

读取命令:

  hexdump -s 0x4c00 -n 1024 -C /dev/sdc

读取结果:

  

上面是FAT表部分内容,FAT表中四个字节为一个表项。

  当某个簇未使用时,对应的FAT表项值为0x00000000;

  当该簇是某个文件最后一个簇时,对应表项值为0x0fffffff(大端形式为:ff ff ff 0f);

  当该簇为坏簇时;FAT表项值为0x0ffffff7(f7 ff ff 0f);

  因为簇号起始于2号(FAT表项与簇是一一对应关系),因此FAT表项0,1项不与任何簇对应,其0号表项值总为“f8 ff ff 0f”;1表项可能用于记录脏标志(说明文件系统没有被正常卸载或磁盘表面存在错误),其表项值一般为“ffffffff”或“ffffff0f”。

2.3定位根目录

  根目录位于数据区的开始,因此定位根目录就是定位数据区的开始。

数据区紧跟FAT区后,所以数据区的开始扇区号就是保留区+FAT区扇区号:

   数据区起始扇区号=保留区扇区个数+每FAT表扇区个数*FAT表个数

    0x26+0x3e71*0x02=0x7d08(十进制32008)

    偏移字节:0x7d08*0x200=0xfa1000(十进制16388096)

读取结果:

  

3、从根目录中由子目录名来查找子目录的起始簇号和起始扇区号。

  上图中可以看到我们要找的目录RootDIR有两个,这是因为根目录有32字节的短文件名目录项和32字节或更多个32字节的长文件名目录项,一般在短文件名目录项的前面(如果多于一个32字节,则倒序存放)

  找到需要的目录项:

  0x10c0-0x10ca为文件名,剩余文件名空间用0x20补齐。“52 4f 4f 54 44 49 52 20 20 20 20”,这里要说明一下,文件名的第一个字节比较特殊,当该文件被删除时,文件名的第一个字节就被改写为0xe5(未被使用是0x00)

  0x10cb是文件属性:0x10表示目录

  0x10da-0x10db是文件内容起始簇号低两个字节:0x5123(高两个字节位置是0x10d4-0x10d5,这里全为0)

  0x10dc-0x10df是文件内容大小字节数:0x00000000,当文件属性为目录时,该值为0。

  0x5123就是子目录RootDIR的起始簇号。

  利用簇号找到他相对应的扇区号的公式是:

  某簇对应的扇区号=保留区扇区个数+FAT区扇区个数+(簇号-2)*每次扇区个数

            0x26+0x3e71*2+(0x5123-0x02)*0x10=0x58f18(十进制364312)

  簇号对应的偏移字节:0x58f18*0x200=0xb1e3000。

4、从子目录中找到目标文件。

  上一步中计算的0xb1e3000就是子目录的偏移字节。

  依旧使用hexdump命令读取子目录内容:

  

  在子目录中,我们看到前64个字节的文件名比较特殊,第一个32字节的文件名是“.”表示本目录,证据就是该目录起始簇号的低两个字节是0x5123,就是第三步中我们找到的RootDIR目录的起始簇号;第二个32字节的文件名是“..”表示根目录。

  其次还可以看到目标子目录项的前后两个子目录都被删除了。

目标子目录项提供的信息:

  0x30a0-0x30aa:文件名

  0x30ab是文件属性:0x20表示存档文件

  0x30ba-0x30bb是文件内容起始簇号的低两个字节:0x5126

  0x30bc-0x30bf是文件内容大小:0x2e(十进制46,与第一步中我们用ls -l命令查看文件基本情况相符)

  使用和第3步同样的方法计算出0x5126簇号对应的扇区号:

    0x26+0x3e71*0x02+(0x5126-2)*0x10=0x58f48

  偏移字节为:0x58f48*0x200=0xb1e9000

5、从起始簇号开始读取文件第一个簇内容。

  使用上一步中计算出的偏移字节读取文件第一个簇的内容:

  

  这里的示例文件大小小于一个簇(8192个字节),我们在第4步中已经知道他的大小为46个字节,因此可以使用下面命令准确读出文件内容。

  

6、查看FAT表项值,查找文件下一个簇内容。

  查找簇号为0x5126的FAT表项值就可以找到该文件的下一个簇。

  簇号对应的FAT表项值=簇号*每个FAT表项值所占字节数

  0x5126*0x04=0x14498(十进制83096)

  也就是说0x5126号簇的FAT表内偏移字节为0x14498,要想从开始算起则加上FAT区的起始字节就可以了。

  某簇对应FAT表的绝对字节偏移=保留扇区数*每扇区字节数+簇号*每FAT表项字节数

  0x14498+0x4c00=0x19098

  读取偏移0x19098开始的4个字节内容

  

  该表项值为0x0fffffff,表示该簇就是该文件的结束簇,文件读取结束。

到这里,利用hexdump追踪一个文件就结束了,居然写了一下午/(ㄒoㄒ)/~~,后续会追踪一个被删除的文件内容看看。

使用hexdump追踪FAT32文件系统中的一个文件的更多相关文章

  1. 使用hexdump工具追踪EXT4文件系统中的一个文件

    昨天追踪EXT4文件系统的过程中出了点问题,就是找不到文件,于是试了一下追踪FAT32文件系统的,成功之后有了点信心,今天继续嗑EXT4文件系统,终于找到啦,记录一下. 操作系统:linux(cent ...

  2. 在/proc文件系统中增加一个目录hello,并在这个目录中增加一个文件world,文件的内容为hello world

    一.题目 编写一个内核模块,在/proc文件系统中增加一个目录hello,并在这个目录中增加一个文件world,文件的内容为hello world.内核版本要求2.6.18 二.实验环境 物理主机:w ...

  3. 创建一个目录info,并在目录中创建一个文件test.txt,把该文件的信息读取出来,并显示出来

    /*4.创建一个目录info,并在目录中创建一个文件test.txt,把该文件的信息读取出来,并显示出来*/ #import <Foundation/Foundation.h>#defin ...

  4. 分别应用include指令和include动作标识在一个jsp页面中包含一个文件。

    分别应用include指令和include动作标识在一个jsp页面中包含一个文件. hello.jsp <%@ page language="java" import=&qu ...

  5. 在windows中把一个文件夹打成war包

    转: 在windows中把一个文件夹打成war包 一般开发打war包时都是用MyEclipse或IntelliJ IDEA等直接导出war文件,这里介绍一种如何把一个文件夹打成war包的方式,如下   ...

  6. python实现获取文件列表中每一个文件keyword

    功能描写叙述: 获取某个路径下的全部文件,提取出每一个文件里出现频率最高的前300个字.保存在数据库其中. 前提.你须要配置好nltk #!/usr/bin/python #coding=utf-8 ...

  7. Linux中显示一个文件最后几行的命令

    tail -n 20 filename说明:显示filename最后20行. Linux下tail命令的使用方法.linux tail命令用途是依照要求将指定的文件的最后部分输出到标准设备,通常是终端 ...

  8. C#获取路径中最后一个文件夹的名字

    using System; using System.IO; namespace ConsoleApplication1 { class Program { static void Main(stri ...

  9. Linux 获取目录中最后一个文件的名字

    find /application/docker_hub/logs/fof1private/amount_dev -type l | xargs basename

随机推荐

  1. 【Spark2.0源码学习】-6.Client启动

    Client作为Endpoint的具体实例,下面我们介绍一下Client启动以及OnStart指令后的额外工作 一.脚本概览      下面是一个举例: /opt/jdk1..0_79/bin/jav ...

  2. rpm不用yum安装rabbitMQ

    1.安装erlang 下载 esl-erlang_19.0~centos~6_amd64.rpm 打开https://www.erlang-solutions.com/resources/downlo ...

  3. Java ClassLoader 原理分析

    一.ClassLoader(类加载器)的作用 如果一个程序包含不止一个class文件,那么当程序启动时,带有main方法的类的class文件作为程序入口先被JVM加载,然后根据程序调用的需要,再逐步进 ...

  4. eclipse hibernate导出数据库实体类

    打开eclipse->help->Eclipse Marketplace->查找hibernate->安装如下插件 只要安装其中一个,hibernate tool即可: 安装完 ...

  5. python爬虫从入门到放弃(五)之 正则的基本使用

    什么是正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是 事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符",这个"规则字符" 来表达对 ...

  6. javaSE_Java第一周总结:有难度题目集合

    第一周练习总结 说明:尽量采用多种做法解决 1.使用三种方法实现变量交换 public class Test1Change{ public static void main(String[] args ...

  7. 浏览器本地储存方式有哪些?cookie、localStorage、sessionStorage

    现阶段,浏览器提供的储存方式常用的有三种,cookie.localStorage.sessionStorage 1.cookie 概念:cookie 是浏览器中用于保存少量信息的一个对象 基本特征: ...

  8. 移动端设置fixed布局的问题解决

    最近写移动端,遇到一个问题就是用fixed属性布局的时候由于手机的原因会出现很多问题,比如说手机端底部固定一块,然后里面有输入框,(类似于手机QQ或者微信底部的输入框一样的布局)这个时候在调用软键盘的 ...

  9. Backbox Linux简介与配置内网IP

    总体说起来,Backbox内置的工具什么的,并不是很多,但是它集成了一些用起来很棒的工具. 比如:Beef.Sqlmap.wpscan.zenmap.msf.w3af.dns嗅探等一系列工具,传说中的 ...

  10. Spring学习(13)--- 基于Java类的配置Bean 之 @Configuration & @Bean注解

    基于Java配置选项,可以编写大多数的Spring不用配置XML,但有几个基于Java的注释的帮助下解释.从Spring3.0开始支持使用java代码来代替XML来配置Spring,基于Java配置S ...