您的文件不是由ascii字符组成,而是由打开它的应用程序解释。如果你在wordpad中打开一个.jpg图像会发生同样的事情 - 你会得到一堆二进制和一些ascii字符,这些字符是人类可以打印和识别的。
这就是为什么你不能对你的时间戳进行纯文本搜索的原因。
以下是用于演示此问题的代码示例。在二进制文件中,您有以下字节:
\x44\x69\x62\x65\x6e\x7a\x6f\x79\x6c\x70\x65\x72\x6f\x78\x69\x64\x20\x31\ x32\x30\x20\x43\x20\x30\x33\x2e\x30\x35\x2e\x31\x39\x39\x34\x20\x31\x34\x3a\x32\ x34\x3a\x33\x30
如果你打开像wordpad这样的文本编辑器内部,它将呈现以下内容:
Dibenzoylperoxid 120 C 03.05.1994 14:24:30
这是Python中的代码片段:
>>> c='\x44\x69\x62\x65\x6e\x7a\x6f\x79\x6c\x70\x65\x72\x6f\x78\x69\x64\x20\x31\ x32\x30\x20\x43\x20\x30\x33\x2e\x30\x35\x2e\x31\x39\x39\x34\x20\x31\x34\x3a\x32\ x34\x3a\x33\x30' >>> print c Dibenzoylperoxid 120 C 03.05.1994 14:24:30
这些字节是十六进制格式,这就是为什么你不能用明文搜索它。
原因是因为二进制文件遵循一个非常特殊的结构(协议,规范),因此读取它的程序可以正确地解析它。如果你以jpeg图像为例,你会发现图像的第一个字节和最后一个字节总是相同的(取决于使用的格式) - FF D8 将是jpeg的前两个字节 FF D9 将是jpeg的最后两个字节来识别它。现在,图像编辑程序将知道开始将此二进制数据解析为jpeg,它将“遍历”文件内的结构以呈现图像。 这里 是一个资源的链接,可以帮助您根据“签名”或“标题”识别文件 - 文件的前两个字节 10 00 不要出现在该数据库中,因此您可能正在处理专有格式,因此您将无法在线轻松找到规范。这就是逆向工程派上用场的地方。
FF D8
FF D9
10 00
我建议你用hexeditor打开你的文件 - 它会给你十六进制输出和ascii输出,这样你就可以开始分析文件格式了。我个人使用Hackman Hexeditor找到了 这里 (它是免费的,有很多功能)。
但是现在 - 给你一些有用的东西来搜索你感兴趣的数据文件是一种快速的方法,可以在开始搜索之前将搜索查询转换为二进制文件。
import struct #binary_data = open("your_binary_file.bin","rb").read() #your binary data would show up as a big string like this one when you .read() binary_data = '\x44\x69\x62\x65\x6e\x7a\x6f\x79\x6c\x70\x65\x72\x6f\x78\x69\x64\x20\x31\ x32\x30\x20\x43\x20\x30\x33\x2e\x30\x35\x2e\x31\x39\x39\x34\x20\x31\x34\x3a\x32\ x34\x3a\x33\x30' def search(text): #convert the text to binary first s = "" for c in text: s+=struct.pack("b", ord(c)) results = binary_data.find(s) if results == -1: print "no results found" else: print "the string [%s] is found at position %s in the binary data"%(text, results) search("Dibenzoylperoxid") search("03.05.1994")
上述脚本的结果是:
the string [Dibenzoylperoxid] is found at position 0 in the binary data the string [03.05.1994] is found at position 25 in the binary data
这应该让你开始。