From 243bf0c8ff0fc1ec0a40e276541ed6be1888d2af Mon Sep 17 00:00:00 2001 From: Andrew Lamoureux Date: Fri, 22 Mar 2019 00:06:32 -0400 Subject: kaitai: disclude circular formats on py2, more error reporting --- python/examples/kaitai/kshelpers.py | 4 +-- python/examples/kaitai/menu.py | 56 ++++++++++++++++++++++--------------- python/examples/kaitai/view.py | 18 ++++++++---- 3 files changed, 49 insertions(+), 29 deletions(-) (limited to 'python') diff --git a/python/examples/kaitai/kshelpers.py b/python/examples/kaitai/kshelpers.py index d4507572..a4453739 100644 --- a/python/examples/kaitai/kshelpers.py +++ b/python/examples/kaitai/kshelpers.py @@ -70,7 +70,7 @@ def ksImportClass(moduleName): global __name__, __package__ if not moduleName: return None - + classThing = None try: #log.log_debug('__package__: -%s-' % __package__) # 'kaitai' @@ -315,7 +315,7 @@ def buildQtree(ksobj): if ('_m_'+fieldName) in fields: # favor the '_m_' version which seems to get the debug info continue - + subObj = getattr(ksobj, fieldName) child = None diff --git a/python/examples/kaitai/menu.py b/python/examples/kaitai/menu.py index e6f7454a..b32e7746 100644 --- a/python/examples/kaitai/menu.py +++ b/python/examples/kaitai/menu.py @@ -1,5 +1,7 @@ # -*- coding: utf-8 -*- +import sys + # binja stuff from binaryninjaui import StatusBarWidget, ContextMenuManager, Menu, UIActionHandler, UIAction @@ -123,16 +125,20 @@ class KaitaiOptionsWidget(QLabel): UIAction.registerAction("media\\wav") UIAction.registerAction("network\\bitcoin_transaction") UIAction.registerAction("network\\dns_packet") - UIAction.registerAction("network\\ethernet_frame") UIAction.registerAction("network\\hccap") UIAction.registerAction("network\\hccapx") UIAction.registerAction("network\\icmp_packet") - UIAction.registerAction("network\\ipv4_packet") - UIAction.registerAction("network\\ipv6_packet") - UIAction.registerAction("network\\microsoft_network_monitor_v2") - UIAction.registerAction("network\\packet_ppi") - UIAction.registerAction("network\\pcap") - UIAction.registerAction("network\\protocol_body") + + # currently on py3 can handle the circular dependency hell + if sys.version_info[0] == 3: + UIAction.registerAction("network\\ethernet_frame") + UIAction.registerAction("network\\ipv4_packet") + UIAction.registerAction("network\\ipv6_packet") + UIAction.registerAction("network\\microsoft_network_monitor_v2") + UIAction.registerAction("network\\packet_ppi") + UIAction.registerAction("network\\pcap") + UIAction.registerAction("network\\protocol_body") + UIAction.registerAction("network\\rtcp_payload") UIAction.registerAction("network\\rtp_packet") UIAction.registerAction("network\\tcp_segment") @@ -253,16 +259,19 @@ class KaitaiOptionsWidget(QLabel): self.menu.addAction("media\\wav", "formats") self.menu.addAction("network\\bitcoin_transaction", "formats") self.menu.addAction("network\\dns_packet", "formats") - self.menu.addAction("network\\ethernet_frame", "formats") self.menu.addAction("network\\hccap", "formats") self.menu.addAction("network\\hccapx", "formats") self.menu.addAction("network\\icmp_packet", "formats") - self.menu.addAction("network\\ipv4_packet", "formats") - self.menu.addAction("network\\ipv6_packet", "formats") - self.menu.addAction("network\\microsoft_network_monitor_v2", "formats") - self.menu.addAction("network\\packet_ppi", "formats") - self.menu.addAction("network\\pcap", "formats") - self.menu.addAction("network\\protocol_body", "formats") + + if sys.version_info[0] == 3: + self.menu.addAction("network\\ethernet_frame", "formats") + self.menu.addAction("network\\ipv4_packet", "formats") + self.menu.addAction("network\\ipv6_packet", "formats") + self.menu.addAction("network\\microsoft_network_monitor_v2", "formats") + self.menu.addAction("network\\packet_ppi", "formats") + self.menu.addAction("network\\pcap", "formats") + self.menu.addAction("network\\protocol_body", "formats") + self.menu.addAction("network\\rtcp_payload", "formats") self.menu.addAction("network\\rtp_packet", "formats") self.menu.addAction("network\\tcp_segment", "formats") @@ -383,16 +392,19 @@ class KaitaiOptionsWidget(QLabel): self.actionHandler.bindAction("media\\wav", UIAction(self.on_wav)) self.actionHandler.bindAction("network\\bitcoin_transaction", UIAction(self.on_bitcoin_transaction)) self.actionHandler.bindAction("network\\dns_packet", UIAction(self.on_dns_packet)) - self.actionHandler.bindAction("network\\ethernet_frame", UIAction(self.on_ethernet_frame)) self.actionHandler.bindAction("network\\hccap", UIAction(self.on_hccap)) self.actionHandler.bindAction("network\\hccapx", UIAction(self.on_hccapx)) self.actionHandler.bindAction("network\\icmp_packet", UIAction(self.on_icmp_packet)) - self.actionHandler.bindAction("network\\ipv4_packet", UIAction(self.on_ipv4_packet)) - self.actionHandler.bindAction("network\\ipv6_packet", UIAction(self.on_ipv6_packet)) - self.actionHandler.bindAction("network\\microsoft_network_monitor_v2", UIAction(self.on_microsoft_network_monitor_v2)) - self.actionHandler.bindAction("network\\packet_ppi", UIAction(self.on_packet_ppi)) - self.actionHandler.bindAction("network\\pcap", UIAction(self.on_pcap)) - self.actionHandler.bindAction("network\\protocol_body", UIAction(self.on_protocol_body)) + + if sys.version_info[0] == 3: + self.actionHandler.bindAction("network\\ethernet_frame", UIAction(self.on_ethernet_frame)) + self.actionHandler.bindAction("network\\ipv4_packet", UIAction(self.on_ipv4_packet)) + self.actionHandler.bindAction("network\\ipv6_packet", UIAction(self.on_ipv6_packet)) + self.actionHandler.bindAction("network\\microsoft_network_monitor_v2", UIAction(self.on_microsoft_network_monitor_v2)) + self.actionHandler.bindAction("network\\packet_ppi", UIAction(self.on_packet_ppi)) + self.actionHandler.bindAction("network\\pcap", UIAction(self.on_pcap)) + self.actionHandler.bindAction("network\\protocol_body", UIAction(self.on_protocol_body)) + self.actionHandler.bindAction("network\\rtcp_payload", UIAction(self.on_rtcp_payload)) self.actionHandler.bindAction("network\\rtp_packet", UIAction(self.on_rtp_packet)) self.actionHandler.bindAction("network\\tcp_segment", UIAction(self.on_tcp_segment)) @@ -826,7 +838,7 @@ class KaitaiStatusBarWidget(StatusBarWidget): self.layout = QHBoxLayout(self) self.layout.setContentsMargins(0,0,0,0) - + self.options = KaitaiOptionsWidget(self) self.layout.addWidget(self.options) diff --git a/python/examples/kaitai/view.py b/python/examples/kaitai/view.py index e20aaf46..260700b1 100644 --- a/python/examples/kaitai/view.py +++ b/python/examples/kaitai/view.py @@ -72,18 +72,26 @@ class KaitaiView(QScrollArea, View): self.kaitaiParse() # parse the file using Kaitai, construct the TreeWidget - def kaitaiParse(self, formatName=None): + def kaitaiParse(self, ksModuleName=None): #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) - parsed = kshelpers.parseIo(kaitaiIO, formatName) + parsed = kshelpers.parseIo(kaitaiIO, ksModuleName) if not parsed: return - tree = kshelpers.buildQtree(parsed) + # it SEEMS as if parsing is finished at this moment, but some parsing + # is postponed until attributes are accessed, so we must try/catch here + tree = None + try: + tree = kshelpers.buildQtree(parsed) + except Exception as e: + log.log_error('kaitai module %s threw exception, check file type' % ksModuleName) + true = None + if not tree: return @@ -262,7 +270,7 @@ class KaitaiViewType(ViewType): # 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) if binaryView.executable: - return 1 + return 0 if binaryView.start != 0: return 1 @@ -276,7 +284,7 @@ class KaitaiViewType(ViewType): if not ksModuleName: return 1 - # for executables, yield triage (25) + # for executables, yield to triage (25) if ksModuleName in ['elf', 'microsoft_pe', 'mach_o']: return 24 -- cgit v1.3.1