diff options
Diffstat (limited to 'plugins/python')
| -rw-r--r-- | plugins/python/Makefile.am | 2 | ||||
| -rw-r--r-- | plugins/python/samples/Makefile.am | 7 | ||||
| -rw-r--r-- | plugins/python/samples/__init__.py | 2 | ||||
| -rw-r--r-- | plugins/python/samples/basic_blocks.py | 80 | ||||
| -rw-r--r-- | plugins/python/samples/demo.py | 30 | 
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) | 
