我正在处理包含多个流的复合文件。我很沮丧如何弄清楚每个流的内容。我不知道这些字节是文本还是mp3或视频。 例如:有没有一种方法可以理解这些字节可以是什么类型的数据?
(&(objectClass=user)
(memberof:1.2.840.113556.1.4.1941:=CN=GroupOne,OU=Security Groups,OU=Groups,DC=YOURDOMAIN,DC=NET)
答案 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, 然后检查结果中的文件信息。
另一种工具是online hex editor,但起初我不知道如何使用它。
现在我们得到了魔幻数字,但是如何知道什么类型的数据,或者该文件或流是什么? 这是最好的问题。 幸运的是,这些魔幻数字有很多数据库。让我列出一些
例如,第一个数据库具有搜索功能。只需输入没有空格的魔术数字并搜索
找到之后。是的,可以。您很有可能不会直接找到有问题的文件类型。
我面对了这个问题,并通过针对特定类型的签名测试流来解决了它。就像我在流中搜索的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
我拆分了流并保存了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的耐心