summaryrefslogtreecommitdiff
path: root/python/examples
diff options
context:
space:
mode:
authorAndrew Lamoureux <andrew@vector35.com>2019-03-21 23:32:35 -0400
committerAndrew Lamoureux <andrew@vector35.com>2019-03-21 23:32:35 -0400
commitb5fd5d118338159eed5969c5df4ad7d55d732a3d (patch)
treec0a94a00b404d0116ed0dd07bcf39270667772f7 /python/examples
parent86cea24d2bd727324a458a4ed282175353427028 (diff)
kaitai: better error reporting when parser fails
Diffstat (limited to 'python/examples')
-rw-r--r--python/examples/kaitai/kshelpers.py78
-rw-r--r--python/examples/kaitai/view.py31
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)