diff options
| author | Andrew Lamoureux <andrew@vector35.com> | 2019-03-21 23:32:35 -0400 |
|---|---|---|
| committer | Andrew Lamoureux <andrew@vector35.com> | 2019-03-21 23:32:35 -0400 |
| commit | b5fd5d118338159eed5969c5df4ad7d55d732a3d (patch) | |
| tree | c0a94a00b404d0116ed0dd07bcf39270667772f7 /python/examples | |
| parent | 86cea24d2bd727324a458a4ed282175353427028 (diff) | |
kaitai: better error reporting when parser fails
Diffstat (limited to 'python/examples')
| -rw-r--r-- | python/examples/kaitai/kshelpers.py | 78 | ||||
| -rw-r--r-- | python/examples/kaitai/view.py | 31 |
2 files changed, 61 insertions, 48 deletions
diff --git a/python/examples/kaitai/kshelpers.py b/python/examples/kaitai/kshelpers.py index 43b8e525..d4507572 100644 --- a/python/examples/kaitai/kshelpers.py +++ b/python/examples/kaitai/kshelpers.py @@ -9,7 +9,7 @@ import struct import types import importlib -import binaryninja +from binaryninja import log from PySide2.QtCore import Qt from PySide2.QtWidgets import QTreeWidgetItem @@ -29,7 +29,7 @@ else: # length: int total length of data def idData(dataSample, length): result = None - #print('idData() here with sample: %s' % repr(dataSample)) + #log.log_debug('idData() here with sample: %s' % repr(dataSample)) if len(dataSample) < 16: return result @@ -55,7 +55,7 @@ def idData(dataSample, length): if dataSample[0:2] == b'\x1f\x8b' and dataSample[2:3]==b'\x08': result = 'gzip' - #print('idData() returning \'%s\'' % result) + #log.log_debug('idData() returning \'%s\'' % result) return result def idFile(fpath): @@ -73,17 +73,18 @@ def ksImportClass(moduleName): classThing = None try: - #print('__package__: -%s-' % __package__) # 'kaitai' - #print('__name__: -%s-' % __name__) # 'kaitai.kshelpers' - #print('moduleName: -%s-' % moduleName) - #print('importlib.import_module(.%s, %s)' % (moduleName, __package__)) - print('importing kaitai module "%s"' % moduleName) + #log.log_debug('__package__: -%s-' % __package__) # 'kaitai' + #log.log_debug('__name__: -%s-' % __name__) # 'kaitai.kshelpers' + #log.log_debug('moduleName: -%s-' % moduleName) + #log.log_debug('importlib.import_module(.%s, %s)' % (moduleName, __package__)) + log.log_info('importing kaitai module %s' % moduleName) module = importlib.import_module('.'+moduleName, __package__) className = ksModuleToClass(moduleName) - #print('className: -%s-' % className) + #log.log_debug('className: -%s-' % className) classThing = getattr(module, className) except Exception as e: - print(e) + log.log_error('importing kaitai module %s' % moduleName) + #log.log_debug(e) pass return classThing @@ -91,25 +92,33 @@ def ksImportClass(moduleName): def parseFpath(fpath, ksModuleName=None): if not ksModuleName: ksModuleName = idFile(fpath) - #print('parseFpath() using kaitai format: %s' % ksModuleName) + #log.log_debug('parseFpath() using kaitai format: %s' % ksModuleName) ksClass = ksImportClass(ksModuleName) if not ksClass: return None - parsed = ksClass.from_file(fpath) - parsed._read() + try: + parsed = ksClass.from_file(fpath) + parsed._read() + except Exception: + log.log_error('kaitai module %s threw exception, check file type' % ksModuleName) + return parsed def parseData(data, ksModuleName=None): if not ksModuleName: ksModuleName = idData(data, len(data)) - #print('parseData() using kaitai format: %s' % ksModuleName) + #log.log_debug('parseData() using kaitai format: %s' % ksModuleName) ksClass = ksImportClass(ksModuleName) if not ksClass: return None - parsed = ksClass.from_bytes(data) - parsed._read() + try: + parsed = ksClass.from_bytes(data) + parsed._read() + except Exception: + log.log_error('kaitai module %s threw exception, check file type' % ksModuleName) + return parsed def parseIo(ioObj, ksModuleName=None): @@ -119,15 +128,20 @@ def parseIo(ioObj, ksModuleName=None): if not ksModuleName: ioObj.seek(0, io.SEEK_SET) ksModuleName = idData(ioObj.read(16), length) - #print('parseIo() using kaitai format: %s' % ksModuleName) + #log.log_debug('parseIo() using kaitai format: %s' % ksModuleName) ioObj.seek(0, io.SEEK_SET) ksClass = ksImportClass(ksModuleName) if not ksClass: return None - ioObj.seek(0, io.SEEK_SET) - parsed = ksClass.from_io(ioObj) - parsed._read() + try: + ioObj.seek(0, io.SEEK_SET) + parsed = ksClass.from_io(ioObj) + parsed._read() + except Exception: + log.log_error('kaitai module %s threw exception, check file type' % ksModuleName) + parsed = None + return parsed #------------------------------------------------------------------------------ @@ -145,7 +159,7 @@ class KaitaiBinaryViewIO: self.position = 0 def seek(self, offs, whence=io.SEEK_SET): - #print('seek(0x%X, %d)' % (offs, whence)) + #log.log_debug('seek(0x%X, %d)' % (offs, whence)) if whence == io.SEEK_SET: self.position = offs elif whence == io.SEEK_CUR: @@ -156,7 +170,7 @@ class KaitaiBinaryViewIO: raise Exception('unknown whence in seek(): %d' % whence) def tell(self): - #print('tell() returning 0x%X' % (self.position)) + #log.log_debug('tell() returning 0x%X' % (self.position)) return self.position def read(self, length=None): @@ -164,7 +178,7 @@ class KaitaiBinaryViewIO: if length == None: length = len(self.binaryView) - self.position - #print('read(%d) (starting at position: 0x%X)' % (length, self.position)) + #log.log_debug('read(%d) (starting at position: 0x%X)' % (length, self.position)) data = self.binaryView.read(self.position, length) self.position += length return data @@ -383,16 +397,16 @@ def createLeaf(fieldName, obj): objtype = type(obj) if objtype == types.FunctionType: - #print('reject %s because its a function' % fieldName) + #log.log_debug('reject %s because its a function' % fieldName) return None elif isinstance(obj, type): - #print('reject %s because its a type' % fieldName) + #log.log_debug('reject %s because its a type' % fieldName) return None elif sys.version_info[0] == 2 and callable(obj): - #print('reject %s because its a callable' % fieldName) + #log.log_debug('reject %s because its a callable' % fieldName) return None elif sys.version_info[0] == 3 and hasattr(obj, '__call__'): - #print('reject %s because its a callable' % fieldName) + #log.log_debug('reject %s because its a callable' % fieldName) return None fieldValue = None @@ -410,7 +424,7 @@ def createLeaf(fieldName, obj): elif str(objtype).startswith('<enum '): fieldValue = '%s' % (obj) else: - #print('field %s has type: -%s-' % (fieldName,str(objtype))) + #log.log_debug('field %s has type: -%s-' % (fieldName,str(objtype))) pass if fieldValue: @@ -419,9 +433,9 @@ def createLeaf(fieldName, obj): widget.setValue(fieldValue) return widget else: - print('rejected leaf node to %s' % fieldName) - print(obj) - print(type(obj)) + #log.log_debug('rejected leaf node to %s' % fieldName) + #log.log_debug(obj) + #log.log_debug(type(obj)) return None # ARG TYPE NOTES @@ -433,7 +447,7 @@ def createLeaf(fieldName, obj): def populateChild(ksobj, fieldName, fieldLabel, fieldValue, widget): if fieldLabel: widget.setLabel(fieldLabel) - #print('setting Label: %s' % fieldLabel) + #log.log_debug('setting Label: %s' % fieldLabel) if fieldValue: widget.setValue(fieldValue) diff --git a/python/examples/kaitai/view.py b/python/examples/kaitai/view.py index ee1ef6c0..e20aaf46 100644 --- a/python/examples/kaitai/view.py +++ b/python/examples/kaitai/view.py @@ -73,17 +73,14 @@ class KaitaiView(QScrollArea, View): # parse the file using Kaitai, construct the TreeWidget def kaitaiParse(self, formatName=None): - #print('kaitaiParse() with len(bv)=%d and bv.file.filename=%s' % (len(self.binaryView), self.binaryView.file.filename)) + #log_debug('kaitaiParse() with len(bv)=%d and bv.file.filename=%s' % (len(self.binaryView), self.binaryView.file.filename)) if len(self.binaryView) == 0: return kaitaiIO = kshelpers.KaitaiBinaryViewIO(self.binaryView) - if not kaitaiIO: - print('ERROR: initializing kaitai binary view') parsed = kshelpers.parseIo(kaitaiIO, formatName) if not parsed: - print('ERROR: parsing the binary view') return tree = kshelpers.buildQtree(parsed) @@ -107,7 +104,6 @@ class KaitaiView(QScrollArea, View): # add root's children as top level items self.treeWidget.insertTopLevelItems(0, tree.takeChildren()) - # enable sorting self.treeWidget.setSortingEnabled(True) self.treeWidget.sortByColumn(2, Qt.AscendingOrder) @@ -134,23 +130,23 @@ class KaitaiView(QScrollArea, View): def getStart(self): result = self.binaryView.start - #print('getStart() returning '+str(result)) + #log.log_debug('getStart() returning '+str(result)) return result def getEnd(self): result = self.binaryView.end - #print('getEnd() returning '+str(result)) + #log.log_debug('getEnd() returning '+str(result)) return result def getLength(self): result = len(self.binaryView) - #print('getLength() returning '+str(result)) + #log.log_debug('getLength() returning '+str(result)) return result def getCurrentOffset(self): result = self.rootSelectionStart + int((self.rootSelectionEnd - self.rootSelectionStart)/2) #result = self.rootSelectionStart - #print('getCurrentOffset() returning '+str(result)) + #log.log_debug('getCurrentOffset() returning '+str(result)) return result def getSelectionOffsets(self): @@ -159,11 +155,11 @@ class KaitaiView(QScrollArea, View): result = self.hexWidget.getSelectionOffsets() else: result = (self.rootSelectionStart, self.rootSelectionStart) - #print('getSelectionOffsets() returning '+str(result)) + #log.log_debug('getSelectionOffsets() returning '+str(result)) return result def setCurrentOffset(self, offset): - #print('setCurrentOffset(0x%X)' % offset) + #log.log_debug('setCurrentOffset(0x%X)' % offset) self.rootSelectionStart = offset UIContext.updateStatus(True) @@ -171,16 +167,19 @@ class KaitaiView(QScrollArea, View): return binaryninjaui.getMonospaceFont(self) def navigate(self, addr): - #print('navigate()') + #log.log_debug('navigate()') return False def navigateToFileOffset(self, offset): - #print('navigateToFileOffset()') + #log.log_debug('navigateToFileOffset()') return False def onTreeSelect(self, wtf=None): # get KaitaiTreeWidgetItem - item = self.treeWidget.selectedItems()[0] + items = self.treeWidget.selectedItems() + if not items or len(items)<1: + return + item = items[0] # build path, inform user structPath = item.label @@ -242,7 +241,7 @@ class KaitaiView(QScrollArea, View): self.ioCurrent = _io # now position selection in whatever HexEditor is current - #print('selecting to [0x%X, 0x%X)' % (start, end)) + #log.log_debug('selecting to [0x%X, 0x%X)' % (start, end)) self.hexWidget.setSelectionRange(start, end) # set hex group title to reflect current selection @@ -258,7 +257,7 @@ class KaitaiViewType(ViewType): # binaryView: BinaryView def getPriority(self, binaryView, filename): #return 100 - #print('len(bv)=0x%X executable=%d bytes=%s' % (len(binaryView), binaryView.executable, repr(binaryView.read(0,4)))) + #log.log_debug('len(bv)=0x%X executable=%d bytes=%s' % (len(binaryView), binaryView.executable, repr(binaryView.read(0,4)))) # executable means the view is mapped like an OS loader would load an executable (eg: view=ELF) # !executable means executable image is not mapped (eg: view=Raw) (or something like .png is loaded) |
