本文旨在介绍幻数和文件头,如何基于幻数提取文件,以及如何在Linux环境中损坏和修复基于幻数的文件。
幻数
幻数是特定文件类型所特有的文件的前几个字节。这些唯一的位被称为幻数,有时也被称为文件签名。
系统可以使用这些字节来“ 区分并识别不同的文件 “没有文件扩展名。
在文件签名中查找幻数
大多数文件在文件开头的字节中都有签名,但有些文件系统甚至可能在文件开头以外的偏移处有文件签名。例如,文件系统ext2/ext3在第1080位和第1081位有字节0x53和0xEF。
- 但是,有些文件没有幻数,例如纯文本文件,但可以通过检查字符集(文本文件为ASCII)来识别。 这可以通过使用以下命令来完成:
file -i *name_of_file*
- 魔术数字/文件签名通常对用户不可见,但可以通过使用十六进制编辑器或使用下面提到的“xxd”命令来查看。这些字节对于打开文件至关重要。
- 更改/破坏这些字节将使文件无用,因为大多数工具由于潜在的破坏性而无法访问这些文件。
- Linux reader中的file命令读取文件的幻数,并根据幻数显示文件类型。
- 例如,让我们以PNG文件为例。我们可以通过在Linux终端(本文使用的是kali Linux)中键入以下命令来查看文件的十六进制。这个命令创建我们传递给它的文件的hextump。
xxd image.png | head
这将产生以下输出:-
在这张图中,我们看到文件的第一组字节是
89 50 4e 47 0d 0a 1a 0a // magic number of PNG file
这些数字有助于系统识别正在使用的文件类型。有些文件不是用扩展名写的,可以通过这些神奇的数字来识别。
一个例子 压缩文件 ,类似地,对zip文件使用上述命令。
xxd test.zip | head
在上图中,我们可以看到文件的开头是:
50 4b 03 04 // magic number of zip file
将一个文件附加到另一个文件,并用幻数标识分区
我们可以使用python来执行这个操作。基本上,我们将读取两个文件的字节,然后将它们逐个写入另一个空文件。在本文中,我们将结合PNG和Zip文件。
""" The first two lines open the two files to be read byte by byte The third line opens an output file to be written to byte by byte """ input_file_1 = open ( "image.png" , 'rb' ).read() input_file_2 = open ( "test.zip" , 'rb' ).read() output_file = open ( "output.png" , 'wb' ) output_file.write(input_file_1) output_file.write(input_file_2) |
使用这段python代码,我们获得了一个文件输出。巴布亚新几内亚。在运行命令时:
xxd output.png | head
在这个文件中,我们注意到它以相同的8950 4e47 0d0a 1a0a十六进制开头。但是,如果我们运行命令
xxd output.png | grep "PK"
它将在十六进制中搜索zip文件的神奇数字(PK相当于50 4b的ASCII码), 我们将获得以下输出:
在这张图片中,我们可以看到zip文件的魔法数字是以png的十六进制表示的,这意味着我们已经成功地将zip文件的十六进制附加到png文件的十六进制。下一步是将此zip文件与png分开。 有一个简单的实用程序“binwalk”,可以通过键入以下内容帮助我们轻松完成此任务:
binwalk -e output.png -e stands for extract
如何使用幻数和偏移量从输出中提取zip文件:
- 查找要提取的文件的起始偏移量: 在本例中,我们希望从PNG中提取zip文件。所以我们首先寻找拉链头。如上图所示,我们执行命令“xxd输出”。png | grep“PK”。在这张图片中,我们看到了左列的偏移量。对于zip文件,偏移量将为00001c90。
- 从文件头开始的偏移量计算位数: 我们现在必须计算zip文件开始的偏移量的位数。我们可以手动计数并观察它为00001c95(每个十六进制值对应1位)
- 将此十六进制值转换为十进制: 这可以通过打开python IDLE(在Linux终端中键入“python”)来实现。我们现在必须将该值转换为十进制。在python IDLE中,我们只需在上一步中找到的值的开头添加0x即可。
- 使用以下命令:
'dd if=*input file* bs=1 skip=*value calculated in step 3* of=*output file name*'
在上述命令中,“if”表示输入文件,“skip”表示必须跳过才能到达我们希望提取的文件开头的位数,“bs”表示一次必须读取的字节数,“of”表示输出文件名。 请参阅下图,了解步骤3和4的用法:
- 文件提取:我们现在可以从终端打开当前工作目录,通过键入以下内容查看提取的zip文件:
nautilus ./
如何通过更改文件的魔法编号来损坏文件?
更改文件的神奇数字会使文件变得无用。每当我们试图打开一个头部扭曲的文件时,就会显示一个错误。
- 下载十六进制编辑器 :要损坏文件,我们需要一个十六进制编辑器。hexedit是一个很受欢迎的工具。您可以使用以下方式进行安装:
sudo apt-get install hexedit
你可以通过键入来打开文件
hexedit image.png
您将看到如下输出:
- 更改文件: 要使用hexedit更改一个字节,只需将光标移动到一个字节上,然后键入所需内容。为了这篇文章,我将从 8950对00。 要保存并退出,请按ctrl-X,然后按Y。
在上图中,我们看到前2个字节已更改为00,在右侧,我们可以看到文本已从 .PNG至。。NG
如何修复具有损坏的幻数的文件?
让我们使用上图中的例子,我破坏了PNG的前两个字节。如果你现在试图打开PNG,它会给你一个错误,说“无法加载文件”,而不是“PNG”。这证明了系统在打开文件之前会查看幻数。知道PNG幻数以8950开头,我们可以将字节更改回其原始值。 让我们看另一个例子,使用jpeg图像。 让我们先看看一个工作的jpeg十六进制是什么样子:
原始的幻数字节是
FF D8 FF E0
带有损坏魔法字节的JPEG如下所示:
我们注意到其中的魔法字节是
EE A8 CC 00
因此,如果您试图打开jpg文件,它将不会打开。我们得到这个错误:
JPG文件通常具有神奇的数字“FFD8 DDE0”、“FFD8 FFDB”或“FFD8 FFE1”。 有了这些知识,我们所要做的就是尝试将这些组合作为文件的标题。这样做需要与文件损坏相同的过程。
- 打开hexedit
- 通过将光标悬停并输入所需的值来更改前几个字节
- 保存(Ctrl-X)并退出
- 尝试打开文件。如果文件未打开,请使用下一个可能的幻数重复步骤
将magic bytes更改为FFD8 FFE0时,图片会正确打开。
本文由 迪帕克·斯里瓦察夫 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 贡献极客。组织 或者把你的文章寄到contribute@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。
如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。