如何分析二进制文件?

时间:2009-06-22 08:24:45

标签: binary reverse-engineering serialization code-analysis

我有一个二进制文件。我不知道它是如何格式化的,我只知道它来自delphi代码。

是否存在分析二进制文件的任何方式?

是否存在任何“模式”来分析和反序列化格式未知的文件的二进制内容?

13 个答案:

答案 0 :(得分:21)

试试这些:

  1. 反序列化数据:分析如何编译您的exe(尝试File Analyzer)。尝试使用发现的语言反序列化二进制数据。然后以xml格式(语言独立)将其序列化,使每种编程语言都能理解
  2. 分析二进制数据:尝试保存文件的各种版本,几乎没有变化,并使用diff程序使用十六进制编辑器分析每个位的含义。将它与二进制黑客技术(如How to crack a Binary File Format by Frans Faase
  3. 结合使用
  4. 反向设计应用程序:尝试使用逆向工程工具获取用于构建应用程序的编程语言(使用File Analyzer找到)。否则使用反汇编分析工具,如IDA Pro Disassembler

答案 1 :(得分:11)

对于我的爱好项目,我不得不对一些旧的游戏文件进行逆向工程。我的方法是:

  • 有一个好的十六进制编辑器。
  • 在二进制文件中查找可读单词。注意它们的分布情况。如果它们之间的距离不变,你就知道它是一个列表。
  • 查找2-3个后续零。可能表示int32值。
  • 某些dwords可能是指向该文件的指针。
  • 尝试识别文件中重复出现的模式。
  • 看到大量的C0-CF可能表示RLE压缩数据。

答案 2 :(得分:8)

当您对二进制文件有所了解时,对二进制文件进行逆向工程是一个非常耗时的过程。如果你不知道它是什么,那就更难了。

虽然有可能,但你必须有充分的理由这样做。

第一步是在您选择的十六进制编辑器中打开它,看看是否可以找到任何英文文本,指向文件甚至应该表示的方向。从那里,谷歌“逆向工程二进制文件”,有比我更有知识的人,有关于它的书面指南。

答案 3 :(得分:5)

GNU binutils的“字符串”程序非常有用。它会在文件中打印可打印字符的字符串,通常会给出文件包含的内容或程序的线索。

答案 4 :(得分:5)

如果数据代表序列化的Delphi对象,您应该开始阅读有关Delphi序列化过程的内容。如果是这种情况,我认为您最好的选择是使用Delphi加载它并继续从IDE进行分析。有关Delphi序列化的一些信息可以找到here

编辑:如果文件确实包含序列化的delphi对象,那么你应该编写一个加载它的小型delphi程序,并将数据“转换”为中性的,如xml。如果你设法这样做,你应该检查并查看delphi是否支持序列化为xml。然后,您可以从任何语言访问这些对象。

答案 5 :(得分:4)

我已经为此目的开发了Hexinator(Window& Linux)和Synalyze It!(macOS)。这些应用程序允许您像在其他十六进制编辑器中一样查看二进制文件,但另外您可以创建具有二进制文件格式细节的“语法”。语法包含所有构建块,用于自动解析文件。

因此,您可以保留分析中获得的知识,并将其同时应用于多个文件。您还可以对文件格式的各个部分进行颜色编码,以便在十六进制编辑器中快速浏览。 Screen Shot of Synalyze It! Pro 解析结果显示在树形视图中,您还可以在其中轻松修改文件(应用endianness等等)。

答案 6 :(得分:3)

unix“file”命令非常有用 - 我不知道在windows中是否有类似的东西。你这样运行:

file myfile.ext

它根据其中包含的幻数和数据吐出文字说明。

可能它包含在cygwin内。

答案 7 :(得分:3)

如果您有权访问创建该文件的应用程序,您可以对应用程序应用更改,然后保存文件并查看效果(请记住,数字可能存储在little endian中):

  • 首先重复创建文件。如果文件不是二进制相等,则当前日期/时间可能存储在发生差异的区域中。
  • 也许您想重复使用在不同环境下运行的软件,看看是否存储了操作系统版本等,但这很不寻常。
  • 接下来,您可以尝试更改单个变量并创建几个仅在此变量值不同的文件。这有助于您确定此变量的存储位置。
  • 这样您还可以排除未存储在文件中的变量:如果您更改它们,但创建的文件相同,则不会存储它们。

为了测试您使用上述步骤制定的假设,请编辑其中一个文件并让应用程序读取它。

如果您无法访问应用程序本身,我建议您忘记它并找到另一种方法来解决您的问题。它的可能性很快......

答案 8 :(得分:3)

如果file没有给出有意义的答案,您可以尝试使用Marco Pontello TRiD来确定您的数据是否以已知格式存储。

答案 9 :(得分:2)

你知道使用它的程序吗?如果是这样,你可以挂钩程序写入文件函数,并了解它的写入数据,数据大小和位置。

更多信息:http://www.codeproject.com/KB/DLL/Win32APIHooking_Trouble.aspx

答案 10 :(得分:2)

获取Delphi应用程序并在IDA Pro freeware version中打开它,找到它写入文件的位置,并解码它以何种方式写入文件。

除非是计划文本。

答案 11 :(得分:1)

与仅显示文件的原始十六进制字节的传统十六进制编辑器不同,010 Editor还可以使用二进制模板将文件解析为层次结构。运行二进制模板的结果比仅使用原始十六进制字节更容易理解和编辑。

http://www.sweetscape.com/010editor/

答案 12 :(得分:0)

尝试在十六进制编辑器中打开它并进行分析。