【问题标题】:Binary Serialized File - Delphi二进制序列化文件 - Delphi
【发布时间】:2010-10-11 09:32:01
【问题描述】:

我正在尝试反序列化在 Delphi 中序列化的旧文件格式,它使用二进制序列化。除了其中的一些非常高级的记录外,我对文件的结构一无所知。

你会采取什么步骤来解决这个问题?有什么工具吗?

【问题讨论】:

    标签: delphi reverse-engineering serialization binary-serialization


    【解决方案1】:

    一个好的十六进制编辑器,并使用灰质来识别结构。

    如果你得到一个提示它是什么类型的文件,你可以搜索更专业的工具。

    运行 unix/Linux "file" 命令也很好 (*) 请参阅下面 Barry 的评论了解它的工作原理。它可以快速检查使用不同扩展名隐藏的常见文件类型,如 DBF、ZIP 等。

    (*) 有适用于 Windows 的 3rd 方构建,但它们可能会滞后于版本。如果您可以在最近的 *nix 发行版上执行此操作,建议您这样做。

    【讨论】:

    • @kyndigs 它使用格式描述列表(通常是不同文件格式应以字节序列开头)来尝试识别文件格式。格式描述称为魔术,您可以在 /etc/magic 或 /usr/share/file/magic 或类似文件中找到它们。
    【解决方案2】:

    序列化过程只是循环所有已发布的属性并将它们的值流式传输到文本文件。如果您不知道流式传输到文件的确切类,您将很难反序列化文件。 (如果不是不可能的话)

    【讨论】:

    • 假设它确实是使用 VCL 类进行序列化的。 VCL(tbinarywriter)流 IIRC 包含属性名称和粗略类型。
    • 我反编译了打开它的原始exe,发现文件中有一系列打包记录,所以我大致知道文件中的内容,它只是一个案例做对了。我对图像库做了类似的事情,但它们有一个视觉输出,使其更容易,并且每个图像都有一个简单的位图结构。
    • 如果您确定应用程序/格式 - 也许有人已经拥有您需要的东西?
    【解决方案3】:

    一个好的十六进制编辑器是第一位的。如果在没有缓冲的情况下读取文件(例如直接从 TFileStream 读取),则在使用 SysInternals 的 ProcMon 时可以获得一些信息;您可以准确查看在哪些块中读取了哪些数据,从而更快地确定您已经识别的结构之间的边界。

    【讨论】:

    • 嗯,这完全没有缓冲吗?如果有一些缓冲,无论是在 Delhpi 中还是在下面的 procmon 挂钩的 Windows 层中,您可能只会看到扇区级块。
    • @Marco:Windows 缓冲区在内核中,您看到的是 CreateFile、ReadFile、WriteFile IoCtrl 等调用以及返回的内容。
    猜你喜欢
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 2014-10-16
    • 2023-03-10
    • 2020-03-07
    • 2016-07-27
    • 2015-04-03
    • 1970-01-01
    相关资源
    最近更新 更多