c# - 在 C# 中使用 PtrToStructure 进行二进制文件反序列化

标签 c# .net data-structures reverse-engineering binary-data

我正试图对我公司的一堆遗留二进制数据进行逆向工程,以便我可以将其转换为更持久的格式。我们用于创建此数据的应用程序不再受支持。

我发现我可以在一系列结构中描述数据,并且我已经能够使用 Marshal.PtrToStructure 将它们编码到托管环境,但一个文件除外。

下面是我尝试解析的结构示例。原始数据都是顺序的,我试图一步反序列化。

[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct DrillTPD
{
    public short Header;
    public short Header2;
    public short Header3;
    public short RecordCount;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 999)]
    public TPDHeader[] Templates;
} 
[StructLayout(LayoutKind.Sequential, Pack = 1, Size=18)]
struct TPDHeader
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
    public string TemplateName;
    public int TPDIndex;
}

TPDIndex 是距文件开头的字节偏移量。如何添加属性以正确反序列化此数据?

[StructLayout(LayoutKind.Sequential, Pack = 1, Size = 76)]
struct TPDParent
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 9)]
    public string TemplateName;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 25)]
    public string Description;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
    public string Field;
    public double Width;
    public double Length;
    public double Thickness;
    public short WL;
    public short XY;
    public short Origin;
    public short Features;
    [MarshalAs(UnmanagedType.ByValArray)]
    public TPDDetail[] Details;
}
[StructLayout(LayoutKind.Sequential, Pack=1, Size=350)]
struct TPDDetail
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 350)]
    public string Text;
}

TPDParent中的TPDetail数组由结构体中的Features定义。如果没有特征,则在 TPDParent 之后不存在 TPDDetail 数据。

我如何动态地让解串器知道 TPDDetail 数组的大小?

理想情况下,此数据的伪 XML 结构如下所示:

<DrillTPD>
    <TPDHeader>
        <TPDParent>
            <TPDDetail/>
            <TPDDetail/>
            <TPDDetail/>
        </TPDParent>
    </TPDHeader>
    <TPDHeader>
        .....
    </TPDHeader>
</DrillTPD>

最后一条评论:我只用过 .NET 语言,但我试图理解事物的非托管方面。感谢您简化您的回答。 :)

最佳答案

尝试创建结构层次结构的简单实例,然后将其作为字节保存到文件中。然后您可以使用十六进制编辑器将您的输出与您认为的输出进行比较。差异将突出显示它未按预期工作的地方。

否则,您正在尝试为您的结构创建完美的定义,它会拒绝工作,直到它是完美的,并且对于像您这样相当复杂的设置来说,这将很难实现。

关于c# - 在 C# 中使用 PtrToStructure 进行二进制文件反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8235661/

相关文章:

c# - 字符串列表到字符串

c# - .NET GUI 未在 WinPE 中显示

c++ - 空间查询点的第 k 个最近邻点

python - 简单的链表队列

c# - 有没有办法导出visual studio生成的时序图?

c# - 是否可以使用 WIX 创建多语言安装程序?

c# - 如何读取FoxPro启动文件数据文件(文件扩展名.FPM)

c# - 如何让Serilog丰富日志

c# - Mvc Api 从请求中获取凭证

Python - 难以置信的大矩阵的最佳数据结构