MCPcopy Create free account
hub / github.com/secdev/scapy / NDRFullPointerField

Class NDRFullPointerField

scapy/layers/dcerpc.py:1703–1795  ·  view source on GitHub ↗

A NDR Full/Unique pointer field encapsulation. :param EMBEDDED: This pointer is embedded. This means that it's representation will not appear after the pointer (pointer deferral applies). See [C706] 14.3.12.3 - Algorithm for Deferral of Referents

Source from the content-addressed store, hash-verified

1701
1702
1703class NDRFullPointerField(_FieldContainer):
1704 """
1705 A NDR Full/Unique pointer field encapsulation.
1706
1707 :param EMBEDDED: This pointer is embedded. This means that it's representation
1708 will not appear after the pointer (pointer deferral applies).
1709 See [C706] 14.3.12.3 - Algorithm for Deferral of Referents
1710 """
1711
1712 EMBEDDED = False
1713 EMBEDDED_REF = False
1714
1715 def __init__(self, fld, ref=False, fmt="I"):
1716 self.fld = fld
1717 self.ref = ref
1718 self.default = None
1719
1720 def getfield(self, pkt, s):
1721 fmt = _e(pkt.ndrendian) + ["I", "Q"][pkt.ndr64]
1722 remain, referent_id = NDRAlign(Field("", 0, fmt=fmt), align=(4, 8)).getfield(
1723 pkt, s
1724 )
1725
1726 # No value
1727 if referent_id == 0 and not self.EMBEDDED_REF:
1728 return remain, None
1729
1730 # With value
1731 if self.EMBEDDED:
1732 # deferred
1733 ptr = NDRPointer(
1734 ndr64=pkt.ndr64, ndrendian=pkt.ndrendian, referent_id=referent_id
1735 )
1736 pkt.deferred_pointers.append((ptr, partial(self.fld.getfield, pkt)))
1737 return remain, ptr
1738
1739 remain, val = self.fld.getfield(pkt, remain)
1740 return remain, NDRPointer(
1741 ndr64=pkt.ndr64, ndrendian=pkt.ndrendian, referent_id=referent_id, value=val
1742 )
1743
1744 def addfield(self, pkt, s, val):
1745 if val is not None and not isinstance(val, NDRPointer):
1746 raise ValueError(
1747 "Expected NDRPointer in %s. You are using it wrong!" % self.name
1748 )
1749 fmt = _e(pkt.ndrendian) + ["I", "Q"][pkt.ndr64]
1750 fld = NDRAlign(Field("", 0, fmt=fmt), align=(4, 8))
1751
1752 # No value
1753 if val is None and not self.EMBEDDED_REF:
1754 return fld.addfield(pkt, s, 0)
1755
1756 # With value
1757 _set_ctx_on(val.value, pkt)
1758 s = fld.addfield(pkt, s, val.referent_id)
1759 if self.EMBEDDED:
1760 # deferred

Calls

no outgoing calls

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…