Module refinery.units.formats.pe.dotnet.dnmr
Expand source code Browse git
from __future__ import annotations
import codecs
from refinery.lib.dotnet.resources import NetStructuredResources, NoManagedResource
from refinery.lib.meta import MV
from refinery.lib.types import Param, asbuffer
from refinery.units import RefineryPartialResult
from refinery.units.formats import Arg, PathExtractorUnit, UnpackResult
class dnmr(PathExtractorUnit):
"""
Extracts subfiles from .NET managed resources. Parses serialized ResourceManager streams
embedded in .NET assemblies.
"""
def __init__(
self, *paths, path=MV.NAME.encode(),
raw: Param[bool, Arg.Switch('-w', help='Do not deserialize the managed resource entry data.')] = False,
**kwargs
):
super().__init__(*paths, path=path, raw=raw, **kwargs)
def unpack(self, data):
try:
managed = NetStructuredResources(data)
except NoManagedResource:
managed = None
if not managed:
raise RefineryPartialResult('no managed resources found', partial=data)
for entry in managed:
if entry.Error:
self.log_warn(F'entry {entry.Name} carried error message: {entry.Error}')
data = entry.Data
if not self.args.raw:
if b := asbuffer(v := entry.Value):
data = b
elif isinstance(v, str):
data = codecs.encode(v, self.codec)
yield UnpackResult(entry.Name, data)
@classmethod
def handles(cls, data):
return data[:4] == b'\xCE\xCA\xEF\xBE'
Classes
class dnmr (*paths, path=b'name', raw=False, regex=False, exact=False, fuzzy=0, drop_path=False, join_path=False, list=False, exclude=None)-
Extracts subfiles from .NET managed resources. Parses serialized ResourceManager streams embedded in .NET assemblies.
Expand source code Browse git
class dnmr(PathExtractorUnit): """ Extracts subfiles from .NET managed resources. Parses serialized ResourceManager streams embedded in .NET assemblies. """ def __init__( self, *paths, path=MV.NAME.encode(), raw: Param[bool, Arg.Switch('-w', help='Do not deserialize the managed resource entry data.')] = False, **kwargs ): super().__init__(*paths, path=path, raw=raw, **kwargs) def unpack(self, data): try: managed = NetStructuredResources(data) except NoManagedResource: managed = None if not managed: raise RefineryPartialResult('no managed resources found', partial=data) for entry in managed: if entry.Error: self.log_warn(F'entry {entry.Name} carried error message: {entry.Error}') data = entry.Data if not self.args.raw: if b := asbuffer(v := entry.Value): data = b elif isinstance(v, str): data = codecs.encode(v, self.codec) yield UnpackResult(entry.Name, data) @classmethod def handles(cls, data): return data[:4] == b'\xCE\xCA\xEF\xBE'Ancestors
Subclasses
Class variables
var reverse-
The type of the None singleton.
Methods
def unpack(self, data)-
Expand source code Browse git
def unpack(self, data): try: managed = NetStructuredResources(data) except NoManagedResource: managed = None if not managed: raise RefineryPartialResult('no managed resources found', partial=data) for entry in managed: if entry.Error: self.log_warn(F'entry {entry.Name} carried error message: {entry.Error}') data = entry.Data if not self.args.raw: if b := asbuffer(v := entry.Value): data = b elif isinstance(v, str): data = codecs.encode(v, self.codec) yield UnpackResult(entry.Name, data)
Inherited members
PathExtractorUnit:CustomJoinBehaviourCustomPathSeparatorFilterEverythingRequiresactassemblecarvedcodecconsolefilterfinishhandlesis_quietis_reversibleisattylabelledleniencylog_alwayslog_debuglog_detachlog_faillog_infolog_levellog_warnloggernamenozzleoptional_dependenciesreadread1required_dependenciesresetrunsourcesuperinit
UnitBase: