在Linux中使用幻数

本文旨在介绍幻数和文件头,如何基于幻数提取文件,以及如何在Linux环境中损坏和修复基于幻数的文件。

null

幻数

幻数是特定文件类型所特有的文件的前几个字节。这些唯一的位被称为幻数,有时也被称为文件签名。

系统可以使用这些字节来“ 区分并识别不同的文件 “没有文件扩展名。

在文件签名中查找幻数

大多数文件在文件开头的字节中都有签名,但有些文件系统甚至可能在文件开头以外的偏移处有文件签名。例如,文件系统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
    

这将产生以下输出:-

图片[1]-在Linux中使用幻数-yiteyi-C++库

在这张图中,我们看到文件的第一组字节是

89 50 4e 47 0d 0a 1a 0a 
// magic number of PNG file

这些数字有助于系统识别正在使用的文件类型。有些文件不是用扩展名写的,可以通过这些神奇的数字来识别。

一个例子 压缩文件 ,类似地,对zip文件使用上述命令。

xxd test.zip | head

图片[2]-在Linux中使用幻数-yiteyi-C++库

在上图中,我们可以看到文件的开头是:

 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码), 我们将获得以下输出: 图片[3]-在Linux中使用幻数-yiteyi-C++库

在这张图片中,我们可以看到zip文件的魔法数字是以png的十六进制表示的,这意味着我们已经成功地将zip文件的十六进制附加到png文件的十六进制。下一步是将此zip文件与png分开。 有一个简单的实用程序“binwalk”,可以通过键入以下内容帮助我们轻松完成此任务:

binwalk -e output.png
-e stands for extract

如何使用幻数和偏移量从输出中提取zip文件:

  1. 查找要提取的文件的起始偏移量: 在本例中,我们希望从PNG中提取zip文件。所以我们首先寻找拉链头。如上图所示,我们执行命令“xxd输出”。png | grep“PK”。在这张图片中,我们看到了左列的偏移量。对于zip文件,偏移量将为00001c90。
  2. 从文件头开始的偏移量计算位数: 我们现在必须计算zip文件开始的偏移量的位数。我们可以手动计数并观察它为00001c95(每个十六进制值对应1位)
  3. 将此十六进制值转换为十进制: 这可以通过打开python IDLE(在Linux终端中键入“python”)来实现。我们现在必须将该值转换为十进制。在python IDLE中,我们只需在上一步中找到的值的开头添加0x即可。
  4. 使用以下命令:
    'dd if=*input file* bs=1 skip=*value
    calculated in step 3* of=*output file name*'

    在上述命令中,“if”表示输入文件,“skip”表示必须跳过才能到达我们希望提取的文件开头的位数,“bs”表示一次必须读取的字节数,“of”表示输出文件名。 请参阅下图,了解步骤3和4的用法: 图片[4]-在Linux中使用幻数-yiteyi-C++库

  5. 文件提取:我们现在可以从终端打开当前工作目录,通过键入以下内容查看提取的zip文件:
    nautilus ./
    

如何通过更改文件的魔法编号来损坏文件?

更改文件的神奇数字会使文件变得无用。每当我们试图打开一个头部扭曲的文件时,就会显示一个错误。

  1. 下载十六进制编辑器 :要损坏文件,我们需要一个十六进制编辑器。hexedit是一个很受欢迎的工具。您可以使用以下方式进行安装:
    sudo apt-get install hexedit
    

    你可以通过键入来打开文件

    hexedit image.png
    

    您将看到如下输出:

    Hex of a file using hexedit

  2. 更改文件: 要使用hexedit更改一个字节,只需将光标移动到一个字节上,然后键入所需内容。为了这篇文章,我将从 8950对00。 要保存并退出,请按ctrl-X,然后按Y。

Corrupted Magic Number

在上图中,我们看到前2个字节已更改为00,在右侧,我们可以看到文本已从 .PNG至。。NG

如何修复具有损坏的幻数的文件?

让我们使用上图中的例子,我破坏了PNG的前两个字节。如果你现在试图打开PNG,它会给你一个错误,说“无法加载文件”,而不是“PNG”。这证明了系统在打开文件之前会查看幻数。知道PNG幻数以8950开头,我们可以将字节更改回其原始值。 让我们看另一个例子,使用jpeg图像。 让我们先看看一个工作的jpeg十六进制是什么样子:

jpeg magic numbers

原始的幻数字节是

FF D8 FF E0

带有损坏魔法字节的JPEG如下所示:

Corrupted JPG

我们注意到其中的魔法字节是

EE A8 CC 00

因此,如果您试图打开jpg文件,它将不会打开。我们得到这个错误:

Picture error

JPG文件通常具有神奇的数字“FFD8 DDE0”、“FFD8 FFDB”或“FFD8 FFE1”。 有了这些知识,我们所要做的就是尝试将这些组合作为文件的标题。这样做需要与文件损坏相同的过程。

    1. 打开hexedit
    2. 通过将光标悬停并输入所需的值来更改前几个字节
    3. 保存(Ctrl-X)并退出
    4. 尝试打开文件。如果文件未打开,请使用下一个可能的幻数重复步骤

将magic bytes更改为FFD8 FFE0时,图片会正确打开。

本文由 迪帕克·斯里瓦察夫 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 贡献极客。组织 或者把你的文章寄到contribute@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。

如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享