summaryrefslogtreecommitdiff
path: root/plugins/python
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/python')
-rw-r--r--plugins/python/Makefile.am2
-rw-r--r--plugins/python/samples/Makefile.am7
-rw-r--r--plugins/python/samples/__init__.py2
-rw-r--r--plugins/python/samples/basic_blocks.py80
-rw-r--r--plugins/python/samples/demo.py30
5 files changed, 120 insertions, 1 deletions
diff --git a/plugins/python/Makefile.am b/plugins/python/Makefile.am
index 3583a21..7bb4122 100644
--- a/plugins/python/Makefile.am
+++ b/plugins/python/Makefile.am
@@ -1,2 +1,2 @@
-SUBDIRS = androperms apkfiles
+SUBDIRS = androperms apkfiles samples
diff --git a/plugins/python/samples/Makefile.am b/plugins/python/samples/Makefile.am
new file mode 100644
index 0000000..38ab6c8
--- /dev/null
+++ b/plugins/python/samples/Makefile.am
@@ -0,0 +1,7 @@
+
+samplesdir = $(datadir)/openida/plugins/python/samples
+
+samples_DATA = \
+ __init__.py \
+ basic_blocks.py \
+ demo.py
diff --git a/plugins/python/samples/__init__.py b/plugins/python/samples/__init__.py
new file mode 100644
index 0000000..7186d48
--- /dev/null
+++ b/plugins/python/samples/__init__.py
@@ -0,0 +1,2 @@
+
+from demo import Demo as samples
diff --git a/plugins/python/samples/basic_blocks.py b/plugins/python/samples/basic_blocks.py
new file mode 100644
index 0000000..583723c
--- /dev/null
+++ b/plugins/python/samples/basic_blocks.py
@@ -0,0 +1,80 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+import re
+from pychrysalide.analysis import InstrBlock
+from pychrysalide.analysis.blocks import FlowBlock
+
+
+class VisitIndent:
+
+ def __init__(self):
+ self.offset = 0
+
+ def get_padding(self):
+ return ' ' * self.offset
+
+ def inc_offset(self):
+ self.offset = self.offset + 1
+
+ def dec_offset(self):
+ self.offset = self.offset - 1
+
+
+def get_c_address_of_pygobject(obj):
+ """Parse the string representation of a given object and return its memory address."""
+
+ ret = re.match('.*(0x[0-9a-f]+)\)>', str(obj), re.I)
+
+ if ret == None:
+ result = '???'
+ else:
+ result = ret.group(1)
+
+ return result
+
+
+def visit_block(block, order, indent):
+ """Describe each visited basic block."""
+
+ padding = indent.get_padding()
+ addr = get_c_address_of_pygobject(block)
+
+ if isinstance(block, FlowBlock):
+
+ start, end = block.boundary_addresses
+ links = block.get_links_block()
+
+ if links != None:
+ laddr = get_c_address_of_pygobject(links)
+ print '%s- flow %s : 0x%08lx -> 0x%08lx (links = %s)' % (padding, addr, start, end, laddr)
+
+ else:
+ print '%s- flow %s : 0x%08lx -> 0x%08lx' % (padding, addr, start, end)
+
+ else:
+
+ if order != InstrBlock.BVO_OUT:
+
+ print '%s- virtual %s' % (padding, addr)
+ indent.inc_offset()
+
+ else:
+ indent.dec_offset()
+
+ return True
+
+
+def show_basic_blocks(binary):
+ """Print the tree of all basic blocks for each routine of a given binary."""
+
+ fmt = binary.get_format()
+ indent = VisitIndent()
+
+ for r in fmt.routines:
+
+ print '==== %s ====' % str(r)
+
+ r.basic_blocks.visit(visit_block, indent)
+
+ print
diff --git a/plugins/python/samples/demo.py b/plugins/python/samples/demo.py
new file mode 100644
index 0000000..c406231
--- /dev/null
+++ b/plugins/python/samples/demo.py
@@ -0,0 +1,30 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+from pychrysalide import Plugin
+from pychrysalide.gui.panels import LogPanel
+
+from basic_blocks import show_basic_blocks
+
+
+class Demo(Plugin):
+ """Demonstration plugin."""
+
+ def init(self, ref):
+ """Initialize the plugin."""
+
+ LogPanel.log_message(LogPanel.LMT_WARNING, 'Welcome to the demo Python plugin !')
+
+ return True
+
+
+ def get_action(self):
+ """Register the plugin for given actions."""
+
+ return Plugin.PGA_BINARY_GROUPED
+
+
+ def execute_on_binary(self, binary, action):
+ """Process registered actions."""
+
+ show_basic_blocks(binary)