Module refinery.units.formats.office.vbamc

Expand source code Browse git
from __future__ import annotations

from refinery.lib.id import buffer_contains
from refinery.lib.ole.vba import FileOpenError, VBAParser
from refinery.units.formats import PathExtractorUnit, UnpackResult


class vbamc(PathExtractorUnit):
    """
    Extract VBA macro code from Office documents such as Word and Excel.
    """
    def unpack(self, data):
        try:
            parser = VBAParser(bytes(data))
        except FileOpenError:
            return
        for macro in parser.extract_all_macros():
            if not macro.stream_path:
                continue
            if code := macro.code:
                yield UnpackResult(macro.stream_path, code.encode(self.codec))

    @classmethod
    def handles(cls, data):
        if data[:8] == b'\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1':
            return True
        if data[:2] == B'PK':
            return buffer_contains(data, B'xl/vbaProject.bin')
        return any(buffer_contains(data, ns) for ns in [
            b'http://schemas.microsoft.com/office/word/2003/wordml',
            b'http://schemas.microsoft.com/office/2006/xmlPackage',
        ])

Classes

class vbamc (*paths, list=False, join_path=False, drop_path=False, fuzzy=0, exact=False, regex=False, path=b'path')

Extract VBA macro code from Office documents such as Word and Excel.

Expand source code Browse git
class vbamc(PathExtractorUnit):
    """
    Extract VBA macro code from Office documents such as Word and Excel.
    """
    def unpack(self, data):
        try:
            parser = VBAParser(bytes(data))
        except FileOpenError:
            return
        for macro in parser.extract_all_macros():
            if not macro.stream_path:
                continue
            if code := macro.code:
                yield UnpackResult(macro.stream_path, code.encode(self.codec))

    @classmethod
    def handles(cls, data):
        if data[:8] == b'\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1':
            return True
        if data[:2] == B'PK':
            return buffer_contains(data, B'xl/vbaProject.bin')
        return any(buffer_contains(data, ns) for ns in [
            b'http://schemas.microsoft.com/office/word/2003/wordml',
            b'http://schemas.microsoft.com/office/2006/xmlPackage',
        ])

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:
        parser = VBAParser(bytes(data))
    except FileOpenError:
        return
    for macro in parser.extract_all_macros():
        if not macro.stream_path:
            continue
        if code := macro.code:
            yield UnpackResult(macro.stream_path, code.encode(self.codec))

Inherited members