From 14e82ed268cb78d62bbba93357fede5ece5c4f7d Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Wed, 1 Feb 2012 01:14:01 +0000 Subject: Provided interfaces to use debuggers in plugins. git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@231 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a --- ChangeLog | 31 ++++++++++++ configure.ac | 1 + plugins/pyoida/plugin.c | 88 ++++++++++++++++++++++++++++++--- plugins/python/exectracer/Makefile.am | 6 +++ plugins/python/exectracer/__init__.py | 2 + plugins/python/exectracer/exectracer.py | 18 +++++++ src/debug/debugger.c | 22 ++++++++- src/debug/debugger.h | 3 +- src/debug/debuggers.c | 0 src/debug/debuggers.h | 0 src/editor.c | 6 ++- src/plugins/plugin-def.h | 8 ++- src/plugins/plugin-int.h | 6 ++- src/plugins/plugin.c | 23 ++++++++- src/plugins/plugin.h | 4 +- 15 files changed, 201 insertions(+), 17 deletions(-) create mode 100644 plugins/python/exectracer/Makefile.am create mode 100644 plugins/python/exectracer/__init__.py create mode 100644 plugins/python/exectracer/exectracer.py delete mode 100644 src/debug/debuggers.c delete mode 100644 src/debug/debuggers.h diff --git a/ChangeLog b/ChangeLog index 8c4a867..0d08f05 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,34 @@ +12-02-01 Cyrille Bagard + + * configure.ac: + Add the new Makefile from the 'plugins/python/exectracer' directory to + AC_CONFIG_FILES. + + * plugins/pyoida/plugin.c: + Provide interfaces to use debuggers in plugins. + + * plugins/python/exectracer/exectracer.py: + * plugins/python/exectracer/__init__.py: + * plugins/python/exectracer/Makefile.am: + New entries: introduce a new python plugin. + + * src/debug/debugger.c: + * src/debug/debugger.h: + Load the JDWP debugger. + + * src/debug/debuggers.c: + * src/debug/debuggers.h: + Deleted empty entries. + + * src/editor.c: + Add debug code in the old menu to test debuggers. + + * src/plugins/plugin.c: + * src/plugins/plugin-def.h: + * src/plugins/plugin.h: + * src/plugins/plugin-int.h: + Provide interfaces to use debuggers in plugins. + 12-01-30 Cyrille Bagard * src/editor.c: diff --git a/configure.ac b/configure.ac index 5d5ab18..d8dff05 100644 --- a/configure.ac +++ b/configure.ac @@ -229,6 +229,7 @@ AC_CONFIG_FILES([Makefile plugins/pyoida/format/Makefile plugins/python/Makefile plugins/python/apkfiles/Makefile + plugins/python/exectracer/Makefile plugins/stackvars/Makefile plugins/theseus/Makefile src/Makefile diff --git a/plugins/pyoida/plugin.c b/plugins/pyoida/plugin.c index d7deecb..9bcec8e 100644 --- a/plugins/pyoida/plugin.c +++ b/plugins/pyoida/plugin.c @@ -2,7 +2,7 @@ /* OpenIDA - Outil d'analyse de fichiers binaires * plugin.c - interactions avec un greffon Python * - * Copyright (C) 2010-2011 Cyrille Bagard + * Copyright (C) 2010-2012 Cyrille Bagard * * This file is part of OpenIDA. * @@ -75,6 +75,11 @@ static MatchingFormatAction g_python_plugin_is_matching(const GPythonPlugin *, c static bool g_python_plugin_execute(GPythonPlugin *, GOpenidaBinary *, PluginAction); +/* Exécute une action relative à un débogueur. */ +static bool g_python_plugin_handle_debugger(const GPythonPlugin *, GBinaryDebugger *, PluginAction); + + + /* ------------------------- MODULE PYTHON POUR LES SCRIPTS ------------------------- */ @@ -108,6 +113,10 @@ static PyObject *pyoida_plugin_get_action(PyObject *, PyObject *); static PyObject *pyoida_plugin_is_matching(PyObject *, PyObject *); +/* Exécute une action relative à un débogueur. */ +static PyObject *pyoida_plugin_handle_debugger(PyObject *, PyObject *); + + @@ -239,6 +248,7 @@ static void g_python_plugin_init(GPythonPlugin *plugin) plugin_parent = G_PLUGIN_MODULE(plugin); plugin_parent->exec_on_bin = (execute_action_on_binary_fc)g_python_plugin_execute; + plugin_parent->handle_debugger = (execute_on_debugger_fc)g_python_plugin_handle_debugger; } @@ -470,13 +480,6 @@ static MatchingFormatAction g_python_plugin_is_matching(const GPythonPlugin *plu - - - - - - - /****************************************************************************** * * * Paramètres : plugin = greffon de prise en charge à utiliser. * @@ -531,6 +534,48 @@ static bool g_python_plugin_execute(GPythonPlugin *plugin, GOpenidaBinary *binar +/****************************************************************************** +* * +* Paramètres : plugin = greffon à consulter. * +* debugger = débogueur à l'origine de l'opération. * +* action = action attendue. * +* * +* Description : Exécute une action relative à un débogueur. * +* * +* Retour : true si une action a été menée, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool g_python_plugin_handle_debugger(const GPythonPlugin *plugin, GBinaryDebugger *debugger, PluginAction action) +{ + bool result; /* Bilan à remonter */ + PyObject *args; /* Arguments pour l'appel */ + PyObject *value; /* Valeurs obtenues */ + + args = PyTuple_New(2); + + PyTuple_SetItem(args, 0, Py_None); + PyTuple_SetItem(args, 1, PyInt_FromLong(action)); + + value = run_python_method(plugin->instance, "handle_debugger", args); + + result = (value == Py_True); + + Py_XDECREF(value); + Py_DECREF(args); + + return result; + +} + + + + + + + /* ---------------------------------------------------------------------------------- */ /* MODULE PYTHON POUR LES SCRIPTS */ /* ---------------------------------------------------------------------------------- */ @@ -596,6 +641,12 @@ static bool pyoida_plugin_define_constants(PyObject *dict) ret = PyDict_SetItemString(dict, "PGA_CODE_PROCESS", PyInt_FromLong(PGA_CODE_PROCESS)); if (ret == -1) return false; + ret = PyDict_SetItemString(dict, "PGA_DEBUGGER_ATTACH", PyInt_FromLong(PGA_DEBUGGER_ATTACH)); + if (ret == -1) return false; + + ret = PyDict_SetItemString(dict, "PGA_DEBUGGER_DETACH", PyInt_FromLong(PGA_DEBUGGER_DETACH)); + if (ret == -1) return false; + /* PGA_FORMAT_MATCHER */ ret = PyDict_SetItemString(dict, "MFA_NONE", PyInt_FromLong(MFA_NONE)); @@ -662,6 +713,24 @@ static PyObject *pyoida_plugin_is_matching(PyObject *self, PyObject *args) +/****************************************************************************** +* * +* Paramètres : self = classe assurant le lien avec l'éditeur de messages. * +* args = arguments fournis à l'appel. * +* * +* Description : Exécute une action relative à un débogueur. * +* * +* Retour : True en équivalent Python. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *pyoida_plugin_handle_debugger(PyObject *self, PyObject *args) +{ + Py_RETURN_TRUE; + +} /****************************************************************************** @@ -712,6 +781,9 @@ static PyMethodDef pyoida_plugin_methods[] = { { "is_matching", (PyCFunction)pyoida_plugin_is_matching, METH_VARARGS, "Define if the given file can be handled." }, + { "handle_debugger", (PyCFunction)pyoida_plugin_handle_debugger, METH_VARARGS, + "Be notify about debugger attaching or detaching." + }, { "run", (PyCFunction)pyoida_plugin_run, METH_VARARGS, "Run the plugin for a specific action." }, diff --git a/plugins/python/exectracer/Makefile.am b/plugins/python/exectracer/Makefile.am new file mode 100644 index 0000000..9f8eeb2 --- /dev/null +++ b/plugins/python/exectracer/Makefile.am @@ -0,0 +1,6 @@ + +exectracerdir = $(datadir)/openida/plugins/python/exectracer + +exectracer_DATA = \ + __init__.py \ + exectracer.py diff --git a/plugins/python/exectracer/__init__.py b/plugins/python/exectracer/__init__.py new file mode 100644 index 0000000..abdaa6c --- /dev/null +++ b/plugins/python/exectracer/__init__.py @@ -0,0 +1,2 @@ + +from exectracer import ExecTracer as exectracer diff --git a/plugins/python/exectracer/exectracer.py b/plugins/python/exectracer/exectracer.py new file mode 100644 index 0000000..2773586 --- /dev/null +++ b/plugins/python/exectracer/exectracer.py @@ -0,0 +1,18 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +from pyoida import Plugin + + +class ExecTracer(Plugin): + """Trace and replay debug executions.""" + + def get_action(self): + """Register the plugin for given actions.""" + + return Plugin.PGA_DEBUGGER_ATTACH + + def handle_debugger(self, debugger, action): + """Be notify about debugger attaching or detaching.""" + + print "Python Hello !" diff --git a/src/debug/debugger.c b/src/debug/debugger.c index 6a9c7a2..d08bd26 100644 --- a/src/debug/debugger.c +++ b/src/debug/debugger.c @@ -2,7 +2,7 @@ /* OpenIDA - Outil d'analyse de fichiers binaires * debugger.c - gestion des différents débogueurs * - * Copyright (C) 2010-2011 Cyrille Bagard + * Copyright (C) 2010-2012 Cyrille Bagard * * This file is part of OpenIDA. * @@ -24,8 +24,10 @@ #include "debugger.h" #include "debugger-int.h" +#include "jdwp/debugger.h" #include "remgdb/gdb.h" #include "../gtkext/iodamarshal.h" +#include "../plugins/pglist.h" @@ -112,6 +114,10 @@ GBinaryDebugger *g_new_binary_debugger(DebuggerType type, GOpenidaBinary *binary switch (type) { + case DGT_JDWP: + result = g_java_debugger_new(binary, NULL); + break; + case DGT_REMOTE_GDB: result = g_gdb_debugger_new(binary, NULL); break; @@ -145,10 +151,24 @@ GBinaryDebugger *g_new_binary_debugger(DebuggerType type, GOpenidaBinary *binary bool g_binary_debugger_attach(GBinaryDebugger *debugger) { bool result; /* Bilan à retourner */ + GPluginModule **pglist; /* Liste de greffons */ + size_t pgcount; /* Taille de cette liste */ + size_t i; /* Boucle de parcours */ if (debugger->attach == NULL) result = true; else result = debugger->attach(debugger); + pglist = get_all_plugins_for_action(PGA_DEBUGGER_ATTACH, &pgcount); + + if (pgcount > 0) + { + for (i = 0; i < pgcount; i++) + g_plugin_module_handle_debugger(pglist[i], debugger, PGA_DEBUGGER_ATTACH); + + free(pglist); + + } + return result; } diff --git a/src/debug/debugger.h b/src/debug/debugger.h index 12660eb..f57a9f0 100644 --- a/src/debug/debugger.h +++ b/src/debug/debugger.h @@ -2,7 +2,7 @@ /* OpenIDA - Outil d'analyse de fichiers binaires * debugger.h - prototypes pour la gestion des différents débogueurs * - * Copyright (C) 2010-2011 Cyrille Bagard + * Copyright (C) 2010-2012 Cyrille Bagard * * This file is part of OpenIDA. * @@ -37,6 +37,7 @@ /* Liste de tous les débogueurs */ typedef enum _DebuggerType { + DGT_JDWP, /* Utilisation du JDWP */ DGT_REMOTE_GDB, /* Utilisation de GDB */ DGT_PTRACE, /* Utilisation de ptrace() */ diff --git a/src/debug/debuggers.c b/src/debug/debuggers.c deleted file mode 100644 index e69de29..0000000 diff --git a/src/debug/debuggers.h b/src/debug/debuggers.h deleted file mode 100644 index e69de29..0000000 diff --git a/src/editor.c b/src/editor.c index 728e7ca..757b0c9 100644 --- a/src/editor.c +++ b/src/editor.c @@ -994,15 +994,17 @@ void mcb_debug_start(GtkCheckMenuItem *menuitem, gpointer data) - debugger = g_new_binary_debugger(DGT_REMOTE_GDB, binary); + debugger = g_new_binary_debugger(DGT_JDWP, binary); g_object_set_data(G_OBJECT(data), "current_debugger", debugger); + // + g_binary_debugger_attach(debugger); g_signal_connect(debugger, "debugger-stopped", G_CALLBACK(debugger_stopped_cb), data); g_signal_connect(debugger, "halted", G_CALLBACK(on_debugger_halted), data); - g_binary_debugger_run(debugger); + // g_binary_debugger_run(debugger); } diff --git a/src/plugins/plugin-def.h b/src/plugins/plugin-def.h index 67b26d6..0c7ff1c 100644 --- a/src/plugins/plugin-def.h +++ b/src/plugins/plugin-def.h @@ -2,7 +2,7 @@ /* OpenIDA - Outil d'analyse de fichiers binaires * plugin-def.h - prototypes pour les définitions de base utiles aux greffons * - * Copyright (C) 2009-2011 Cyrille Bagard + * Copyright (C) 2009-2012 Cyrille Bagard * * This file is part of OpenIDA. * @@ -27,6 +27,7 @@ #include "../analysis/binary.h" +#include "../debug/debugger.h" @@ -48,7 +49,10 @@ typedef enum _PluginAction PGA_DISASSEMBLE = (1 << 1), /* Désassemblage (non trivial) */ - PGA_CODE_PROCESS = (1 << 2) /* Traitement du code existant */ + PGA_CODE_PROCESS = (1 << 2), /* Traitement du code existant */ + + PGA_DEBUGGER_ATTACH = (1 << 3), /* Activation d'un débogueur */ + PGA_DEBUGGER_DETACH = (1 << 4) /* Désactivation d'un débogueur*/ } PluginAction; diff --git a/src/plugins/plugin-int.h b/src/plugins/plugin-int.h index 1ab8d36..a4f3cb6 100644 --- a/src/plugins/plugin-int.h +++ b/src/plugins/plugin-int.h @@ -2,7 +2,7 @@ /* OpenIDA - Outil d'analyse de fichiers binaires * plugin-int.h - prototypes pour les structures internes des greffons * - * Copyright (C) 2010-2011 Cyrille Bagard + * Copyright (C) 2010-2012 Cyrille Bagard * * This file is part of OpenIDA. * @@ -42,6 +42,9 @@ typedef PluginAction (* get_plugin_action_fc) (const GPluginModule *); /* Identifie un format à associer à un contenu binaire. */ typedef MatchingFormatAction (* is_matching_fc) (const GPluginModule *, char **, bin_t **, off_t *); +/* Exécute une action relative à un débogueur. */ +typedef bool (* execute_on_debugger_fc) (const GPluginModule *, GBinaryDebugger *, PluginAction); + /* Greffon pour OpenIDA (instance) */ struct _GPluginModule @@ -58,6 +61,7 @@ struct _GPluginModule is_matching_fc is_matching; /* Recherche de correspondance */ execute_action_on_binary_fc exec_on_bin;/* Action sur un binaire */ + execute_on_debugger_fc handle_debugger; /* Action liée à un débogueur */ }; diff --git a/src/plugins/plugin.c b/src/plugins/plugin.c index d654df1..7521008 100644 --- a/src/plugins/plugin.c +++ b/src/plugins/plugin.c @@ -2,7 +2,7 @@ /* OpenIDA - Outil d'analyse de fichiers binaires * plugin.c - interactions avec un greffon donné * - * Copyright (C) 2009-2011 Cyrille Bagard + * Copyright (C) 2009-2012 Cyrille Bagard * * This file is part of OpenIDA. * @@ -265,3 +265,24 @@ bool g_plugin_module_execute_action_on_binary(const GPluginModule *plugin, GOpen return plugin->exec_on_bin(binary, action); } + + +/****************************************************************************** +* * +* Paramètres : plugin = greffon à consulter. * +* debugger = débogueur à l'origine de l'opération. * +* action = action attendue. * +* * +* Description : Exécute une action relative à un débogueur. * +* * +* Retour : true si une action a été menée, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_plugin_module_handle_debugger(const GPluginModule *plugin, GBinaryDebugger *debugger, PluginAction action) +{ + return plugin->handle_debugger(plugin, debugger, action); + +} diff --git a/src/plugins/plugin.h b/src/plugins/plugin.h index 85b6db9..dbd27fd 100644 --- a/src/plugins/plugin.h +++ b/src/plugins/plugin.h @@ -2,7 +2,7 @@ /* OpenIDA - Outil d'analyse de fichiers binaires * plugin.h - prototypes pour les interactions avec un greffon donné * - * Copyright (C) 2009-2011 Cyrille Bagard + * Copyright (C) 2009-2012 Cyrille Bagard * * This file is part of OpenIDA. * @@ -63,6 +63,8 @@ MatchingFormatAction g_plugin_module_is_matching(const GPluginModule *, char **, /* Exécute une action définie sur un binaire chargé. */ bool g_plugin_module_execute_action_on_binary(const GPluginModule *, GOpenidaBinary *, PluginAction); +/* Exécute une action relative à un débogueur. */ +bool g_plugin_module_handle_debugger(const GPluginModule *, GBinaryDebugger *, PluginAction); -- cgit v0.11.2-87-g4458