FAT32取证分析

news2024/9/25 14:08:31

前言:

在正常工作中经常会有数据恢复或者取证分析的场景,数据是否能被恢复,主要还是看数据是否被覆盖,正常情况下文件虽然被删除,只是修对应的标志位,文件本身数据并不会被破坏,所以我们就可以通过对硬盘的读取来恢复:

常见的硬盘格式有如下

1. FAT32 (File Allocation Table 32)

  • 特点: 兼容性强,几乎所有操作系统都支持。
  • 文件大小限制: 最大文件大小为 4 GB。
  • 分区大小限制: 最大分区大小为 8 TB。

2. NTFS (New Technology File System)

  • 特点: 主要用于 Windows 系统,支持文件权限、加密和压缩。
  • 文件大小限制: 理论上最大为 16 TB。
  • 分区大小限制: 最大分区大小为 256 TB。

3. exFAT (Extended File Allocation Table)

  • 特点: 适用于闪存和移动设备,兼容性比 FAT32 更强,但不支持文件权限。
  • 文件大小限制: 最大文件大小为 16 EB(Exabytes)。
  • 分区大小限制: 最大分区大小为 128 PB(Petabytes)。

4. HFS+ (Hierarchical File System Plus)

  • 特点: 苹果系统常用格式,支持文件权限和元数据。
  • 文件大小限制: 最大文件大小为 8 EB。
  • 分区大小限制: 最大分区大小为 8 EB。

5. APFS (Apple File System)

  • 特点: 苹果最新的文件系统,优化了 SSD 的性能,支持加密和快照。
  • 文件大小限制: 理论上最大为 8 EB。
  • 分区大小限制: 最大分区大小为 8 EB。

6. EXT4 (Fourth Extended File System)

  • 特点: Linux 系统常用格式,支持日志功能,性能优越。
  • 文件大小限制: 最大文件大小为 16 TB。
  • 分区大小限制: 最大分区大小为 1 EB。

7. Btrfs (B-tree File System)

  • 特点: 现代 Linux 文件系统,支持快照、压缩和动态分配。
  • 文件大小限制: 最大文件大小为 16 EB。
  • 分区大小限制: 最大分区大小为 16 EB。

8. XFS

  • 特点: 高性能的文件系统,特别适合处理大文件和高并发。
  • 文件大小限制: 最大文件大小为 8 EB。
  • 分区大小限制: 最大分区大小为 8 EB。

FAT32 格式: 

常见的格式为FAT32,下面我们先了解下具体的FAT32硬盘存储格式,首先我们可以使用工具winhex对硬盘进行分析

https://www.x-ways.net/winhex/index-m.html

硬盘格式分析的比较枯燥,其中大部分都是网上找到的内容,初级恢复不用精通了解即可,但是涉及到数据分散存储就需要了解具体的存储链,才能恢复,主要就是算偏移: 

0x00 0x20:                                                    每扇区字节数,512(0X02 00)。 

0x08:                                                              最小单元(簇)为0x08(8)扇区,8*512=4K

0x46 0xCC 0xEC 0x00:文件系统总的扇区数:15518790    15518790*512=7.39G

0x02 0x00 0x00 0x00:  根目录所在第一个簇的簇号,通常情况下,根目录簇号为2

0x46 0x41 0x54 0x33 0x32 0x20 0x20 0x20:文件系统格式 FAT32

FSInfo信息分区 2号分区

【4】0x1E8~0x1EB: 4个字节,文件系统的空簇数,964466(0x00 0E B7 72)。 

【5】0x1EC~0x1EF: 4个字节,下一可用簇号(0x 00 00 00 15)。

【7】0x1FE~0x1FF: 2个字节,“55 AA”标志。 结束

文件系统分配磁盘空间按簇来分配。因此,文件占有磁盘空间时,基本单位不是字节而是簇,即使某个文件只有一个字节,操作系统也会给它分配一个最小单元:即一个簇。对于大文件,需要分配多个簇。同一个文件的数据并不一定完整地存放在磁盘中一个连续地区域内,而往往会分若干段,像链子一样存放。这种存储方式称为文件的链式存储。为了实现文件的链式存储,文件系统必须准确地记录哪些簇已经被文件占用,还必须为每个已经占用的簇指明存储后继的下一个簇的簇号,对于文件的最后一簇,则要指明本簇无后继簇。这些都是由FAT表来保存的,FAT 表对应表项中记录着它所代表的簇的有关信息:诸如是空,是不是坏簇,是否是已经是某个文件的尾簇等。 

【6号表项】:0x07  表项值为7,即指向下一个表项, 2号簇为根目录,对应的开始扇区为32768, 6号簇。开始的扇区为 32768 + 8 * (6-2)= 32800, 即为build.log的开始扇区。

【7号表项】:0x08  表项值为8,即指向下一个表项。

【8号表项】: 0x0FFFFFFF, 结束簇, 从6号簇build.log开始,到8号簇,文件结束。

数据区

数据提取

我们需要了解具体的硬盘格式,我们还需要知道磁盘是如何存储的,如果一个文件的大小是预先判定的固定大小,且后续不会增加,一盘会分配一个连续的空间给该文件存储,这种情况下我们就可以对磁盘内容遍历来恢复数据,但是如果文件内容会随着时间增加而越来越大,如果一个连续的空间无法存储完成这些数据,就会有一个存储链来记录下一个存储区块,所以正常情况下,我们首先需要进行初步数据提取,将需要提取的文件格式进行整理,然后将磁盘中的所有此类文件进行提取,这样可以获得一个非常完整的列表,然后找到自己需要处理的文件,查看是否能成功运行,如果不能运行,就要去看是否是因为存储块不是连续存储,需要根据存储链进行提取合并数据。

初步数据提取首先我们可以对数据进行备份,防止因为恢复数据导致的数据修改,并且可以分段存储,比较方便:

分段存储完毕后,可以去查找自己需要恢复文件的文件格式,我这里恢复视频格式为例子,我找到了大部分的视频格式的前缀:

  1. MP4 (MPEG-4 Part 14):
    1. 十六进制: 00 00 00 20 66 74 79 70 69 73 6F 6D
    2. 字符串: ftypisom
  2. AVI (Audio Video Interleave)
    1. 十六进制: 52 49 46 46 XX XX XX XX 41 56 49 20
    2. 字符串: RIFF...AVI 
  3. MKV (Matroska)
    1. 十六进制: 1A 45 DF A3
    2. 字符串: Matroska
  4. WMV (Windows Media Video)
    1. 十六进制: 30 26 B2 75 B5 A2 00 00
    2. 字符串: .wmv
  5. FLV (Flash Video)
    1. 十六进制: 46 4C 56 01
    2. 字符串: FLV
  6. MOV (QuickTime)
    1. 十六进制: 00 00 00 20 66 74 79 70 71 74 20 20
    2. 字符串: ftypqt  
  7. WebM
    1. 十六进制: 1A 45 DF A3
    2. 字符串: Matroska (与 MKV 相同)
  8. 3GP (3rd Generation Partnership Project)
    1. 十六进制: 00 00 00 20 66 74 79 70 33 67 70 35
    2. 字符串: ftyp3gp5
  9. MPEG (MPEG Video)
    1. 十六进制: 00 00 01 BA
    2. 字符串: MPEG
  10. OGG (Ogg)
    1. 十六进制: 4F 67 67 53
    2. 字符串: OggS 

第一种方案,我可以使用工具进行提取,这里使用 FFmpeg 等工具可以有效识别和提取大型文件中的视频流

https://ffmpeg.org/download.html

命令 

ffmpeg -i yourfile.ext

 如果您识别了视频流(例如,流编号为 0),可以使用以下命令提取视频:

ffmpeg -i yourfile.ext -map 0:0 -c copy output_video.mp4

 或者可以使用ffmpeg进行批量提取:

import subprocess
import re

def get_video_stream_count(input_file):
    # 获取视频流的数量
    command = ['ffmpeg', '-i', input_file]
    result = subprocess.run(command, stderr=subprocess.PIPE, text=True)
    
    # 使用正则表达式查找视频流数量
    match = re.findall(r'Stream #(\d+:\d+)', result.stderr)
    return len(match)

def extract_video(input_file, output_file_prefix):
    stream_count = get_video_stream_count(input_file)
    
    for stream_index in range(stream_count):
        output_file = f"{output_file_prefix}_stream{stream_index}.mp4"
        command = [
            'ffmpeg', 
            '-i', input_file, 
            '-map', f'0:{stream_index}', 
            '-c', 'copy', 
            output_file
        ]
        print(f"Extracting stream {stream_index} to {output_file}...")
        subprocess.run(command)

# 示例用法
input_file = 'yourfile.ext'  # 输入文件
output_file_prefix = 'output_video'  # 输出文件前缀

extract_video(input_file, output_file_prefix)

或者可以自行编写代码对指定格式文件通过前缀进行提取,需要注意的就是文件大小,还需要根据对应的文件协议,获取到对应的文件大小,并进行截取,不过是否截取问题也不大,并不会影响文件正常的使用,只是大小会有区别。

这样全盘扫描的方式来定向恢复,我们可以恢复出磁盘中的所有该文件格式的数据,下面就是需要找到自己需要的文件,查看其文件是否提取完整,如果不完整,就需要去查看存储链,根据存储链地址获取数据进行拼接即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2163757.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Chrome截取网页全屏

1.使用Chrome开发者工具 Chrome自带的开发者工具,可以进行网页整页截图, 首先打开你想截图的网页, 然后按下 F12,调出开发者工具, 接着按Ctrl Shift P。 紧接着输入指令 capture, 它会提示有三个选项,如…

应用层 IV(万维网WWW)【★★】

(★★)代表非常重要的知识点,(★)代表重要的知识点。 一、WWW 的概念与组成结构 1. 万维网的概念 万维网 WWW(World Wide Web)并非某种特殊的计算机网络。万维网是一个大规模的、联机式的信息…

echarts y轴滚动(react版本)

目录 效果图如下,代码见下方 代码可以直接复制,图片和css也要复制 tsx代码 css代码 代码里用到的图片,可以换成自己项目的图 效果图如下,代码见下方 代码可以直接复制,图片和css也要复制 tsx代码 import React,…

Leetcode 1396. 设计地铁系统

1.题目基本信息 1.1.题目描述 地铁系统跟踪不同车站之间的乘客出行时间,并使用这一数据来计算从一站到另一站的平均时间。 实现 UndergroundSystem 类: void checkIn(int id, string stationName, int t) 通行卡 ID 等于 id 的乘客,在时间…

自动化测试常用函数:元素定位、操作与窗口管理

目录 一、元素的定位 1. cssSelector 2. xpath 2.1 获取HTML页面所有的节点 2.2 获取HTML页面指定的节点 2.3 获取一个节点中的直接子节点 2.4 获取一个节点的父节点 2.5 实现节点属性的匹配 2.6 使用指定索引的方式获取对应的节点内容 二、操作测试对象 1. 点击/提交…

多个ECU测试方案-IP地址相同-DoIP刷新-环境测试耐久测试

情况1:只有一个ECU进行测试 - 接口模块只需要使用一个车载以太网转换器; 情况2:多ECU同时测试,但ECU IP地址不一样,上位机多个网口 - 上位机测试软件,需要通过PC的不同网卡,访问各个ECU&#…

基于 RealSense D435相机实现手部姿态检测

基于 RealSense D435i相机进行手部姿态检测,其中采用 Mediapipe 进行手部检测,以下是详细步骤: Mediapipe 是一个由 Google开发的开源框架,专门用于构建多媒体处理管道,特别是计算机视觉和机器学习任务。它提供了一系列…

第68期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大语言模型(LLM)等安全领域应用的知识。在这里,您可以找…

【YashanDB知识库】如何配置jdbc驱动使getDatabaseProductName()返回Oracle

本文转自YashanDB官网,具体内容请见https://www.yashandb.com/newsinfo/7352676.html?templateId1718516 问题现象 某些三方件,例如 工作流引擎activiti,暂未适配yashandb,使用中会出现如下异常: 问题的风险及影响 …

【YashanDB知识库】查询YashanDB表空间使用率

本文转自YashanDB官网,具体内容请见https://www.yashandb.com/newsinfo/7369203.html?templateId1718516 【问题分类】功能使用 【关键字】表空间,使用率 【问题描述】YashanDB使用过程中,如何查询表空间的使用率 【问题原因分析】需要查…

NTPD使用/etc/ntp.conf配置时钟同步详解

NTPD使用/etc/ntp.conf配置时钟同步详解 引言安装NTPD配置/etc/ntp.conf1. 权限控制(restrict)2. 指定上层NTP服务器(server)3. 本地时间服务器(可选)启动NTPD服务验证时间同步ntpd服务默认多长时间同步一次ntp.conf上如何配置同步的频率和间隔配置步骤注意事项结论引言 …

虚拟数据架构能否取代传统数据架构?

虚拟数据架构能否取代传统数据架构? 前言虚拟数据架构能否取代传统数据架构 前言 数据虚拟化能够将分散在不同地方的数据整合起来,形成一个统一的视图,让数据同学能够更轻松地访问和分析这些数据。就像是把一堆杂乱无章的拼图碎片拼成了一幅…

从前端到全栈,你只差这款神器!

作为一名前端开发者,你是否也遇到过这样的困扰:界面做好了,功能完成了一半,却因为没有后端支持而卡住了进度?想自己搭建服务器,发现耗时耗力,学习曲线陡峭,最后项目拖延、效率大打折…

瑞芯微RK3566鸿蒙开发板Android11修改第三方输入法为默认输入法

本文适用于触觉智能所有支持Android11系统的开发板修改第三方输入法为默认输入法。本次使用的是触觉智能的Purple Pi OH鸿蒙开源主板,搭载了瑞芯微RK3566芯片,类树莓派设计,是Laval官方社区主荐的一款鸿蒙开发主板。 一、安装输入法并查看输入…

mysql如何快速编写单表查询语句

目录 背景生成sql语句 背景 我们在编写查询语句的时候,都提倡需要用到哪些字段就查哪些字段,这样有两个好处:1、可以增加程序运行效率,2、可以避免无关字段被暴露。那我们一个字段一个字段写就比较烦,有没有方法快速生…

优化 Go 语言数据打包:性能基准测试与分析

场景:在局域网内,需要将多个机器网卡上抓到的数据包同步到一个机器上。 原有方案:tcpdump -w 写入文件,然后定时调用 rsync 进行同步。 改造方案:使用 Go 重写这个抓包逻辑及同步逻辑,直接将抓到的包通过网…

udig处理 shape地图中 数据显示

比如城市的名称的显示 udig新建project 新建Map 然后添加shape 修改 attribute 中文 为英文 没啥用,改不了 这里Label 勾选下,选择 市 拷贝XML 到geoserver style里面 参考 geoserver发布shp地图-CSDN博客

排序算法Java实现

文章目录 排序算法概述比较排序算法非比较排序算法稳定 vs 不稳定Java 中的排序 外部排序1) 冒泡排序2) 选择排序3) 堆排序4) 插入排序5) 希尔排序6) 归并排序递归实现时间复杂度非递归实现 7) 归并插入8) 快速排序随机基准点处理重复值 9) 计数排序10) 桶排序11) 基数排序 排序…

javaseday31多线程

什么是多线程 线程与进程 小结 并发和并行 并发 并行 小结 多线程的实现方式 方法一 public class Demo1 {public static void main(String[] args) {//使用多线程的第一种方法/*** 1、创建一个类继承Thread类* 2、并重写run方法* 3、创建子类对象,并启动线程*/M…

深度知识追踪(论文复现)

深度知识追踪(论文复现) 本文所涉及所有资源均在传知代码平台可获取 文章目录 深度知识追踪(论文复现)论文概述论文方法实验部分数据集实验步骤step1:安装环境依赖step2:下载数据集,将其变成one-hot编码step3:进行训练…