summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2012-02-01 01:14:01 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2012-02-01 01:14:01 (GMT)
commit14e82ed268cb78d62bbba93357fede5ece5c4f7d (patch)
tree76e146d4dcf7b6db67b51eb8f75a6c5e76bf6896
parenteacb69625d51707ac0a158815a53f71fb70968ce (diff)
Provided interfaces to use debuggers in plugins.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@231 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
-rw-r--r--ChangeLog31
-rw-r--r--configure.ac1
-rw-r--r--plugins/pyoida/plugin.c88
-rw-r--r--plugins/python/exectracer/Makefile.am6
-rw-r--r--plugins/python/exectracer/__init__.py2
-rw-r--r--plugins/python/exectracer/exectracer.py18
-rw-r--r--src/debug/debugger.c22
-rw-r--r--src/debug/debugger.h3
-rw-r--r--src/debug/debuggers.c0
-rw-r--r--src/debug/debuggers.h0
-rw-r--r--src/editor.c6
-rw-r--r--src/plugins/plugin-def.h8
-rw-r--r--src/plugins/plugin-int.h6
-rw-r--r--src/plugins/plugin.c23
-rw-r--r--src/plugins/plugin.h4
15 files changed, 201 insertions, 17 deletions
diff --git a/ChangeLog b/ChangeLog
index 8c4a867..0d08f05 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,34 @@
+12-02-01 Cyrille Bagard <nocbos@gmail.com>
+
+ * 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 <nocbos@gmail.com>
* 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
--- a/src/debug/debuggers.c
+++ /dev/null
diff --git a/src/debug/debuggers.h b/src/debug/debuggers.h
deleted file mode 100644
index e69de29..0000000
--- a/src/debug/debuggers.h
+++ /dev/null
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);