找出字节内容

时间:2018-11-13 19:27:17

标签: stream byte mp3

我正在处理包含多个流的复合文件。我很沮丧如何弄清楚每个流的内容。我不知道这些字节是文本还是mp3或视频。 例如:有没有一种方法可以理解这些字节可以是什么类型的数据?

(&(objectClass=user)
    (memberof:1.2.840.113556.1.4.1941:=CN=GroupOne,OU=Security Groups,OU=Groups,DC=YOURDOMAIN,DC=NET)

1 个答案:

答案 0 :(得分:1)

是的,可以找出每个流的内容。除扩展名外,此星球上的每个文件都有签名,这是不可靠的。它可能会被删除或错误添加。

那么signature是什么?

  

在计算中,文件签名是用于识别或验证   文件内容。特别是,它可能指的是:

     
      
  • File magic number:文件中的字节,用于标识   文件格式;通常是一小段字节(大多数是   2-4个字节长)放在文件的开头;查看file signatures

  • 的列表   
  • File checksum或更普遍地说,是对文件内容使用散列函数的结果:用于验证文件完整性的数据   内容,通常针对传输错误或恶意攻击。   签名可以包含在文件末尾,也可以包含在单独的位置   文件。

  •   

我用magic number定义了我要从Wikipedia复制的幻数项

  

computer programming中,魔术数字一词有多个   意义。它可能涉及以下一项或多项:

     
      
  • 具有无法解释的含义或多次出现的唯一值,可以(最好)用命名常量代替
  •   
  • 用于标识file format或协议的常数数字或文本值;有关文件,请参见List of file signatures
  •   
  • 不太可能会误认为其他含义的独特唯一值(例如Globally Unique Identifiers
  •   

在第二点,它是一定的字节序列,例如

PNG (89 50 4E 47 0D 0A 1A 0A) 

BMP (42 4D)

所以如何知道每个文件的幻数?

在本文“ Investigating File Signatures Using PowerShell”中,我们发现作者创建了一个很棒的Power Shell函数来获取幻数,他还提到了一个工具,我正在从他的文章中复制它

  

PowerShell V5引入了 Format-Hex ,它可以提供一种替代方法   读取文件并显示十六进制和ASCII值的方法   确定魔术数字。

Format-Hex表格有帮助,我正在复制此说明

  

Format-Hex cmdlet将文件或其他输入显示为十六进制   价值观。要确定字符与输出的偏移量,请添加   该行最左边的数字到该行顶部的数字   该字符的列。

     

此cmdlet可以帮助您确定损坏的文件的文件类型   或可能没有文件扩展名的文件。运行此cmdlet,   然后检查结果中的文件信息。

此工具也非常有用,可以获取文件的幻数。这是一个例子 enter image description here

另一种工具是online hex editor,但起初我不知道如何使用它。

现在我们得到了魔幻数字,但是如何知道什么类型的数据,或者该文件或流是什么?  这是最好的问题。 幸运的是,这些魔幻数字有很多数据库。让我列出一些

  1. File Signatures
  2. FILE SIGNATURES TABLE
  3. List of file signatures

例如,第一个数据库具有搜索功能。只需输入没有空格的魔术数字并搜索

enter image description here

找到之后。是的,可以。您很有可能不会直接找到有问题的文件类型。

我面对了这个问题,并通过针对特定类型的签名测试流来解决了它。就像我在流中搜索的PNG一样

def GetPngStartingOffset(arr):

    #targted magic Number for png (89 50 4E 47 0D 0A 1A 0A)
    markerFound = False
    startingOffset = 0
    previousValue = 0
    arraylength = range(0, len(arr) -1) 

    for i in arraylength:
        currentValue = arr[i]
        if (currentValue == 137):   # 0x89  
            markerFound = True
            startingOffset = i
            previousValue = currentValue
            continue

        if currentValue == 80:  # 0x50
            if (markerFound and (previousValue == 137)):
                previousValue = currentValue
                continue
            markerFound = False

        elif currentValue == 78:   # 0x4E
            if (markerFound and (previousValue == 80)):
                previousValue = currentValue
                continue
            markerFound = False

        elif currentValue == 71:   # 0x47
            if (markerFound and (previousValue == 78)):
                previousValue = currentValue
                continue
            markerFound = False

        elif currentValue == 13:   # 0x0D
            if (markerFound and (previousValue == 71)):
                previousValue = currentValue
                continue
            markerFound = False

        elif currentValue == 10:   # 0x0A
            if (markerFound and (previousValue == 26)):
                return startingOffset
            if (markerFound and (previousValue == 13)):
                previousValue = currentValue
                continue
            markerFound = False

        elif currentValue == 26:   # 0x1A
            if (markerFound and (previousValue == 10)):
                previousValue = currentValue
                continue
            markerFound = False
    return 0

此功能找到魔数 enter image description here

我拆分了流并保存了png文件

    arr = stream.read()
    a = list(arr)
    B = a[GetPngStartingOffset(a):len(a)]
    bytesString = bytes(B)
    image = Image.open(io.BytesIO(bytesString))
    image.show()

最后,这不是端到端解决方案,而是一种确定流内容的方法 感谢您的阅读,也感谢@Robert Columbia的耐心