用Scalpel紧急找回丢失的文件

译文
系统 Linux
备份失败且文件丢失时,应采取紧急措施。可用Scalpel深入丢失的分区并恢复丢失的文件。

[[270836]]

【51CTO.com快译】系统管理员的部分职责是帮助用户管理数据。这么做的一个重要方面是,确保贵公司有良好的备份计划,用户定期备份,或者使定期备份实现自动化。

然而糟糕的情况时而会发生。文件误删除,文件系统损坏或分区丢失,无论出于何种原因,备份都未含有你需要的内容。

在试图恢复丢失的数据之前,你得先查明数据丢失的原因。用户可能只是放错了文件,或者用户不知道有备份。但如果用户确实删除了没有备份的文件,你就需要恢复删除的文件。不过如果分区表被打乱了,文件其实根本没有丢失,你可能需要考虑用TestDisk(https://www.redhat.com/sysadmin/recover-partition-files-testdisk)来恢复分区表或分区本身。

如果文件或分区恢复不成功,或只恢复了一部分,该如何是好?这时候Scalpel(https://github.com/sleuthkit/scalpel)出场了。 Scalpel基于描述独特文件类型的模式来执行文件雕复(file carving)。它基于二进制字符串和正则表达式查找这些模式,然后相应提取文件。

该工具目前未加以维护,但向来可靠,编译和运行起来完全符合预期。如果你运行Red Hat Enterprise Linux(RHEL)7、RHEL 8或Fedora,可以从klaatu.fedorapeople.org下载Scalpel的RPM安装程序及依赖项libtre。

Scalpel入手

Scalpel捆绑有全面的文件类型及独特的识别功能。有时,可以通过头尾部的可预测文本来识别文件:

  1. htm n 50000 

而有时需要神秘的十六进制代码:

  1. jpg y 200000000 \xff\xd8\xff\xe0\x00\x10 \xff\xd9 

Scalpel要求你复制/etc/scalpel.conf,编辑副本以添加希望恢复的文件类型,将不需要的文件类型排除在外。比如,如果你知道没有或不关心.fws文件,就在文件中将该行注释掉。这么做可以加快恢复过程并减少误报。

在配置文件中,文件定义的格式从左到右如下:

  • 文件扩展名。
  • 头尾部是不是区分大小写(y或n)。
  • 希望Scalpel找到的最小和***的文件。
  • 识别文件开始的标准头部。
  • 识别文件结束的标准尾部。

footer字段是可选的。如果未提供footer,Scalpel提取你设为文件类型***值的字节数。

你可能发现恢复工作只抢救了文件的一部分,比如这个主体恢复的JPG:

图1. 不完整的JPG文件

此结果意味着你可能需要增加文件的边界***值,然后重新扫描,以便文件的末尾也能恢复:

图2. 修复后的JPG文件

定义新文件类型

首先拷贝Scalpel配置文件。如果你的所有用户生成类似的数据,整个公司可能只需要一个配置文件。或者,每个部门都有一个配置文件可能更好。

要将自己的文件类型添加到Scalpel配置,先做一番调查取证分析。

若是文本文件,***有某种可预测的结构。比如说,XML文件可能以

  1. $ head --bytes 8 example.xcf | hexdump --canonical  
  2. 00000000 67 69 6d 70 20 78 63 66 |gimp xcf|  
  3. 00000008 

此输出来自Red Hat Enterprise Linux 8系统。在较旧系统上,可能需要较旧的语法:

  1. $ head --bytes 8 example.xcf | hexdump -C  
  2. 00000000 67 69 6d 70 20 78 63 66 |gimp xcf|  
  3. 00000008 

hexdump的标准输出在最左列显示地址,在最右边显示解码值。中间列显示的是XCF文件***行的前8个字节的十六进制字节。

/etc/scalpel.conf中的大多数二进制文件看起来与该输出很相似,只是这些值以\ x换码序列开头,表示这些数字实际上是十六进制数字。比如说,JPG文件在配置文件中看起来这样:

  1. jpg y 200000000 \xff\xd8\xff\xe0\x00\x10 \xff\xd9 

将该值与你的系统上任何JPG文件的前6个字节的测试十六进制值(因为这是scalpel.conf在其JPG定义中包含的字节数)进行比较:

  1. $ head --bytes 6 example.jpg | | hexdump --canonical  
  2. 00000000 ff d8 ff e0 00 10 |......|  
  3. 00000006 

将尾部与***2个字节进行比较以匹配配置文件显示的内容:

  1. $ tail --bytes -2 example.jpg | hexdump --canonical  
  2. 00000000 ff d9 |..|  
  3. 00000002 

这些值匹配,因此你可以确信有效的JPG文件可能都以可预测的顺序开始和结束。

注意:scalpel.conf文件中的Ogg条目具有误导性,因为它没有\ x换码序列。如果你需要恢复Ogg文件,请解决此问题或替换其定义。

开始动手

现在,为你需要恢复的所有文件(比如前面例子中的XCF)获得同样的信心级别。重申一下,这是你定义问题驱动器常见的二进制文件类型的工作流程:

1. 使用head -bytes n命令,获取文件类型的前几个字节的十六进制值。

2. 使用tail --bytes -n命令,获取***几个字节。

3. 对几个相同类型的不同文件重复此过程,以确认此模式的一致性,根据需要调整头部和尾部模式的长度。

4. 在自定义Scalpel配置中输入头部值和尾部值,使用\ x表示法将每个字节标识为十六进制字符。

针对需要恢复的每个重要的二进制文件类型,按此顺序操作。

如果文件是纯文本,提供通用头部和尾部,比如代表shell脚本的#!/bin/sh、代表带有h1级标题的标记文件的#(#后面的空格很重要)、代表XML文件的

准备好运行Scalpel时,创建一个可以放置已抢救文件的目录:

  1. $ mkdir /run/media/seth/rescuer/scalped 

注意:请勿在含有丢失数据的同一个卷上创建此目录。

如果问题驱动器尚未挂载,请挂载,然后运行Scalpel:

  1. $ scalpel -c my-scalpel.conf \  
  2. -o /run/media/seth/rescuer/scalped \  
  3. /run/media/seth/victim 

还可以在磁盘映像上运行Scalpel:

  1. $ scalpel -c my-scalpel.conf \  
  2. -o ~/scalped ~/victim.img 

Scalpel运行完毕后,请在指定的抢救目录中查看文件。

总之,***进行备份,那样可以避免文件恢复。但万一发生最坏的情况,不妨试试Scalpel、慎重雕复。

原文标题:Find lost files with Scalpel,作者:Seth Kenlon

【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】

责任编辑:庞桂玉 来源: 51CTO
相关推荐

2018-12-07 09:50:41

回收站WindowsWindows 10

2010-07-26 10:04:43

SQL Server

2013-08-05 16:10:20

2009-05-23 10:59:44

2022-10-11 23:14:39

模态循环过滤器代码

2018-11-07 16:01:57

安卓

2017-10-16 13:23:18

手机信息iphone

2009-02-03 17:48:00

服务器数据存储

2010-04-30 18:25:25

Unix删除

2011-08-31 10:06:10

Windows7回收站

2021-08-05 07:03:44

Windows 11操作系统微软

2023-10-10 18:16:30

2015-07-08 13:19:42

APM云智慧

2011-07-20 13:07:30

Windows 7恢复

2013-06-28 14:00:28

Android

2010-04-30 18:32:52

Unix删除

2009-12-22 15:38:22

2010-10-29 13:55:48

Oracle日志文件

2010-07-20 15:01:39

SQLServer日志

2011-03-22 16:20:19

恢复数据库
点赞
收藏

51CTO技术栈公众号