【问题标题】:Explaining/translating Python class for .NET为 .NET 解释/翻译 Python 类
【发布时间】:2021-10-22 03:32:42
【问题描述】:

老实说,多年来我一直在编程,我从来没有太多理由使用字节数组(除非您出于特定目的计算复制/粘贴代码),并且在大多数情况下,我承认我不完全了解如何正确处理它们。现在,我正在尝试解析 Active Directory dnsNode 对象的 dnsRecord 属性,该对象是具有以下结构的字节数组:

  • DataLength2 个字节):一个无符号二进制整数,包含数据字段的长度(以字节为单位)。
  • 类型2字节):资源记录的类型。请参阅 DNS_RECORD_TYPE (section 2.2.2.1.1)。
  • 版本1 字节):与资源记录属性关联的版本号。值必须0x05
  • Rank1 字节):RANK* 标志值之一的最低有效字节。请参阅 dwFlags (section 2.2.2.2.5)。
  • 标志2 个字节):未使用。值必须0x0000
  • 序列号4 字节):包含此资源记录的区域的SOA 记录的序列号。请参阅 DNS_RPC_RECORD_SOA (section 2.2.2.2.4.3)。
  • TtlSeconds4 个字节):请参阅 dwTtlSeconds (section 2.2.2.2.5)。该字段使用大端字节序。
  • 保留4 个字节):此字段保留供将来使用。值必须0x00000000
  • 时间戳4 个字节):请参阅 dwTimeStamp (section 2.2.2.2.5)。
  • 数据变量):资源记录的数据。请参阅 DNS_RPC_RECORD_DATA (section 2.2.2.2.4)。

查看来自我的一个 AD 对象的数据样本,我相信我至少知道我在看什么以及如何找到我需要的信息。

04  00  01  00  05  240  00  00  36  43  78  120  00  00  14  16  00  00  00  00  00  00  00  00  192  168  1  120

即便如此,我真正想要的是为我正在从事的项目对这些信息进行某种形式的处理。就像我说的,我可能会根据我正在查看的样本数据拼凑出一些可以“完成工作”的东西,但我真的很想“正确地”构建它。

我找到了一个example written in Python,它定义了一个通用的DNS_RECORD 类以及一些更具体的用于各个记录类型的类(AAAAASRV等。) 我了解基本功能,但是,因为我的理解是 Python 并没有真正使用明确的对象类型定义等 - 而且因为我通常在 VB.NET 中进行编程 - 我对类定义有点困惑:

class DNS_RECORD(Structure):
    """
    dnsRecord - used in LDAP
    [MS-DNSP] section 2.3.2.2
    """
    structure = (
        ('DataLength', '<H-Data'),
        ('Type', '<H'),
        ('Version', 'B=5'),
        ('Rank', 'B'),
        ('Flags', '<H=0'),
        ('Serial', '<L'),
        ('TtlSeconds', '>L'),
        ('Reserved', '<L=0'),
        ('TimeStamp', '<L=0'),
        ('Data', ':')
    )

据我了解,我知道这是定义对象的属性(DataLengthVersionData)。从我可以通过基本上下文线索和我对上述标准定义的阅读可以“翻译”自己的内容来看,VersionFlagsReservedTimeStamp 属性被设置为常量值。就我对这个结构的“了解”而言,这就是我所能得到的(毫无疑问,这仍然可能是错误的)。

然而,我最困惑的是,尖括号是什么(例如&lt;H&gt;L)?我认为它有助于解析单个字节,也许是通过识别endianness? HLB 是另一种指定字节读取/写入方式的方法吗?我只是不确定如何在 .NET 中复制这些特定指令。

我正在尝试阅读有关 Python 的信息,但如果我能解释这个类定义以便我翻译它,我将不胜感激。我真的很想在这里自学一下。

【问题讨论】:

  • 我只能说,您定义的DNS_RECORD 类继承自impacket 库中定义的Structure(大写S)类(参见import 语句)。 structure(小写 s)成员的参数特定于该库/类,它们的表达方式也是如此。不幸的是,它似乎没有在线记录(也许如果你安装了这个库,你会得到一些文档)。
  • 但根据您想要使用该数据的目的,您甚至可能不需要该工具
  • 啊。好的。我想我应该超越类定义来获得更多上下文。我错误地认为这个定义是 Python 中的“标准”。看来我还有很多事情要做。感谢您为我指明正确的方向!
  • 此数据的目的是构建来自 AD DNS 的 A 记录列表,我可以将其与分配给特定主机上任何/所有 NIC 的任何/所有 IP 地址进行比较以确定主机将在本地网络上响应的名称。它令人费解且曲折,但我网络上的一些服务器响应多个主机名以实现与旧系统的向后兼容性,我只是想设计一种方法来“整合”这些信息,而无需手动操作继续前进。
  • 无论如何,Structure 似乎是 Python 标准库 struct 模块的专用版本。您可能想check it 了解一般信息

标签: python arrays vb.net


【解决方案1】:

您定义的DNS_RECORD 类继承自impacket 库中定义的Structure(大写S)类(参见import 语句)。 structure(小写 s)成员的参数特定于该库/类,它们的表达方式也是如此。不幸的是,它似乎没有在线记录(也许如果你安装了这个库,你会得到一些文档)。

无论如何,Structure 似乎是 Python 标准库 struct 模块的专用版本。您可能想check it 了解一般信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多