Commit 8159c1b951891bada19f45dd3bf74f7251d0f442

Authored by decalage2
1 parent 40694d71

plugin_biff: almost fixed #428

oletools/thirdparty/oledump/plugin_biff.py
... ... @@ -32,85 +32,50 @@ import struct
32 32 import re
33 33 import optparse
34 34 import binascii
  35 +import sys
35 36  
  37 +# from olevba:
36 38  
37   -# CIC: Call If Callable
38   -def CIC(expression):
39   - if callable(expression):
40   - return expression()
41   - else:
42   - return expression
43   -
  39 +if sys.version_info[0] <= 2:
  40 + # Python 2.x
  41 + PYTHON2 = True
  42 +else:
  43 + # Python 3.x+
  44 + PYTHON2 = False
44 45  
45   -# IFF: IF Function
46   -def IFF(expression, valueTrue, valueFalse):
47   - if expression:
48   - return CIC(valueTrue)
  46 +def unicode2str(unicode_string):
  47 + """
  48 + convert a unicode string to a native str:
  49 + - on Python 3, it returns the same string
  50 + - on Python 2, the string is encoded with UTF-8 to a bytes str
  51 + :param unicode_string: unicode string to be converted
  52 + :return: the string converted to str
  53 + :rtype: str
  54 + """
  55 + if PYTHON2:
  56 + return unicode_string.encode('utf8', errors='replace')
49 57 else:
50   - return CIC(valueFalse)
51   -
52   -
53   -def CombineHexASCII(hexDump, asciiDump, length):
54   - if hexDump == '':
55   - return ''
56   - return hexDump + ' ' + (' ' * (3 * (length - len(asciiDump)))) + asciiDump
57   -
58   -def HexASCII(data, length=16):
59   - result = []
60   - if len(data) > 0:
61   - hexDump = ''
62   - asciiDump = ''
63   - for i, b in enumerate(data):
64   - if i % length == 0:
65   - if hexDump != '':
66   - result.append(CombineHexASCII(hexDump, asciiDump, length))
67   - hexDump = '%08X:' % i
68   - asciiDump = ''
69   - hexDump += ' %02X' % ord(b)
70   - asciiDump += IFF(ord(b) >= 32, b, '.')
71   - result.append(CombineHexASCII(hexDump, asciiDump, length))
72   - return result
  58 + return unicode_string
73 59  
74   -def StringsASCII(data):
75   - return re.findall('[^\x00-\x08\x0A-\x1F\x7F-\xFF]{4,}', data)
76   -
77   -def StringsUNICODE(data):
78   - return [foundunicodestring.replace('\x00', '') for foundunicodestring, dummy in re.findall('(([^\x00-\x08\x0A-\x1F\x7F-\xFF]\x00){4,})', data)]
79 60  
80   -def Strings(data, encodings='sL'):
81   - dStrings = {}
82   - for encoding in encodings:
83   - if encoding == 's':
84   - dStrings[encoding] = StringsASCII(data)
85   - elif encoding == 'L':
86   - dStrings[encoding] = StringsUNICODE(data)
87   - return dStrings
88   -
89   -def ContainsWord(word, expression):
90   - return struct.pack('<H', word) in expression
91   -
92   -#https://docs.microsoft.com/en-us/openspecs/office_file_formats/ms-xls/6e5eed10-5b77-43d6-8dd0-37345f8654ad
93   -def ParseLoc(expression):
94   - formatcodes = 'HH'
95   - formatsize = struct.calcsize(formatcodes)
96   - row, column = struct.unpack(formatcodes, expression[0:formatsize])
97   - rowRelative = column & 0x8000
98   - colRelative = column & 0x4000
99   - column = column & 0x3FFF
100   - if rowRelative:
101   - rowindicator = '~'
  61 +def bytes2str(bytes_string, encoding='utf8'):
  62 + """
  63 + convert a bytes string to a native str:
  64 + - on Python 2, it returns the same string (bytes=str)
  65 + - on Python 3, the string is decoded using the provided encoding
  66 + (UTF-8 by default) to a unicode str
  67 + :param bytes_string: bytes string to be converted
  68 + :param encoding: codec to be used for decoding
  69 + :return: the string converted to str
  70 + :rtype: str
  71 + """
  72 + if PYTHON2:
  73 + return bytes_string
102 74 else:
103   - rowindicator = ''
104   - row += 1
105   - if colRelative:
106   - colindicator = '~'
107   - else:
108   - colindicator = ''
109   - column += 1
110   - return 'R%s%dC%s%d' % (rowindicator, row, colindicator, column)
  75 + return bytes_string.decode(encoding, errors='replace')
111 76  
112   -def ParseExpression(expression):
113   - dTokens = {
  77 +
  78 +dTokens = {
114 79 0x01: 'ptgExp',
115 80 0x02: 'ptgTbl',
116 81 0x03: 'ptgAdd',
... ... @@ -209,7 +174,7 @@ def ParseExpression(expression):
209 174 }
210 175  
211 176 #https://docs.microsoft.com/en-us/openspecs/office_file_formats/ms-xls/00b5dd7d-51ca-4938-b7b7-483fe0e5933b
212   - dFunctions = {
  177 +dFunctions = {
213 178 0x0000: 'COUNT',
214 179 0x0001: 'IF',
215 180 0x0002: 'ISNA',
... ... @@ -585,62 +550,436 @@ def ParseExpression(expression):
585 550 0x017B: 'RTD',
586 551  
587 552 0x8076: 'ALERT',
588   - }
  553 +}
  554 +
  555 +dOpcodes = {
  556 + 0x06: 'FORMULA : Cell Formula',
  557 + 0x0A: 'EOF : End of File',
  558 + 0x0C: 'CALCCOUNT : Iteration Count',
  559 + 0x0D: 'CALCMODE : Calculation Mode',
  560 + 0x0E: 'PRECISION : Precision',
  561 + 0x0F: 'REFMODE : Reference Mode',
  562 + 0x10: 'DELTA : Iteration Increment',
  563 + 0x11: 'ITERATION : Iteration Mode',
  564 + 0x12: 'PROTECT : Protection Flag',
  565 + 0x13: 'PASSWORD : Protection Password',
  566 + 0x14: 'HEADER : Print Header on Each Page',
  567 + 0x15: 'FOOTER : Print Footer on Each Page',
  568 + 0x16: 'EXTERNCOUNT : Number of External References',
  569 + 0x17: 'EXTERNSHEET : External Reference',
  570 + 0x18: 'LABEL : Cell Value, String Constant',
  571 + 0x19: 'WINDOWPROTECT : Windows Are Protected',
  572 + 0x1A: 'VERTICALPAGEBREAKS : Explicit Column Page Breaks',
  573 + 0x1B: 'HORIZONTALPAGEBREAKS : Explicit Row Page Breaks',
  574 + 0x1C: 'NOTE : Comment Associated with a Cell',
  575 + 0x1D: 'SELECTION : Current Selection',
  576 + 0x22: '1904 : 1904 Date System',
  577 + 0x26: 'LEFTMARGIN : Left Margin Measurement',
  578 + 0x27: 'RIGHTMARGIN : Right Margin Measurement',
  579 + 0x28: 'TOPMARGIN : Top Margin Measurement',
  580 + 0x29: 'BOTTOMMARGIN : Bottom Margin Measurement',
  581 + 0x2A: 'PRINTHEADERS : Print Row/Column Labels',
  582 + 0x2B: 'PRINTGRIDLINES : Print Gridlines Flag',
  583 + 0x2F: 'FILEPASS : File Is Password-Protected',
  584 + 0x3C: 'CONTINUE : Continues Long Records',
  585 + 0x3D: 'WINDOW1 : Window Information',
  586 + 0x40: 'BACKUP : Save Backup Version of the File',
  587 + 0x41: 'PANE : Number of Panes and Their Position',
  588 + 0x42: 'CODENAME : VBE Object Name',
  589 + 0x42: 'CODEPAGE : Default Code Page',
  590 + 0x4D: 'PLS : Environment-Specific Print Record',
  591 + 0x50: 'DCON : Data Consolidation Information',
  592 + 0x51: 'DCONREF : Data Consolidation References',
  593 + 0x52: 'DCONNAME : Data Consolidation Named References',
  594 + 0x55: 'DEFCOLWIDTH : Default Width for Columns',
  595 + 0x59: 'XCT : CRN Record Count',
  596 + 0x5A: 'CRN : Nonresident Operands',
  597 + 0x5B: 'FILESHARING : File-Sharing Information',
  598 + 0x5C: 'WRITEACCESS : Write Access User Name',
  599 + 0x5D: 'OBJ : Describes a Graphic Object',
  600 + 0x5E: 'UNCALCED : Recalculation Status',
  601 + 0x5F: 'SAVERECALC : Recalculate Before Save',
  602 + 0x60: 'TEMPLATE : Workbook Is a Template',
  603 + 0x63: 'OBJPROTECT : Objects Are Protected',
  604 + 0x7D: 'COLINFO : Column Formatting Information',
  605 + 0x7E: 'RK : Cell Value, RK Number',
  606 + 0x7F: 'IMDATA : Image Data',
  607 + 0x80: 'GUTS : Size of Row and Column Gutters',
  608 + 0x81: 'WSBOOL : Additional Workspace Information',
  609 + 0x82: 'GRIDSET : State Change of Gridlines Option',
  610 + 0x83: 'HCENTER : Center Between Horizontal Margins',
  611 + 0x84: 'VCENTER : Center Between Vertical Margins',
  612 + 0x85: 'BOUNDSHEET : Sheet Information',
  613 + 0x86: 'WRITEPROT : Workbook Is Write-Protected',
  614 + 0x87: 'ADDIN : Workbook Is an Add-in Macro',
  615 + 0x88: 'EDG : Edition Globals',
  616 + 0x89: 'PUB : Publisher',
  617 + 0x8C: 'COUNTRY : Default Country and WIN.INI Country',
  618 + 0x8D: 'HIDEOBJ : Object Display Options',
  619 + 0x90: 'SORT : Sorting Options',
  620 + 0x91: 'SUB : Subscriber',
  621 + 0x92: 'PALETTE : Color Palette Definition',
  622 + 0x94: 'LHRECORD : .WK? File Conversion Information',
  623 + 0x95: 'LHNGRAPH : Named Graph Information',
  624 + 0x96: 'SOUND : Sound Note',
  625 + 0x98: 'LPR : Sheet Was Printed Using LINE.PRINT(',
  626 + 0x99: 'STANDARDWIDTH : Standard Column Width',
  627 + 0x9A: 'FNGROUPNAME : Function Group Name',
  628 + 0x9B: 'FILTERMODE : Sheet Contains Filtered List',
  629 + 0x9C: 'FNGROUPCOUNT : Built-in Function Group Count',
  630 + 0x9D: 'AUTOFILTERINFO : Drop-Down Arrow Count',
  631 + 0x9E: 'AUTOFILTER : AutoFilter Data',
  632 + 0xA0: 'SCL : Window Zoom Magnification',
  633 + 0xA1: 'SETUP : Page Setup',
  634 + 0xA9: 'COORDLIST : Polygon Object Vertex Coordinates',
  635 + 0xAB: 'GCW : Global Column-Width Flags',
  636 + 0xAE: 'SCENMAN : Scenario Output Data',
  637 + 0xAF: 'SCENARIO : Scenario Data',
  638 + 0xB0: 'SXVIEW : View Definition',
  639 + 0xB1: 'SXVD : View Fields',
  640 + 0xB2: 'SXVI : View Item',
  641 + 0xB4: 'SXIVD : Row/Column Field IDs',
  642 + 0xB5: 'SXLI : Line Item Array',
  643 + 0xB6: 'SXPI : Page Item',
  644 + 0xB8: 'DOCROUTE : Routing Slip Information',
  645 + 0xB9: 'RECIPNAME : Recipient Name',
  646 + 0xBC: 'SHRFMLA : Shared Formula',
  647 + 0xBD: 'MULRK : Multiple RK Cells',
  648 + 0xBE: 'MULBLANK : Multiple Blank Cells',
  649 + 0xC1: 'MMS : ADDMENU / DELMENU Record Group Count',
  650 + 0xC2: 'ADDMENU : Menu Addition',
  651 + 0xC3: 'DELMENU : Menu Deletion',
  652 + 0xC5: 'SXDI : Data Item',
  653 + 0xC6: 'SXDB : PivotTable Cache Data',
  654 + 0xCD: 'SXSTRING : String',
  655 + 0xD0: 'SXTBL : Multiple Consolidation Source Info',
  656 + 0xD1: 'SXTBRGIITM : Page Item Name Count',
  657 + 0xD2: 'SXTBPG : Page Item Indexes',
  658 + 0xD3: 'OBPROJ : Visual Basic Project',
  659 + 0xD5: 'SXIDSTM : Stream ID',
  660 + 0xD6: 'RSTRING : Cell with Character Formatting',
  661 + 0xD7: 'DBCELL : Stream Offsets',
  662 + 0xDA: 'BOOKBOOL : Workbook Option Flag',
  663 + 0xDC: 'PARAMQRY : Query Parameters',
  664 + 0xDC: 'SXEXT : External Source Information',
  665 + 0xDD: 'SCENPROTECT : Scenario Protection',
  666 + 0xDE: 'OLESIZE : Size of OLE Object',
  667 + 0xDF: 'UDDESC : Description String for Chart Autoformat',
  668 + 0xE0: 'XF : Extended Format',
  669 + 0xE1: 'INTERFACEHDR : Beginning of User Interface Records',
  670 + 0xE2: 'INTERFACEEND : End of User Interface Records',
  671 + 0xE3: 'SXVS : View Source',
  672 + 0xE5: 'MERGECELLS : Merged Cells',
  673 + 0xEA: 'TABIDCONF : Sheet Tab ID of Conflict History',
  674 + 0xEB: 'MSODRAWINGGROUP : Microsoft Office Drawing Group',
  675 + 0xEC: 'MSODRAWING : Microsoft Office Drawing',
  676 + 0xED: 'MSODRAWINGSELECTION : Microsoft Office Drawing Selection',
  677 + 0xF0: 'SXRULE : PivotTable Rule Data',
  678 + 0xF1: 'SXEX : PivotTable View Extended Information',
  679 + 0xF2: 'SXFILT : PivotTable Rule Filter',
  680 + 0xF4: 'SXDXF : Pivot Table Formatting',
  681 + 0xF5: 'SXITM : Pivot Table Item Indexes',
  682 + 0xF6: 'SXNAME : PivotTable Name',
  683 + 0xF7: 'SXSELECT : PivotTable Selection Information',
  684 + 0xF8: 'SXPAIR : PivotTable Name Pair',
  685 + 0xF9: 'SXFMLA : Pivot Table Parsed Expression',
  686 + 0xFB: 'SXFORMAT : PivotTable Format Record',
  687 + 0xFC: 'SST : Shared String Table',
  688 + 0xFD: 'LABELSST : Cell Value, String Constant/ SST',
  689 + 0xFF: 'EXTSST : Extended Shared String Table',
  690 + 0x100: 'SXVDEX : Extended PivotTable View Fields',
  691 + 0x103: 'SXFORMULA : PivotTable Formula Record',
  692 + 0x122: 'SXDBEX : PivotTable Cache Data',
  693 + 0x13D: 'TABID : Sheet Tab Index Array',
  694 + 0x160: 'USESELFS : Natural Language Formulas Flag',
  695 + 0x161: 'DSF : Double Stream File',
  696 + 0x162: 'XL5MODIFY : Flag for DSF',
  697 + 0x1A5: 'FILESHARING2 : File-Sharing Information for Shared Lists',
  698 + 0x1A9: 'USERBVIEW : Workbook Custom View Settings',
  699 + 0x1AA: 'USERSVIEWBEGIN : Custom View Settings',
  700 + 0x1AB: 'USERSVIEWEND : End of Custom View Records',
  701 + 0x1AD: 'QSI : External Data Range',
  702 + 0x1AE: 'SUPBOOK : Supporting Workbook',
  703 + 0x1AF: 'PROT4REV : Shared Workbook Protection Flag',
  704 + 0x1B0: 'CONDFMT : Conditional Formatting Range Information',
  705 + 0x1B1: 'CF : Conditional Formatting Conditions',
  706 + 0x1B2: 'DVAL : Data Validation Information',
  707 + 0x1B5: 'DCONBIN : Data Consolidation Information',
  708 + 0x1B6: 'TXO : Text Object',
  709 + 0x1B7: 'REFRESHALL : Refresh Flag',
  710 + 0x1B8: 'HLINK : Hyperlink',
  711 + 0x1BB: 'SXFDBTYPE : SQL Datatype Identifier',
  712 + 0x1BC: 'PROT4REVPASS : Shared Workbook Protection Password',
  713 + 0x1BE: 'DV : Data Validation Criteria',
  714 + 0x1C0: 'EXCEL9FILE : Excel 9 File',
  715 + 0x1C1: 'RECALCID : Recalc Information',
  716 + 0x200: 'DIMENSIONS : Cell Table Size',
  717 + 0x201: 'BLANK : Cell Value, Blank Cell',
  718 + 0x203: 'NUMBER : Cell Value, Floating-Point Number',
  719 + 0x204: 'LABEL : Cell Value, String Constant',
  720 + 0x205: 'BOOLERR : Cell Value, Boolean or Error',
  721 + 0x207: 'STRING : String Value of a Formula',
  722 + 0x208: 'ROW : Describes a Row',
  723 + 0x20B: 'INDEX : Index Record',
  724 + 0x218: 'NAME : Defined Name',
  725 + 0x221: 'ARRAY : Array-Entered Formula',
  726 + 0x223: 'EXTERNNAME : Externally Referenced Name',
  727 + 0x225: 'DEFAULTROWHEIGHT : Default Row Height',
  728 + 0x231: 'FONT : Font Description',
  729 + 0x236: 'TABLE : Data Table',
  730 + 0x23E: 'WINDOW2 : Sheet Window Information',
  731 + 0x293: 'STYLE : Style Information',
  732 + 0x406: 'FORMULA : Cell Formula',
  733 + 0x41E: 'FORMAT : Number Format',
  734 + 0x800: 'HLINKTOOLTIP : Hyperlink Tooltip',
  735 + 0x801: 'WEBPUB : Web Publish Item',
  736 + 0x802: 'QSISXTAG : PivotTable and Query Table Extensions',
  737 + 0x803: 'DBQUERYEXT : Database Query Extensions',
  738 + 0x804: 'EXTSTRING : FRT String',
  739 + 0x805: 'TXTQUERY : Text Query Information',
  740 + 0x806: 'QSIR : Query Table Formatting',
  741 + 0x807: 'QSIF : Query Table Field Formatting',
  742 + 0x809: 'BOF : Beginning of File',
  743 + 0x80A: 'OLEDBCONN : OLE Database Connection',
  744 + 0x80B: 'WOPT : Web Options',
  745 + 0x80C: 'SXVIEWEX : Pivot Table OLAP Extensions',
  746 + 0x80D: 'SXTH : PivotTable OLAP Hierarchy',
  747 + 0x80E: 'SXPIEX : OLAP Page Item Extensions',
  748 + 0x80F: 'SXVDTEX : View Dimension OLAP Extensions',
  749 + 0x810: 'SXVIEWEX9 : Pivot Table Extensions',
  750 + 0x812: 'CONTINUEFRT : Continued FRT',
  751 + 0x813: 'REALTIMEDATA : Real-Time Data (RTD)',
  752 + 0x862: 'SHEETEXT : Extra Sheet Info',
  753 + 0x863: 'BOOKEXT : Extra Book Info',
  754 + 0x864: 'SXADDL : Pivot Table Additional Info',
  755 + 0x865: 'CRASHRECERR : Crash Recovery Error',
  756 + 0x866: 'HFPicture : Header / Footer Picture',
  757 + 0x867: 'FEATHEADR : Shared Feature Header',
  758 + 0x868: 'FEAT : Shared Feature Record',
  759 + 0x86A: 'DATALABEXT : Chart Data Label Extension',
  760 + 0x86B: 'DATALABEXTCONTENTS : Chart Data Label Extension Contents',
  761 + 0x86C: 'CELLWATCH : Cell Watch',
  762 + 0x86d: 'FEATINFO : Shared Feature Info Record',
  763 + 0x871: 'FEATHEADR11 : Shared Feature Header 11',
  764 + 0x872: 'FEAT11 : Shared Feature 11 Record',
  765 + 0x873: 'FEATINFO11 : Shared Feature Info 11 Record',
  766 + 0x874: 'DROPDOWNOBJIDS : Drop Down Object',
  767 + 0x875: 'CONTINUEFRT11 : Continue FRT 11',
  768 + 0x876: 'DCONN : Data Connection',
  769 + 0x877: 'LIST12 : Extra Table Data Introduced in Excel 2007',
  770 + 0x878: 'FEAT12 : Shared Feature 12 Record',
  771 + 0x879: 'CONDFMT12 : Conditional Formatting Range Information 12',
  772 + 0x87A: 'CF12 : Conditional Formatting Condition 12',
  773 + 0x87B: 'CFEX : Conditional Formatting Extension',
  774 + 0x87C: 'XFCRC : XF Extensions Checksum',
  775 + 0x87D: 'XFEXT : XF Extension',
  776 + 0x87E: 'EZFILTER12 : AutoFilter Data Introduced in Excel 2007',
  777 + 0x87F: 'CONTINUEFRT12 : Continue FRT 12',
  778 + 0x881: 'SXADDL12 : Additional Workbook Connections Information',
  779 + 0x884: 'MDTINFO : Information about a Metadata Type',
  780 + 0x885: 'MDXSTR : MDX Metadata String',
  781 + 0x886: 'MDXTUPLE : Tuple MDX Metadata',
  782 + 0x887: 'MDXSET : Set MDX Metadata',
  783 + 0x888: 'MDXPROP : Member Property MDX Metadata',
  784 + 0x889: 'MDXKPI : Key Performance Indicator MDX Metadata',
  785 + 0x88A: 'MDTB : Block of Metadata Records',
  786 + 0x88B: 'PLV : Page Layout View Settings in Excel 2007',
  787 + 0x88C: 'COMPAT12 : Compatibility Checker 12',
  788 + 0x88D: 'DXF : Differential XF',
  789 + 0x88E: 'TABLESTYLES : Table Styles',
  790 + 0x88F: 'TABLESTYLE : Table Style',
  791 + 0x890: 'TABLESTYLEELEMENT : Table Style Element',
  792 + 0x892: 'STYLEEXT : Named Cell Style Extension',
  793 + 0x893: 'NAMEPUBLISH : Publish To Excel Server Data for Name',
  794 + 0x894: 'NAMECMT : Name Comment',
  795 + 0x895: 'SORTDATA12 : Sort Data 12',
  796 + 0x896: 'THEME : Theme',
  797 + 0x897: 'GUIDTYPELIB : VB Project Typelib GUID',
  798 + 0x898: 'FNGRP12 : Function Group',
  799 + 0x899: 'NAMEFNGRP12 : Extra Function Group',
  800 + 0x89A: 'MTRSETTINGS : Multi-Threaded Calculation Settings',
  801 + 0x89B: 'COMPRESSPICTURES : Automatic Picture Compression Mode',
  802 + 0x89C: 'HEADERFOOTER : Header Footer',
  803 + 0x8A3: 'FORCEFULLCALCULATION : Force Full Calculation Settings',
  804 + 0x8c1: 'LISTOBJ : List Object',
  805 + 0x8c2: 'LISTFIELD : List Field',
  806 + 0x8c3: 'LISTDV : List Data Validation',
  807 + 0x8c4: 'LISTCONDFMT : List Conditional Formatting',
  808 + 0x8c5: 'LISTCF : List Cell Formatting',
  809 + 0x8c6: 'FMQRY : Filemaker queries',
  810 + 0x8c7: 'FMSQRY : File maker queries',
  811 + 0x8c8: 'PLV : Page Layout View in Mac Excel 11',
  812 + 0x8c9: 'LNEXT : Extension information for borders in Mac Office 11',
  813 + 0x8ca: 'MKREXT : Extension information for markers in Mac Office 11'
  814 +}
  815 +
  816 +
  817 +# CIC: Call If Callable
  818 +def CIC(expression):
  819 + if callable(expression):
  820 + return expression()
  821 + else:
  822 + return expression
  823 +
  824 +
  825 +# IFF: IF Function
  826 +def IFF(expression, valueTrue, valueFalse):
  827 + if expression:
  828 + return CIC(valueTrue)
  829 + else:
  830 + return CIC(valueFalse)
  831 +
  832 +
  833 +def CombineHexASCII(hexDump, asciiDump, length):
  834 + if hexDump == '':
  835 + return ''
  836 + return hexDump + ' ' + (' ' * (3 * (length - len(asciiDump)))) + asciiDump
  837 +
  838 +def HexASCII(data, length=16):
  839 + result = []
  840 + if len(data) > 0:
  841 + hexDump = ''
  842 + asciiDump = ''
  843 + for i, b in enumerate(data):
  844 + if i % length == 0:
  845 + if hexDump != '':
  846 + result.append(CombineHexASCII(hexDump, asciiDump, length))
  847 + hexDump = '%08X:' % i
  848 + asciiDump = ''
  849 + hexDump += ' %02X' % ord(b)
  850 + asciiDump += IFF(ord(b) >= 32, b, '.')
  851 + result.append(CombineHexASCII(hexDump, asciiDump, length))
  852 + return result
  853 +
  854 +def StringsASCII(data):
  855 + """
  856 + Extract a list of plain ASCII strings of 4+ chars found in data.
  857 + :param data: bytearray or bytes
  858 + :return: list of str (converted to unicode on Python 3)
  859 + """
  860 + # list of bytes strings:
  861 + bytes_strings = re.findall(b'[^\x00-\x08\x0A-\x1F\x7F-\xFF]{4,}', bytes(data))
  862 + return [bytes2str(bs) for bs in bytes_strings]
  863 +
  864 +def StringsUNICODE(data):
  865 + """
  866 + Extract a list of Unicode strings (made of 4+ plain ASCII characters only) found in data.
  867 + :param data: bytearray or bytes
  868 + :return: list of str (converted to unicode on Python 3)
  869 + """
  870 + # list of bytes strings:
  871 + # TODO: check if the null byte should be before or after the ascii byte
  872 + bytes_strings = [foundunicodestring.replace(b'\x00', b'') for foundunicodestring, dummy in re.findall(b'(([^\x00-\x08\x0A-\x1F\x7F-\xFF]\x00){4,})', bytes(data))]
  873 + return [bytes2str(bs) for bs in bytes_strings]
589 874  
  875 +def Strings(data, encodings='sL'):
  876 + """
  877 +
  878 + :param data bytearray: bytearray, data to be scanned for strings
  879 + :param encodings:
  880 + :return: dict with key = 's' or 'L', values = list of str
  881 + """
  882 + dStrings = {}
  883 + for encoding in encodings:
  884 + if encoding == 's':
  885 + dStrings[encoding] = StringsASCII(data)
  886 + elif encoding == 'L':
  887 + dStrings[encoding] = StringsUNICODE(data)
  888 + return dStrings
  889 +
  890 +def ContainsWord(word, expression):
  891 + return struct.pack('<H', word) in expression
  892 +
  893 +# https://docs.microsoft.com/en-us/openspecs/office_file_formats/ms-xls/6e5eed10-5b77-43d6-8dd0-37345f8654ad
  894 +def ParseLoc(expression):
  895 + """
  896 +
  897 + :param expression bytearray: bytearray, data to be parsed
  898 + :return:
  899 + :rtype: str
  900 + """
  901 + formatcodes = 'HH'
  902 + formatsize = struct.calcsize(formatcodes)
  903 + row, column = struct.unpack(formatcodes, expression[0:formatsize])
  904 + rowRelative = column & 0x8000
  905 + colRelative = column & 0x4000
  906 + column = column & 0x3FFF
  907 + if rowRelative:
  908 + rowindicator = '~'
  909 + else:
  910 + rowindicator = ''
  911 + row += 1
  912 + if colRelative:
  913 + colindicator = '~'
  914 + else:
  915 + colindicator = ''
  916 + column += 1
  917 + return 'R%s%dC%s%d' % (rowindicator, row, colindicator, column)
  918 +
  919 +def ParseExpression(expression):
  920 + '''
  921 + Parse an expression into a human readable string.
  922 +
  923 + :param expression bytearray: bytearray, expression data to be parsed
  924 + :return: str, parsed expression as a string (bytes on Python 2, unicode on python 3)
  925 + :rtype: str
  926 + '''
590 927 result = ''
591 928 while len(expression) > 0:
592   - ptgid = expression[0]
593   - expression = expression[1:]
  929 + ptgid = expression[0] # int
  930 + expression = expression[1:] # bytearray
594 931 if ptgid in dTokens:
595 932 result += dTokens[ptgid] + ' '
596   - if ptgid == 0x17:
597   - length = expression[0]
  933 + if ptgid == 0x17: # ptgStr
  934 + length = expression[0] # int
598 935 expression = expression[1:]
599   - if expression[0] == '\x00': # probably BIFF8 -> UNICODE (compressed)
  936 + if expression[0] == 0: # probably BIFF8 -> UNICODE (compressed)
600 937 expression = expression[1:]
601   - result += '"%s" ' % expression[:length]
  938 + result += '"%s" ' % bytes2str(expression[:length])
602 939 expression = expression[length:]
603   - elif ptgid == 0x19:
604   - grbit = expression[0]
  940 + elif ptgid == 0x19: # ptgAttr
  941 + grbit = expression[0] # int
605 942 expression = expression[1:]
606 943 if grbit & 0x04:
607 944 result += 'CHOOSE '
608 945 break
609 946 else:
610 947 expression = expression[2:]
611   - elif ptgid == 0x16 or ptgid == 0x0e:
  948 + elif ptgid == 0x16 or ptgid == 0x0e: # 0x0E: 'ptgNE', 0x16: 'ptgMissArg'
612 949 pass
613   - elif ptgid == 0x1e:
  950 + elif ptgid == 0x1e: # ptgInt
614 951 result += '%d ' % (expression[0] + expression[1] * 0x100)
615 952 expression = expression[2:]
616   - elif ptgid == 0x41:
  953 + elif ptgid == 0x41: # ptgFuncV
617 954 functionid = expression[0] + expression[1] * 0x100
618 955 result += '%s (0x%04x) ' % (dFunctions.get(functionid, '*UNKNOWN FUNCTION*'), functionid)
619 956 expression = expression[2:]
620   - elif ptgid == 0x22 or ptgid == 0x42:
  957 + elif ptgid == 0x22 or ptgid == 0x42: # 0x22: 'ptgFuncVar', 0x42: 'ptgFuncVarV'
621 958 functionid = expression[1] + expression[2] * 0x100
622 959 result += 'args %d func %s (0x%04x) ' % (expression[0], dFunctions.get(functionid, '*UNKNOWN FUNCTION*'), functionid)
623 960 expression = expression[3:]
624   - elif ptgid == 0x23:
  961 + elif ptgid == 0x23: # ptgName
625 962 result += '%04x ' % (expression[0] + expression[1] * 0x100)
  963 + # TODO: looks like we're skipping quite a few bytes
626 964 expression = expression[14:]
627   - elif ptgid == 0x1f:
  965 + elif ptgid == 0x1f: # ptgNum
628 966 result += 'FLOAT '
  967 + # TODO: looks like we're skipping quite a few bytes
629 968 expression = expression[8:]
630   - elif ptgid == 0x26:
631   - expression = expression[4:]
  969 + elif ptgid == 0x26: # ptgMemArea
  970 + expression = expression[4:] # skipping 4 bytes
632 971 expression = expression[expression[0] + expression[1] * 0x100:]
633 972 result += 'REFERENCE-EXPRESSION '
634   - elif ptgid == 0x01:
  973 + elif ptgid == 0x01: # ptgExp
635 974 formatcodes = 'HH'
636 975 formatsize = struct.calcsize(formatcodes)
637 976 row, column = struct.unpack(formatcodes, expression[0:formatsize])
638 977 expression = expression[formatsize:]
639 978 result += 'R%dC%d ' % (row + 1, column + 1)
640   - elif ptgid == 0x24 or ptgid == 0x44:
  979 + elif ptgid == 0x24 or ptgid == 0x44: # 0x24: 'ptgRef', 0x44: 'ptgRefV'
641 980 result += '%s ' % ParseLoc(expression)
642 981 expression = expression[4:]
643   - elif ptgid == 0x3A or ptgid == 0x5A:
  982 + elif ptgid == 0x3A or ptgid == 0x5A: # 0x3A: 'ptgRef3d', 0x5A: 'ptgRef3dV'
644 983 result += '%s ' % ParseLoc(expression[2:])
645 984 expression = expression[6:]
646 985 else:
... ... @@ -651,6 +990,7 @@ def ParseExpression(expression):
651 990 if expression == '':
652 991 return result
653 992 else:
  993 + # 0x006E: 'EXEC', 0x0095: 'REGISTER'
654 994 functions = [dFunctions[functionid] for functionid in [0x6E, 0x95] if ContainsWord(functionid, expression)]
655 995 if functions != []:
656 996 message = ' Could contain following functions: ' + ','.join(functions) + ' -'
... ... @@ -672,267 +1012,6 @@ class cBIFF(object): # cPluginParent):
672 1012 def Analyze(self):
673 1013 result = []
674 1014 macros4Found = False
675   - dOpcodes = {
676   - 0x06: 'FORMULA : Cell Formula',
677   - 0x0A: 'EOF : End of File',
678   - 0x0C: 'CALCCOUNT : Iteration Count',
679   - 0x0D: 'CALCMODE : Calculation Mode',
680   - 0x0E: 'PRECISION : Precision',
681   - 0x0F: 'REFMODE : Reference Mode',
682   - 0x10: 'DELTA : Iteration Increment',
683   - 0x11: 'ITERATION : Iteration Mode',
684   - 0x12: 'PROTECT : Protection Flag',
685   - 0x13: 'PASSWORD : Protection Password',
686   - 0x14: 'HEADER : Print Header on Each Page',
687   - 0x15: 'FOOTER : Print Footer on Each Page',
688   - 0x16: 'EXTERNCOUNT : Number of External References',
689   - 0x17: 'EXTERNSHEET : External Reference',
690   - 0x18: 'LABEL : Cell Value, String Constant',
691   - 0x19: 'WINDOWPROTECT : Windows Are Protected',
692   - 0x1A: 'VERTICALPAGEBREAKS : Explicit Column Page Breaks',
693   - 0x1B: 'HORIZONTALPAGEBREAKS : Explicit Row Page Breaks',
694   - 0x1C: 'NOTE : Comment Associated with a Cell',
695   - 0x1D: 'SELECTION : Current Selection',
696   - 0x22: '1904 : 1904 Date System',
697   - 0x26: 'LEFTMARGIN : Left Margin Measurement',
698   - 0x27: 'RIGHTMARGIN : Right Margin Measurement',
699   - 0x28: 'TOPMARGIN : Top Margin Measurement',
700   - 0x29: 'BOTTOMMARGIN : Bottom Margin Measurement',
701   - 0x2A: 'PRINTHEADERS : Print Row/Column Labels',
702   - 0x2B: 'PRINTGRIDLINES : Print Gridlines Flag',
703   - 0x2F: 'FILEPASS : File Is Password-Protected',
704   - 0x3C: 'CONTINUE : Continues Long Records',
705   - 0x3D: 'WINDOW1 : Window Information',
706   - 0x40: 'BACKUP : Save Backup Version of the File',
707   - 0x41: 'PANE : Number of Panes and Their Position',
708   - 0x42: 'CODENAME : VBE Object Name',
709   - 0x42: 'CODEPAGE : Default Code Page',
710   - 0x4D: 'PLS : Environment-Specific Print Record',
711   - 0x50: 'DCON : Data Consolidation Information',
712   - 0x51: 'DCONREF : Data Consolidation References',
713   - 0x52: 'DCONNAME : Data Consolidation Named References',
714   - 0x55: 'DEFCOLWIDTH : Default Width for Columns',
715   - 0x59: 'XCT : CRN Record Count',
716   - 0x5A: 'CRN : Nonresident Operands',
717   - 0x5B: 'FILESHARING : File-Sharing Information',
718   - 0x5C: 'WRITEACCESS : Write Access User Name',
719   - 0x5D: 'OBJ : Describes a Graphic Object',
720   - 0x5E: 'UNCALCED : Recalculation Status',
721   - 0x5F: 'SAVERECALC : Recalculate Before Save',
722   - 0x60: 'TEMPLATE : Workbook Is a Template',
723   - 0x63: 'OBJPROTECT : Objects Are Protected',
724   - 0x7D: 'COLINFO : Column Formatting Information',
725   - 0x7E: 'RK : Cell Value, RK Number',
726   - 0x7F: 'IMDATA : Image Data',
727   - 0x80: 'GUTS : Size of Row and Column Gutters',
728   - 0x81: 'WSBOOL : Additional Workspace Information',
729   - 0x82: 'GRIDSET : State Change of Gridlines Option',
730   - 0x83: 'HCENTER : Center Between Horizontal Margins',
731   - 0x84: 'VCENTER : Center Between Vertical Margins',
732   - 0x85: 'BOUNDSHEET : Sheet Information',
733   - 0x86: 'WRITEPROT : Workbook Is Write-Protected',
734   - 0x87: 'ADDIN : Workbook Is an Add-in Macro',
735   - 0x88: 'EDG : Edition Globals',
736   - 0x89: 'PUB : Publisher',
737   - 0x8C: 'COUNTRY : Default Country and WIN.INI Country',
738   - 0x8D: 'HIDEOBJ : Object Display Options',
739   - 0x90: 'SORT : Sorting Options',
740   - 0x91: 'SUB : Subscriber',
741   - 0x92: 'PALETTE : Color Palette Definition',
742   - 0x94: 'LHRECORD : .WK? File Conversion Information',
743   - 0x95: 'LHNGRAPH : Named Graph Information',
744   - 0x96: 'SOUND : Sound Note',
745   - 0x98: 'LPR : Sheet Was Printed Using LINE.PRINT(',
746   - 0x99: 'STANDARDWIDTH : Standard Column Width',
747   - 0x9A: 'FNGROUPNAME : Function Group Name',
748   - 0x9B: 'FILTERMODE : Sheet Contains Filtered List',
749   - 0x9C: 'FNGROUPCOUNT : Built-in Function Group Count',
750   - 0x9D: 'AUTOFILTERINFO : Drop-Down Arrow Count',
751   - 0x9E: 'AUTOFILTER : AutoFilter Data',
752   - 0xA0: 'SCL : Window Zoom Magnification',
753   - 0xA1: 'SETUP : Page Setup',
754   - 0xA9: 'COORDLIST : Polygon Object Vertex Coordinates',
755   - 0xAB: 'GCW : Global Column-Width Flags',
756   - 0xAE: 'SCENMAN : Scenario Output Data',
757   - 0xAF: 'SCENARIO : Scenario Data',
758   - 0xB0: 'SXVIEW : View Definition',
759   - 0xB1: 'SXVD : View Fields',
760   - 0xB2: 'SXVI : View Item',
761   - 0xB4: 'SXIVD : Row/Column Field IDs',
762   - 0xB5: 'SXLI : Line Item Array',
763   - 0xB6: 'SXPI : Page Item',
764   - 0xB8: 'DOCROUTE : Routing Slip Information',
765   - 0xB9: 'RECIPNAME : Recipient Name',
766   - 0xBC: 'SHRFMLA : Shared Formula',
767   - 0xBD: 'MULRK : Multiple RK Cells',
768   - 0xBE: 'MULBLANK : Multiple Blank Cells',
769   - 0xC1: 'MMS : ADDMENU / DELMENU Record Group Count',
770   - 0xC2: 'ADDMENU : Menu Addition',
771   - 0xC3: 'DELMENU : Menu Deletion',
772   - 0xC5: 'SXDI : Data Item',
773   - 0xC6: 'SXDB : PivotTable Cache Data',
774   - 0xCD: 'SXSTRING : String',
775   - 0xD0: 'SXTBL : Multiple Consolidation Source Info',
776   - 0xD1: 'SXTBRGIITM : Page Item Name Count',
777   - 0xD2: 'SXTBPG : Page Item Indexes',
778   - 0xD3: 'OBPROJ : Visual Basic Project',
779   - 0xD5: 'SXIDSTM : Stream ID',
780   - 0xD6: 'RSTRING : Cell with Character Formatting',
781   - 0xD7: 'DBCELL : Stream Offsets',
782   - 0xDA: 'BOOKBOOL : Workbook Option Flag',
783   - 0xDC: 'PARAMQRY : Query Parameters',
784   - 0xDC: 'SXEXT : External Source Information',
785   - 0xDD: 'SCENPROTECT : Scenario Protection',
786   - 0xDE: 'OLESIZE : Size of OLE Object',
787   - 0xDF: 'UDDESC : Description String for Chart Autoformat',
788   - 0xE0: 'XF : Extended Format',
789   - 0xE1: 'INTERFACEHDR : Beginning of User Interface Records',
790   - 0xE2: 'INTERFACEEND : End of User Interface Records',
791   - 0xE3: 'SXVS : View Source',
792   - 0xE5: 'MERGECELLS : Merged Cells',
793   - 0xEA: 'TABIDCONF : Sheet Tab ID of Conflict History',
794   - 0xEB: 'MSODRAWINGGROUP : Microsoft Office Drawing Group',
795   - 0xEC: 'MSODRAWING : Microsoft Office Drawing',
796   - 0xED: 'MSODRAWINGSELECTION : Microsoft Office Drawing Selection',
797   - 0xF0: 'SXRULE : PivotTable Rule Data',
798   - 0xF1: 'SXEX : PivotTable View Extended Information',
799   - 0xF2: 'SXFILT : PivotTable Rule Filter',
800   - 0xF4: 'SXDXF : Pivot Table Formatting',
801   - 0xF5: 'SXITM : Pivot Table Item Indexes',
802   - 0xF6: 'SXNAME : PivotTable Name',
803   - 0xF7: 'SXSELECT : PivotTable Selection Information',
804   - 0xF8: 'SXPAIR : PivotTable Name Pair',
805   - 0xF9: 'SXFMLA : Pivot Table Parsed Expression',
806   - 0xFB: 'SXFORMAT : PivotTable Format Record',
807   - 0xFC: 'SST : Shared String Table',
808   - 0xFD: 'LABELSST : Cell Value, String Constant/ SST',
809   - 0xFF: 'EXTSST : Extended Shared String Table',
810   - 0x100: 'SXVDEX : Extended PivotTable View Fields',
811   - 0x103: 'SXFORMULA : PivotTable Formula Record',
812   - 0x122: 'SXDBEX : PivotTable Cache Data',
813   - 0x13D: 'TABID : Sheet Tab Index Array',
814   - 0x160: 'USESELFS : Natural Language Formulas Flag',
815   - 0x161: 'DSF : Double Stream File',
816   - 0x162: 'XL5MODIFY : Flag for DSF',
817   - 0x1A5: 'FILESHARING2 : File-Sharing Information for Shared Lists',
818   - 0x1A9: 'USERBVIEW : Workbook Custom View Settings',
819   - 0x1AA: 'USERSVIEWBEGIN : Custom View Settings',
820   - 0x1AB: 'USERSVIEWEND : End of Custom View Records',
821   - 0x1AD: 'QSI : External Data Range',
822   - 0x1AE: 'SUPBOOK : Supporting Workbook',
823   - 0x1AF: 'PROT4REV : Shared Workbook Protection Flag',
824   - 0x1B0: 'CONDFMT : Conditional Formatting Range Information',
825   - 0x1B1: 'CF : Conditional Formatting Conditions',
826   - 0x1B2: 'DVAL : Data Validation Information',
827   - 0x1B5: 'DCONBIN : Data Consolidation Information',
828   - 0x1B6: 'TXO : Text Object',
829   - 0x1B7: 'REFRESHALL : Refresh Flag',
830   - 0x1B8: 'HLINK : Hyperlink',
831   - 0x1BB: 'SXFDBTYPE : SQL Datatype Identifier',
832   - 0x1BC: 'PROT4REVPASS : Shared Workbook Protection Password',
833   - 0x1BE: 'DV : Data Validation Criteria',
834   - 0x1C0: 'EXCEL9FILE : Excel 9 File',
835   - 0x1C1: 'RECALCID : Recalc Information',
836   - 0x200: 'DIMENSIONS : Cell Table Size',
837   - 0x201: 'BLANK : Cell Value, Blank Cell',
838   - 0x203: 'NUMBER : Cell Value, Floating-Point Number',
839   - 0x204: 'LABEL : Cell Value, String Constant',
840   - 0x205: 'BOOLERR : Cell Value, Boolean or Error',
841   - 0x207: 'STRING : String Value of a Formula',
842   - 0x208: 'ROW : Describes a Row',
843   - 0x20B: 'INDEX : Index Record',
844   - 0x218: 'NAME : Defined Name',
845   - 0x221: 'ARRAY : Array-Entered Formula',
846   - 0x223: 'EXTERNNAME : Externally Referenced Name',
847   - 0x225: 'DEFAULTROWHEIGHT : Default Row Height',
848   - 0x231: 'FONT : Font Description',
849   - 0x236: 'TABLE : Data Table',
850   - 0x23E: 'WINDOW2 : Sheet Window Information',
851   - 0x293: 'STYLE : Style Information',
852   - 0x406: 'FORMULA : Cell Formula',
853   - 0x41E: 'FORMAT : Number Format',
854   - 0x800: 'HLINKTOOLTIP : Hyperlink Tooltip',
855   - 0x801: 'WEBPUB : Web Publish Item',
856   - 0x802: 'QSISXTAG : PivotTable and Query Table Extensions',
857   - 0x803: 'DBQUERYEXT : Database Query Extensions',
858   - 0x804: 'EXTSTRING : FRT String',
859   - 0x805: 'TXTQUERY : Text Query Information',
860   - 0x806: 'QSIR : Query Table Formatting',
861   - 0x807: 'QSIF : Query Table Field Formatting',
862   - 0x809: 'BOF : Beginning of File',
863   - 0x80A: 'OLEDBCONN : OLE Database Connection',
864   - 0x80B: 'WOPT : Web Options',
865   - 0x80C: 'SXVIEWEX : Pivot Table OLAP Extensions',
866   - 0x80D: 'SXTH : PivotTable OLAP Hierarchy',
867   - 0x80E: 'SXPIEX : OLAP Page Item Extensions',
868   - 0x80F: 'SXVDTEX : View Dimension OLAP Extensions',
869   - 0x810: 'SXVIEWEX9 : Pivot Table Extensions',
870   - 0x812: 'CONTINUEFRT : Continued FRT',
871   - 0x813: 'REALTIMEDATA : Real-Time Data (RTD)',
872   - 0x862: 'SHEETEXT : Extra Sheet Info',
873   - 0x863: 'BOOKEXT : Extra Book Info',
874   - 0x864: 'SXADDL : Pivot Table Additional Info',
875   - 0x865: 'CRASHRECERR : Crash Recovery Error',
876   - 0x866: 'HFPicture : Header / Footer Picture',
877   - 0x867: 'FEATHEADR : Shared Feature Header',
878   - 0x868: 'FEAT : Shared Feature Record',
879   - 0x86A: 'DATALABEXT : Chart Data Label Extension',
880   - 0x86B: 'DATALABEXTCONTENTS : Chart Data Label Extension Contents',
881   - 0x86C: 'CELLWATCH : Cell Watch',
882   - 0x86d: 'FEATINFO : Shared Feature Info Record',
883   - 0x871: 'FEATHEADR11 : Shared Feature Header 11',
884   - 0x872: 'FEAT11 : Shared Feature 11 Record',
885   - 0x873: 'FEATINFO11 : Shared Feature Info 11 Record',
886   - 0x874: 'DROPDOWNOBJIDS : Drop Down Object',
887   - 0x875: 'CONTINUEFRT11 : Continue FRT 11',
888   - 0x876: 'DCONN : Data Connection',
889   - 0x877: 'LIST12 : Extra Table Data Introduced in Excel 2007',
890   - 0x878: 'FEAT12 : Shared Feature 12 Record',
891   - 0x879: 'CONDFMT12 : Conditional Formatting Range Information 12',
892   - 0x87A: 'CF12 : Conditional Formatting Condition 12',
893   - 0x87B: 'CFEX : Conditional Formatting Extension',
894   - 0x87C: 'XFCRC : XF Extensions Checksum',
895   - 0x87D: 'XFEXT : XF Extension',
896   - 0x87E: 'EZFILTER12 : AutoFilter Data Introduced in Excel 2007',
897   - 0x87F: 'CONTINUEFRT12 : Continue FRT 12',
898   - 0x881: 'SXADDL12 : Additional Workbook Connections Information',
899   - 0x884: 'MDTINFO : Information about a Metadata Type',
900   - 0x885: 'MDXSTR : MDX Metadata String',
901   - 0x886: 'MDXTUPLE : Tuple MDX Metadata',
902   - 0x887: 'MDXSET : Set MDX Metadata',
903   - 0x888: 'MDXPROP : Member Property MDX Metadata',
904   - 0x889: 'MDXKPI : Key Performance Indicator MDX Metadata',
905   - 0x88A: 'MDTB : Block of Metadata Records',
906   - 0x88B: 'PLV : Page Layout View Settings in Excel 2007',
907   - 0x88C: 'COMPAT12 : Compatibility Checker 12',
908   - 0x88D: 'DXF : Differential XF',
909   - 0x88E: 'TABLESTYLES : Table Styles',
910   - 0x88F: 'TABLESTYLE : Table Style',
911   - 0x890: 'TABLESTYLEELEMENT : Table Style Element',
912   - 0x892: 'STYLEEXT : Named Cell Style Extension',
913   - 0x893: 'NAMEPUBLISH : Publish To Excel Server Data for Name',
914   - 0x894: 'NAMECMT : Name Comment',
915   - 0x895: 'SORTDATA12 : Sort Data 12',
916   - 0x896: 'THEME : Theme',
917   - 0x897: 'GUIDTYPELIB : VB Project Typelib GUID',
918   - 0x898: 'FNGRP12 : Function Group',
919   - 0x899: 'NAMEFNGRP12 : Extra Function Group',
920   - 0x89A: 'MTRSETTINGS : Multi-Threaded Calculation Settings',
921   - 0x89B: 'COMPRESSPICTURES : Automatic Picture Compression Mode',
922   - 0x89C: 'HEADERFOOTER : Header Footer',
923   - 0x8A3: 'FORCEFULLCALCULATION : Force Full Calculation Settings',
924   - 0x8c1: 'LISTOBJ : List Object',
925   - 0x8c2: 'LISTFIELD : List Field',
926   - 0x8c3: 'LISTDV : List Data Validation',
927   - 0x8c4: 'LISTCONDFMT : List Conditional Formatting',
928   - 0x8c5: 'LISTCF : List Cell Formatting',
929   - 0x8c6: 'FMQRY : Filemaker queries',
930   - 0x8c7: 'FMSQRY : File maker queries',
931   - 0x8c8: 'PLV : Page Layout View in Mac Excel 11',
932   - 0x8c9: 'LNEXT : Extension information for borders in Mac Office 11',
933   - 0x8ca: 'MKREXT : Extension information for markers in Mac Office 11'
934   - }
935   -
936 1015 if self.streamname in [['Workbook'], ['Book']]:
937 1016 self.ran = True
938 1017 # use a bytearray to have Python 2+3 compatibility with the same code (no need for ord())
... ... @@ -988,7 +1067,7 @@ class cBIFF(object): # cPluginParent):
988 1067 line += ' - build-in-name %d %s' % (code, dBuildInNames.get(code, '?'))
989 1068 else:
990 1069 pass
991   - line += ' - %s' % (data[14:14+data[3]])
  1070 + line += ' - %s' % bytes2str(data[14:14+data[3]])
992 1071 # print(line)
993 1072  
994 1073 # BOUNDSHEET record
... ... @@ -1002,7 +1081,7 @@ class cBIFF(object): # cPluginParent):
1002 1081  
1003 1082 # STRING record
1004 1083 if opcode == 0x207 and len(data) >= 4:
1005   - values = Strings(data[3:]).values()
  1084 + values = list(Strings(data[3:]).values())
1006 1085 strings = ''
1007 1086 if values[0] != []:
1008 1087 strings += ' '.join(values[0])
... ...