diff options
author | Miklos Vajna <vmiklos@collabora.com> | 2021-03-25 09:42:49 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.com> | 2021-03-25 09:49:55 +0100 |
commit | 0cbfc5e2b9a5e84d3e164132c682eb79e2cf0a25 (patch) | |
tree | 730406bf2e09bcd8a18ce84c7a2bf23c552c36a6 | |
parent | f4a566be1dd0e052919ffc1923564a33627ad7b1 (diff) |
OLE1: show native data as well
Only preview/presentation data was shown earlier.
Change-Id: Ia2ff4c19b53c3d4b968235173704b334e596ca79
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | msodumper/ole1previewrecord.py | 89 | ||||
-rw-r--r-- | msodumper/ole1record.py | 129 | ||||
-rwxr-xr-x | ole1-dump.py (renamed from ole1preview-dump.py) | 10 |
4 files changed, 135 insertions, 95 deletions
@@ -6,5 +6,5 @@ check: pycodestyle --ignore=E501 emf-dump.py msodumper/{emf,wmf}record.py pycodestyle --ignore=E501 vsd-dump.py msodumper/vsdstream.py test/vsd-test.py pycodestyle --ignore=E501 swlaycache-dump.py msodumper/swlaycacherecord.py - pycodestyle --ignore=E501 ole1preview-dump.py msodumper/ole1previewrecord.py + pycodestyle --ignore=E501 ole1-dump.py msodumper/ole1record.py pycodestyle --ignore=E501 ole2preview-dump.py msodumper/ole2previewrecord.py diff --git a/msodumper/ole1previewrecord.py b/msodumper/ole1previewrecord.py deleted file mode 100644 index 115ec69..0000000 --- a/msodumper/ole1previewrecord.py +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env python3 -# -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. -# - -from . import globals -from .binarystream import BinaryStream - - -class Ole1PreviewStream(BinaryStream): - def __init__(self, bytes): - BinaryStream.__init__(self, bytes) - - def dump(self): - print('<stream type="Ole1Preview" size="%d">' % self.size) - header = StandardPresentationObject(self, "Header") - header.dump() - self.printAndSet("PresentationDataSize", self.readuInt32(), hexdump=False, offset=True) - self.printAndSet("Reserved1", self.readuInt16()) - self.printAndSet("Reserved2", self.readuInt16()) - self.printAndSet("Reserved3", self.readuInt16()) - self.printAndSet("Reserved4", self.readuInt16()) - print('<PresentationData offset="%s" size="%s"/>' % (self.pos, int(self.PresentationDataSize) - 8)) - print('</stream>') - - -class Record(BinaryStream): - def __init__(self, parent): - BinaryStream.__init__(self, parent.bytes) - self.parent = parent - self.pos = parent.pos - - -class LengthPrefixedAnsiString(Record): - """Specified by [MS-OLEDS] 2.1.4, specifies a length-prefixed and - null-terminated ANSI string.""" - def __init__(self, parent, name): - Record.__init__(self, parent) - self.parent = parent - self.pos = parent.pos - self.name = name - - def dump(self): - print('<%s type="LengthPrefixedAnsiString">' % self.name) - self.printAndSet("Length", self.readuInt32(), offset=True) - bytes = [] - for dummy in range(self.Length): - c = self.readuInt8() - bytes.append(c) - - self.printAndSet("String", globals.encodeName("".join(map(lambda c: chr(c), bytes[:-1])), lowOnly=True).encode('utf-8'), hexdump=False, offset=True) - - print('</%s>' % self.name) - self.parent.pos = self.pos - - -class StandardPresentationObject(Record): - def __init__(self, parent, name): - Record.__init__(self, parent) - self.name = name - - def dump(self): - print('<%s type="StandardPresentationObject">' % self.name) - header = PresentationObjectHeader(self, "Header") - header.dump() - self.printAndSet("Width", self.readuInt32()) - self.printAndSet("Height", self.readInt32() * -1) - - print('</%s>' % self.name) - self.parent.pos = self.pos - - -class PresentationObjectHeader(Record): - def __init__(self, parent, name): - Record.__init__(self, parent) - self.name = name - - def dump(self): - print('<%s type="PresentationObjectHeader">' % self.name) - self.printAndSet("OLEVersion", self.readuInt32()) - self.printAndSet("FormatID", self.readuInt32()) - LengthPrefixedAnsiString(self, "ClassName").dump() - - print('</%s>' % self.name) - self.parent.pos = self.pos - -# vim:set filetype=python shiftwidth=4 softtabstop=4 expandtab: diff --git a/msodumper/ole1record.py b/msodumper/ole1record.py new file mode 100644 index 0000000..c2fce14 --- /dev/null +++ b/msodumper/ole1record.py @@ -0,0 +1,129 @@ +#!/usr/bin/env python3 +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +from . import globals +from .binarystream import BinaryStream + + +class Ole1Stream(BinaryStream): + """Specified by [MS-OLEDS] 2.2.5 EmbeddedObject, specifies how an embedded object is laid out in + a container document.""" + def __init__(self, bytes): + BinaryStream.__init__(self, bytes) + + def dump(self): + print('<stream type="EmbeddedObject" size="%d">' % self.size) + header = ObjectHeader(self, "Header") + header.dump() + self.printAndSet("NativeDataSize", self.readuInt32(), hexdump=False, offset=True) + print('<NativeData offset="%s" size="%s"/>' % (self.pos, self.NativeDataSize)) + self.pos += self.NativeDataSize + presentation = MetaFilePresentationObject(self, "Presentation") + presentation.dump() + print('</stream>') + + +class Record(BinaryStream): + def __init__(self, parent): + BinaryStream.__init__(self, parent.bytes) + self.parent = parent + self.pos = parent.pos + + +class LengthPrefixedAnsiString(Record): + """Specified by [MS-OLEDS] 2.1.4, specifies a length-prefixed and + null-terminated ANSI string.""" + def __init__(self, parent, name): + Record.__init__(self, parent) + self.parent = parent + self.pos = parent.pos + self.name = name + + def dump(self): + print('<%s type="LengthPrefixedAnsiString">' % self.name) + self.printAndSet("Length", self.readuInt32(), offset=True) + bytes = [] + for dummy in range(self.Length): + c = self.readuInt8() + bytes.append(c) + + self.printAndSet("String", globals.encodeName("".join(map(lambda c: chr(c), bytes[:-1])), lowOnly=True).encode('utf-8'), hexdump=False, offset=True) + + print('</%s>' % self.name) + self.parent.pos = self.pos + + +class StandardPresentationObject(Record): + def __init__(self, parent, name): + Record.__init__(self, parent) + self.name = name + + def dump(self): + print('<%s type="StandardPresentationObject">' % self.name) + self.standardPresentationObject = PresentationObjectHeader(self, "Header") + self.standardPresentationObject.dump() + if self.standardPresentationObject.FormatID != 0x00000000: + self.printAndSet("Width", self.readuInt32()) + self.printAndSet("Height", self.readInt32() * -1) + + print('</%s>' % self.name) + self.parent.pos = self.pos + + +class PresentationObjectHeader(Record): + def __init__(self, parent, name): + Record.__init__(self, parent) + self.name = name + + def dump(self): + print('<%s type="PresentationObjectHeader">' % self.name) + self.printAndSet("OLEVersion", self.readuInt32()) + self.printAndSet("FormatID", self.readuInt32()) + if self.FormatID != 0x00000000: + LengthPrefixedAnsiString(self, "ClassName").dump() + + print('</%s>' % self.name) + self.parent.pos = self.pos + + +class ObjectHeader(Record): + def __init__(self, parent, name): + Record.__init__(self, parent) + self.name = name + + def dump(self): + print('<%s type="ObjectHeader">' % self.name) + self.printAndSet("OLEVersion", self.readuInt32()) + self.printAndSet("FormatID", self.readuInt32()) + LengthPrefixedAnsiString(self, "ClassName").dump() + LengthPrefixedAnsiString(self, "TopicName").dump() + LengthPrefixedAnsiString(self, "ItemName").dump() + + print('</%s>' % self.name) + self.parent.pos = self.pos + + +class MetaFilePresentationObject(Record): + def __init__(self, parent, name): + Record.__init__(self, parent) + self.name = name + + def dump(self): + print('<%s type="MetaFilePresentationObject">' % self.name) + header = StandardPresentationObject(self, "Header") + header.dump() + if header.standardPresentationObject.FormatID != 0x000000: + self.printAndSet("PresentationDataSize", self.readuInt32(), hexdump=False, offset=True) + self.printAndSet("Reserved1", self.readuInt16()) + self.printAndSet("Reserved2", self.readuInt16()) + self.printAndSet("Reserved3", self.readuInt16()) + self.printAndSet("Reserved4", self.readuInt16()) + print('<PresentationData offset="%s" size="%s"/>' % (self.pos, int(self.PresentationDataSize) - 8)) + print('</%s>' % self.name) + self.parent.pos = self.pos + +# vim:set filetype=python shiftwidth=4 softtabstop=4 expandtab: diff --git a/ole1preview-dump.py b/ole1-dump.py index 045c1d0..ab74212 100755 --- a/ole1preview-dump.py +++ b/ole1-dump.py @@ -5,25 +5,25 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. # -from msodumper import ole1previewrecord +from msodumper import ole1record import sys -# Dumps the OLE1 preview: see [MS-OLEDS] 2.2.5. -class Ole1PreviewDumper: +# Dumps the OLE1 embedded object: see [MS-OLEDS] 2.2.5. +class Ole1Dumper: def __init__(self, filepath): self.filepath = filepath def dump(self): file = open(self.filepath, 'rb') - strm = ole1previewrecord.Ole1PreviewStream(file.read()) + strm = ole1record.Ole1Stream(file.read()) file.close() print('<?xml version="1.0"?>') strm.dump() def main(args): - dumper = Ole1PreviewDumper(args[1]) + dumper = Ole1Dumper(args[1]) dumper.dump() |