diff options
| author | Cyrille Bagard <nocbos@gmail.com> | 2012-02-01 10:12:54 (GMT) | 
|---|---|---|
| committer | Cyrille Bagard <nocbos@gmail.com> | 2012-02-01 10:12:54 (GMT) | 
| commit | 0c847f961a99d8e8012beecad27cf4318df1ff88 (patch) | |
| tree | e73689b844184f272267ae54ac27a6e826410478 /plugins/pyoida | |
| parent | 14e82ed268cb78d62bbba93357fede5ece5c4f7d (diff) | |
Provided a debug module for Python plugins using the PyGObject API.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@232 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'plugins/pyoida')
| -rw-r--r-- | plugins/pyoida/Makefile.am | 6 | ||||
| -rw-r--r-- | plugins/pyoida/debug/Makefile.am | 17 | ||||
| -rw-r--r-- | plugins/pyoida/debug/debugger.c | 174 | ||||
| -rw-r--r-- | plugins/pyoida/debug/debugger.h | 45 | ||||
| -rw-r--r-- | plugins/pyoida/debug/module.c | 66 | ||||
| -rw-r--r-- | plugins/pyoida/debug/module.h | 39 | ||||
| -rw-r--r-- | plugins/pyoida/plugin.c | 4 | ||||
| -rw-r--r-- | plugins/pyoida/pyoida.c | 7 | 
8 files changed, 353 insertions, 5 deletions
diff --git a/plugins/pyoida/Makefile.am b/plugins/pyoida/Makefile.am index 923d8c9..a343e6f 100644 --- a/plugins/pyoida/Makefile.am +++ b/plugins/pyoida/Makefile.am @@ -9,17 +9,19 @@ pyoida_la_SOURCES =						\  pyoida_la_LIBADD =						\  	analysis/libpyoidaanalysis.la		\  	arch/libpyoidaarch.la				\ +	debug/libpyoidadebug.la				\  	format/libpyoidaformat.la  pyoida_la_LDFLAGS = -module -avoid-version $(LIBGTK_LIBS) $(LIBXML_LIBS) $(LIBPYTHON_LIBS) \ +	$(LIBPYGOBJECT_LIBS) \  		-L../../src/panels/ -lpanels -L../../src/.libs -loidadisass -loidagtkext 	\  	-L../../src/plugins/.libs -lplugins -INCLUDES = $(LIBGTK_CFLAGS) $(LIBXML_CFLAGS) $(LIBPYTHON_CFLAGS) +INCLUDES = $(LIBGTK_CFLAGS) $(LIBXML_CFLAGS) $(LIBPYTHON_CFLAGS) $(LIBPYGOBJECT_CFLAGS)  AM_CPPFLAGS =   AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) $(COMPLIANCE_FLAGS) -SUBDIRS = analysis arch format +SUBDIRS = analysis arch debug format diff --git a/plugins/pyoida/debug/Makefile.am b/plugins/pyoida/debug/Makefile.am new file mode 100644 index 0000000..4f01701 --- /dev/null +++ b/plugins/pyoida/debug/Makefile.am @@ -0,0 +1,17 @@ + +noinst_LTLIBRARIES = libpyoidadebug.la + +libpyoidadebug_la_SOURCES =			\ +	debugger.h debugger.c			\ +	module.h module.c + + +libpyoidadebug_la_LDFLAGS =  + + +INCLUDES = $(LIBGTK_CFLAGS) $(LIBXML_CFLAGS) $(LIBPYTHON_CFLAGS) $(LIBPYGOBJECT_CFLAGS) \ +	-I../../../src + +AM_CPPFLAGS =  + +AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) $(COMPLIANCE_FLAGS) diff --git a/plugins/pyoida/debug/debugger.c b/plugins/pyoida/debug/debugger.c new file mode 100644 index 0000000..380f579 --- /dev/null +++ b/plugins/pyoida/debug/debugger.c @@ -0,0 +1,174 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * debugger.c - instances Python de débogueurs + * + * Copyright (C) 2012 Cyrille Bagard + * + *  This file is part of OpenIDA. + * + *  OpenIDA is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 3 of the License, or + *  (at your option) any later version. + * + *  OpenIDA is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with this program; if not, write to the Free Software + *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA + */ + + +#include "debugger.h" + + +#include <pygobject.h> + + + + + + +/* Fournit la pile d'exécution courante via un débogueur. */ +static PyObject *py_binary_debugger_get_current_stack(PyObject *, PyObject *); + + + + + + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : type = type de l'objet à instancier.                         * +*                args = arguments fournis à l'appel.                          * +*                kwds = arguments de type key=val fournis.                    * +*                                                                             * +*  Description : Crée un nouvel objet Python de type 'py_rendering_options'.  * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static PyObject *py_binary_debugger_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ +    PyObject *result;                       /* Instance à retourner        */ +    DebuggerType dtype;                     /* Type de débogueur à créer   */ +    int ret;                                /* Bilan de lecture des args.  */ +    GBinaryDebugger *debugger;              /* Version GLib du format      */ + +    ret = PyArg_ParseTuple(args, "l", &dtype); +    if (!ret) return Py_None; + +    debugger = g_new_binary_debugger(dtype, NULL/* FIXME */); + +    result = py_binary_debugger_from_c(debugger); +    g_object_unref(debugger); + +    return (PyObject *)result; + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : debugger = instance existante GLib.                          * +*                                                                             * +*  Description : Crée un nouvel objet Python de type 'BinaryDebugger'.        * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +PyObject *py_binary_debugger_from_c(GBinaryDebugger *debugger) +{ +    return pygobject_new(G_OBJECT(debugger)); + +} + + + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : self = classe représentant un débogueur.                     * +*                args = arguments fournis à l'appel.                          * +*                                                                             * +*  Description : Fournit la pile d'exécution courante via un débogueur.       * +*                                                                             * +*  Retour      : Valeur booléenne indiquant le statut d'une option.           * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static PyObject *py_binary_debugger_get_current_stack(PyObject *self, PyObject *args) +{ + +    printf(" -->> get stack\n"); + +    return Py_BuildValue("i", true); + +} + + + + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : module = module dont la définition est à compléter.          * +*                                                                             * +*  Description : Ajoute l'objet 'pychrysalide.debug.BinaryDebugger' au module.* +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +bool register_python_binary_debugger(PyObject *module) +{ +    int ret;                                /* Bilan d'un appel            */ + +    static PyMethodDef py_binary_debugger_methods[] = { +        { +            "get_current_stack", (PyCFunction)py_binary_debugger_get_current_stack, +            METH_NOARGS, +            "Provide the current callstack using a debugger." +        }, +        { NULL } +    }; + +    static PyTypeObject py_binary_debugger_type = { + +        PyObject_HEAD_INIT(NULL) + +        .tp_name        = "pychrysalide.debug.BinaryDebugger", +        .tp_basicsize   = sizeof(PyGObject), + +        .tp_flags       = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + +        .tp_doc         = "PyChrysalide binary debugger", + +        .tp_methods     = py_binary_debugger_methods, +        .tp_new         = (newfunc)py_binary_debugger_new + +    }; + +    if (PyType_Ready(&py_binary_debugger_type) < 0) +        return false; + +    Py_INCREF(&py_binary_debugger_type); +    ret = PyModule_AddObject(module, "BinaryDebugger", (PyObject *)&py_binary_debugger_type); + +    return (ret == 0); + +} diff --git a/plugins/pyoida/debug/debugger.h b/plugins/pyoida/debug/debugger.h new file mode 100644 index 0000000..5e5cc21 --- /dev/null +++ b/plugins/pyoida/debug/debugger.h @@ -0,0 +1,45 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * debugger.h - prototypes pour les instances Python de débogueurs + * + * Copyright (C) 2012 Cyrille Bagard + * + *  This file is part of OpenIDA. + * + *  OpenIDA is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 3 of the License, or + *  (at your option) any later version. + * + *  OpenIDA is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with this program; if not, write to the Free Software + *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA + */ + + +#ifndef _PLUGINS_PYOIDA_DEBUG_DEBUGGER_H +#define _PLUGINS_PYOIDA_DEBUG_DEBUGGER_H + + +#include <Python.h> +#include <stdbool.h> + + +#include <debug/debugger.h> + + + +/* Crée un nouvel objet Python de type 'BinaryDebugger'. */ +PyObject *py_binary_debugger_from_c(GBinaryDebugger *debugger); + +/* Ajoute l'objet 'pychrysalide.debug.BinaryDebugger' au module. */ +bool register_python_binary_debugger(PyObject *); + + + +#endif  /* _PLUGINS_PYOIDA_DEBUG_DEBUGGER_H */ diff --git a/plugins/pyoida/debug/module.c b/plugins/pyoida/debug/module.c new file mode 100644 index 0000000..fe59595 --- /dev/null +++ b/plugins/pyoida/debug/module.c @@ -0,0 +1,66 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * module.c - intégration du répertoire debug en tant que module + * + * Copyright (C) 2012 Cyrille Bagard + * + *  This file is part of OpenIDA. + * + *  OpenIDA is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 3 of the License, or + *  (at your option) any later version. + * + *  OpenIDA is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with this program; if not, write to the Free Software + *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA + */ + + +#include "module.h" + + +#include "debugger.h" + + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : module = module dont la définition est à compléter.          * +*                                                                             * +*  Description : Ajoute le module 'debug' au module Python.                   * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +bool add_debug_module_to_python_module(PyObject *super) +{ +    bool result; +    PyObject *module; +    int ret;                                /* Bilan d'un appel            */ + +    static PyMethodDef py_analysis_methods[] = { +        { NULL } +    }; + +    module = Py_InitModule("pychrysalide.debug", py_analysis_methods); +    if (module == NULL) return false; + +    Py_INCREF(module); +    ret = PyModule_AddObject(super, "pychrysalide.debug", module); + +    result = (ret != 0); + +    result &= register_python_binary_debugger(module); + +    return result; + +} diff --git a/plugins/pyoida/debug/module.h b/plugins/pyoida/debug/module.h new file mode 100644 index 0000000..d331621 --- /dev/null +++ b/plugins/pyoida/debug/module.h @@ -0,0 +1,39 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * module.h - prototypes pour l'intégration du répertoire debug en tant que module + * + * Copyright (C) 2012 Cyrille Bagard + * + *  This file is part of OpenIDA. + * + *  OpenIDA is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 3 of the License, or + *  (at your option) any later version. + * + *  OpenIDA is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with this program; if not, write to the Free Software + *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA + */ + + +#ifndef _PLUGINS_PYOIDA_DEBUG_MODULE_H +#define _PLUGINS_PYOIDA_DEBUG_MODULE_H + + +#include <Python.h> +#include <stdbool.h> + + + +/* Ajoute le module 'debug' au module Python. */ +bool add_debug_module_to_python_module(PyObject *); + + + +#endif  /* _PLUGINS_PYOIDA_DEBUG_MODULE_H */ diff --git a/plugins/pyoida/plugin.c b/plugins/pyoida/plugin.c index 9bcec8e..64cf013 100644 --- a/plugins/pyoida/plugin.c +++ b/plugins/pyoida/plugin.c @@ -30,7 +30,7 @@  #include "analysis/binary.h" - +#include "debug/debugger.h" @@ -556,7 +556,7 @@ static bool g_python_plugin_handle_debugger(const GPythonPlugin *plugin, GBinary      args = PyTuple_New(2); -    PyTuple_SetItem(args, 0, Py_None); +    PyTuple_SetItem(args, 0, py_binary_debugger_from_c(debugger));      PyTuple_SetItem(args, 1, PyInt_FromLong(action));      value = run_python_method(plugin->instance, "handle_debugger", args); diff --git a/plugins/pyoida/pyoida.c b/plugins/pyoida/pyoida.c index 1622512..d3b37e5 100644 --- a/plugins/pyoida/pyoida.c +++ b/plugins/pyoida/pyoida.c @@ -2,7 +2,7 @@  /* OpenIDA - Outil d'analyse de fichiers binaires   * pyoida.c - plugin permettant des extensions en Python   * - * Copyright (C) 2009-2011 Cyrille Bagard + * Copyright (C) 2009-2012 Cyrille Bagard   *   *  This file is part of OpenIDA.   * @@ -29,10 +29,12 @@  #include <Python.h> +#include <pygobject.h>  #include "analysis/module.h"  #include "arch/module.h" +#include "debug/module.h"  #include "format/module.h"  /* @@ -250,6 +252,8 @@ initpyoida(void)  {      PyObject *module; +    pygobject_init(-1, -1, -1); +      printf("Passage 2\n");      module = Py_InitModule("pyoida", SpamMethods); @@ -258,6 +262,7 @@ initpyoida(void)      //add_analysis_roptions_to_python_module(module);      add_analysis_module_to_python_module(module);      add_arch_module_to_python_module(module); +    add_debug_module_to_python_module(module);      add_format_module_to_python_module(module);      add_log_to_python_module(module);  | 
