是的,我们需要弄清楚每个流的内容。除了不可靠的扩展名之外,这个星球上的每个文件都有一个签名。它可能会被删除或错误添加。
那么signature是什么?
在计算中,文件签名是用于识别或验证
一个文件的内容。特别是,它可能指的是:
我使用magic number 来定义我从维基百科复制的幻数术语
在computer programming 中,术语幻数有多个
意义。它可以指以下一项或多项:
第二点是一个特定的字节序列,如
PNG (89 50 4E 47 0D 0A 1A 0A)
或
BMP (42 4D)
那么如何知道每个文件的幻数?
在这篇文章“Investigating File Signatures Using PowerShell”中,我们发现作者创建了一个很棒的 power shell 函数来获取幻数,他还提到了一个工具,我从他的文章中复制了这个
PowerShell V5 引入了 Format-Hex,它可以提供替代方案
读取文件并显示十六进制和 ASCII 值的方法
确定幻数。
form Format-Hex help 我正在复制这个描述
Format-Hex cmdlet 将文件或其他输入显示为十六进制
价值观。要确定字符与输出的偏移量,请添加
行最左边的数字到顶部的数字
该字符的列。
此 cmdlet 可帮助您确定损坏文件的文件类型
或可能没有文件扩展名的文件。运行此 cmdlet,
然后检查结果中的文件信息。
这个工具也非常适合获取文件的幻数。这是一个例子
另一个工具是online hex editor,但刚开始我不明白如何使用它。
现在我们得到了神奇的数字,但如何知道什么类型的数据或者那个文件或流是什么?
这是最好的问题。
幸运的是,这些幻数有很多数据库。让我列出一些
-
File Signatures
-
FILE SIGNATURES TABLE
- List of file signatures
例如,第一个数据库具有搜索功能。只需输入不带空格的幻数并搜索
之后你可能会发现。是的,可能。您很有可能无法直接找到相关文件类型。
我遇到了这个问题,并通过针对特定类型的签名测试流来解决它。就像我在流中搜索的 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 的耐心等待