summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorAndrew Lamoureux <andrew@vector35.com>2019-03-22 00:06:32 -0400
committerAndrew Lamoureux <andrew@vector35.com>2019-03-22 00:06:32 -0400
commit243bf0c8ff0fc1ec0a40e276541ed6be1888d2af (patch)
tree643022a2a31a1f02c97fabc5d2c729f0ac11a757 /python
parentb5fd5d118338159eed5969c5df4ad7d55d732a3d (diff)
kaitai: disclude circular formats on py2, more error reporting
Diffstat (limited to 'python')
-rw-r--r--python/examples/kaitai/kshelpers.py4
-rw-r--r--python/examples/kaitai/menu.py56
-rw-r--r--python/examples/kaitai/view.py18
3 files changed, 49 insertions, 29 deletions
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