【问题标题】:How to analyze binary file?如何分析二进制文件?
【发布时间】:2010-11-04 19:02:24
【问题描述】:

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

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

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

【问题讨论】:

  • 你能告诉我们更多关于这个 Delphi 代码的信息吗?
  • 这是一个允许创建考试测试的delphi程序。生成的文件是二进制文件。
  • 您是否有权访问可以读取此文件类型并显示考试的程序?如果是这样,那将使您的倒车体验更加轻松,因为您可以连接到该应用程序并观察它的作用。
  • 投票结束,因为不清楚/太宽泛。你想分析什么?

标签: binary reverse-engineering serialization code-analysis


【解决方案1】:

试试这些:

  1. 反序列化数据:分析它是如何编译你的 exe 的(试试File Analyzer)。尝试使用发现的语言反序列化二进制数据。然后将其序列化为每种编程语言都能理解的 xml 格式(与语言无关)
  2. 分析二进制数据:尽量保存不同版本的文件,并使用 diff 程序用十六进制编辑器分析每个位的含义。将其与二进制黑客技术(如How to crack a Binary File Format by Frans Faase)结合使用
  3. 对应用程序进行逆向工程:尝试使用逆向工程工具获取用于构建应用程序的编程语言的代码(通过File Analyzer 找到)。否则使用反汇编分析工具,如IDA Pro Disassembler

【讨论】:

  • 也许您应该标记一个答案,而不是提供所说内容的摘要。
  • 好的,所以这个问题永远不会有答案!如果需要,请复制并粘贴此答案。我会很高兴标记你的答案!你也会很开心!我对声誉不感兴趣,我只想标记这个问题的答案。和你?你真正感兴趣的是什么?
  • 如果您查看其他问题,当作者想提供摘要时,他编辑了问题并在那里添加。我不在乎声誉,但这些答案是用户提供的。
  • @Geo 有时他提出问题的人是在该主题上投入更多精力的人。话虽如此,他可能是提供答案的好人选,因为他可能已经检查过用户推荐的解决方案。我找不到任何对社区不利的地方,再一次,因为已经制定了规则。
  • 文件分析器的链接已损坏。今天在哪里可以找到它?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    因此,您可以保留在分析中获得的知识并将其同时应用于多个文件。您还可以对文件格式的点点滴滴进行颜色编码,以便在十六进制编辑器中快速概览。 解析结果显示在树形视图中,您还可以在其中轻松修改文件(应用字节顺序等)。

    【讨论】:

    • 解析语法可以导出成python脚本吗?
    • 还没有。语法可以包含 Python(和 Lua)脚本。很可能会有一个 Python 扩展模块允许您在自己的脚本中使用语法引擎。如果您想测试它,请联系我:)
    • 我尝试了这个并且花费了更多的时间与之抗争,而不是使用它。特别是如果我想更改语法中的一行,我就做不到。它不会让我删除或编辑该行。其他人可能会觉得它很有价值,但我在沮丧 10 分钟后卸载了它,我使用普通的旧文本编辑器取得了更好的进展。
    • 有很多地方可以使用上下文菜单——包括删除语法中的一行。
    【解决方案4】:

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

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

    第一步是在你选择的十六进制编辑器中打开它,看看你是否能找到任何英文文本来指明文件应该代表的方向。从那里,谷歌“逆向工程二进制文件”,有比我更多的知识渊博的人写过关于它的指南。

    【讨论】:

      【解决方案5】:

      来自 GNU binutils 的“字符串”程序非常有用。它将打印文件中的可打印字符的字符串,通常会提供文件包含的内容或程序的功能的线索。

      【讨论】:

      • 我试过了,但它只返回“sdf@1#£”之类的单词列表
      【解决方案6】:

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

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

      【讨论】:

      • 如果是序列化的delphi数据,如何在c#或objective-c程序中使用?
      • 但它需要一个 delphi 解释器。如果我有打开此文件的单个应用程序,我不能。我必须执行两个不同的应用程序。
      • 是的。您需要将对象转换为可在任何地方使用的东西。您可以从主应用程序的代码中执行转换器,并处理生成的文件。我就是这样做的。
      【解决方案7】:

      unix“文件”命令真的很有用——我不知道windows中是否有类似的东西。你像这样运行它:

      file myfile.ext
      

      它会根据其中包含的幻数和数据吐出文本描述。

      它可能包含在cygwin 中。

      【讨论】:

      • 他可能会得到“octet-stream”,这会让他更加困惑。 “.bin”文件(我猜是)不是“标准化”的,正如 colithium 所说,他可能需要 RE。
      • 这就是“文件”的作用——它根本不看扩展名
      • "file" 如您所说,查找幻数,但只有知道文件类型的幻数。所以它很可能会找到 .jpg、.tar.gz、.avi 等,但自定义二进制文件结构不是已知的文件类型(如果是,他一开始就不会遇到这个问题: ) )
      【解决方案8】:

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

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

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

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

      【讨论】:

        【解决方案9】:

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

        【讨论】:

        • 我试过了,但它说的是文件:“程序 X 格式”。嗯...我已经知道这是来自程序 X 的文件
        【解决方案10】:

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

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

        【讨论】:

          【解决方案11】:

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

          除非是计划文本。

          【讨论】:

            【解决方案12】:

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

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

            【讨论】:

              【解决方案13】:

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

              【讨论】:

              • 这并没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
              • 确实简洁地回答了这个问题。
              猜你喜欢
              • 2020-11-02
              • 2020-10-01
              • 1970-01-01
              • 2010-10-19
              • 2023-04-01
              • 2015-06-21
              • 1970-01-01
              • 2023-03-31
              • 1970-01-01
              相关资源
              最近更新 更多