summaryrefslogtreecommitdiff
path: root/plugins/pychrysa/analysis
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/pychrysa/analysis')
-rw-r--r--plugins/pychrysa/analysis/Makefile.am9
-rw-r--r--plugins/pychrysa/analysis/block.c261
-rw-r--r--plugins/pychrysa/analysis/block.h39
-rw-r--r--plugins/pychrysa/analysis/blocks/Makefile.am17
-rw-r--r--plugins/pychrysa/analysis/blocks/flow.c149
-rw-r--r--plugins/pychrysa/analysis/blocks/flow.h39
-rw-r--r--plugins/pychrysa/analysis/blocks/module.c68
-rw-r--r--plugins/pychrysa/analysis/blocks/module.h39
-rw-r--r--plugins/pychrysa/analysis/blocks/virtual.c104
-rw-r--r--plugins/pychrysa/analysis/blocks/virtual.h39
-rw-r--r--plugins/pychrysa/analysis/module.c6
-rw-r--r--plugins/pychrysa/analysis/routine.c205
-rw-r--r--plugins/pychrysa/analysis/routine.h39
13 files changed, 1011 insertions, 3 deletions
diff --git a/plugins/pychrysa/analysis/Makefile.am b/plugins/pychrysa/analysis/Makefile.am
index 66da864..3480e96 100644
--- a/plugins/pychrysa/analysis/Makefile.am
+++ b/plugins/pychrysa/analysis/Makefile.am
@@ -3,11 +3,14 @@ noinst_LTLIBRARIES = libpychrysaanalysis.la
libpychrysaanalysis_la_SOURCES = \
binary.h binary.c \
+ block.h block.c \
module.h module.c \
- roptions.h roptions.c
+ roptions.h roptions.c \
+ routine.h routine.c
libpychrysaanalysis_la_LIBADD = \
- binaries/libpychrysaanalysisbinaries.la
+ binaries/libpychrysaanalysisbinaries.la \
+ blocks/libpychrysaanalysisblocks.la
libpychrysaanalysis_la_LDFLAGS =
@@ -19,4 +22,4 @@ AM_CPPFLAGS =
AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) $(COMPLIANCE_FLAGS)
-SUBDIRS = binaries
+SUBDIRS = binaries blocks
diff --git a/plugins/pychrysa/analysis/block.c b/plugins/pychrysa/analysis/block.c
new file mode 100644
index 0000000..2b405cd
--- /dev/null
+++ b/plugins/pychrysa/analysis/block.c
@@ -0,0 +1,261 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * block.c - équivalent Python du fichier "analysis/block.c"
+ *
+ * Copyright (C) 2013 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 "block.h"
+
+
+#include <pygobject.h>
+
+
+#include <analysis/block.h>
+
+
+#include "../helpers.h"
+
+
+
+/* Permet la jonction entre C et Python lors des visites */
+typedef struct _py_block_vdata
+{
+ PyObject *func; /* Fonction à appeler */
+ PyObject *user; /* Donnée à faire suivre */
+
+} py_block_vdata;
+
+
+/* Parcourt le bloc d'instructions dans un ordre donné. */
+static bool py_block_visitor_glue(GInstrBlock *, BlockVisitOrder, py_block_vdata *);
+
+/* Parcourt tous les blocs d'instructions dans un ordre donné. */
+static PyObject *py_instructions_block_visit(PyObject *, PyObject *);
+
+/* Fournit l'ensemble contenant les blocs liés. */
+static PyObject *py_instructions_block_get_links_block(PyObject *, PyObject *);
+
+/* Définit les constantes pour les blocs basiques. */
+static bool py_instructions_block_define_constants(PyObject *);
+
+
+
+/******************************************************************************
+* *
+* Paramètres : block = bloc d'instructions concerné par la visite. *
+* order = indication sur la position dans le parcours. *
+* data = donnée utilisateur à associer au parcours. *
+* *
+* Description : Parcourt le bloc d'instructions dans un ordre donné. *
+* *
+* Retour : true si le parcours a été jusqu'à son terme, false sinon. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static bool py_block_visitor_glue(GInstrBlock *block, BlockVisitOrder order, py_block_vdata *data)
+{
+ bool result; /* Bilan à retourner */
+ PyObject *args; /* Arguments pour l'appel */
+ PyObject *value; /* Retour obtenu */
+
+ Py_INCREF(data->user);
+
+ args = PyTuple_New(3);
+ PyTuple_SetItem(args, 0, pygobject_new(G_OBJECT(block)));
+ PyTuple_SetItem(args, 1, PyInt_FromLong(order));
+ PyTuple_SetItem(args, 2, data->user);
+
+ value = _run_python_method(data->func, args);
+ result = (value == Py_True);
+
+ Py_XDECREF(value);
+ Py_DECREF(args);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : self = classe représentant un binaire. *
+* args = arguments fournis à l'appel. *
+* *
+* Description : Parcourt tous les blocs d'instructions dans un ordre donné. *
+* *
+* Retour : True si le parcours a été jusqu'à son terme, False sinon. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static PyObject *py_instructions_block_visit(PyObject *self, PyObject *args)
+{
+ PyObject *result; /* Conclusion à retourner */
+ py_block_vdata data; /* Transition entre C et Python*/
+ int ret; /* Bilan de lecture des args. */
+ GInstrBlock *block; /* Point de départ des visites */
+ bool status; /* Bilan du parcours */
+
+ ret = PyArg_ParseTuple(args, "OO", &data.func, &data.user);
+ if (!ret) Py_RETURN_NONE;
+
+ block = G_INSTR_BLOCK(pygobject_get(self));
+ status = g_instr_block_visit(block, (instr_block_visitor_cb)py_block_visitor_glue, &data);
+
+ result = (status ? Py_True : Py_False);
+ Py_INCREF(result);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : self = classe représentant un binaire. *
+* args = arguments fournis à l'appel. *
+* *
+* Description : Fournit l'ensemble contenant les blocs liés. *
+* *
+* Retour : Bloc contenant les blocs liés au bloc. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static PyObject *py_instructions_block_get_links_block(PyObject *self, PyObject *args)
+{
+ PyObject *result; /* Conclusion à retourner */
+ GInstrBlock *block; /* Point de départ des visites */
+
+ block = G_INSTR_BLOCK(pygobject_get(self));
+
+ block = g_instr_block_get_links_block(block);
+
+ result = pygobject_new(G_OBJECT(block));
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : dict = dictionnaire à compléter. *
+* *
+* Description : Définit les constantes pour les blocs basiques. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static bool py_instructions_block_define_constants(PyObject *dict)
+{
+ int ret; /* Bilan d'un ajout */
+
+ ret = PyDict_SetItemString(dict, "BVO_IN", PyInt_FromLong(BVO_IN));
+ if (ret == -1) return false;
+
+ ret = PyDict_SetItemString(dict, "BVO_PENDING", PyInt_FromLong(BVO_PENDING));
+ if (ret == -1) return false;
+
+ ret = PyDict_SetItemString(dict, "BVO_OUT", PyInt_FromLong(BVO_OUT));
+ if (ret == -1) return false;
+
+ return true;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : module = module dont la définition est à compléter. *
+* *
+* Description : Prend en charge l'objet 'pychrysalide.analysis.InstrBlock'. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool register_python_instructions_block(PyObject *module)
+{
+ PyObject *parent_mod; /* Module de la classe parente */
+ int ret; /* Bilan d'un appel */
+
+ static PyMethodDef py_instructions_block_methods[] = {
+ {
+ "visit", (PyCFunction)py_instructions_block_visit,
+ METH_VARARGS,
+ "Visit all the basic blocks, starting at the provided one."
+ },
+ {
+ "get_links_block", (PyCFunction)py_instructions_block_get_links_block,
+ METH_VARARGS,
+ "Get the block containing all blocks linked to the caller."
+ },
+ { NULL }
+ };
+
+ static PyGetSetDef py_instructions_block_getseters[] = {
+ { NULL }
+ };
+
+ static PyTypeObject py_instructions_block_type = {
+
+ PyObject_HEAD_INIT(NULL)
+
+ .tp_name = "pychrysalide.analysis.InstrBlock",
+ .tp_basicsize = sizeof(PyGObject),
+
+ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+
+ .tp_doc = "PyChrysalide basic block",
+
+ .tp_methods = py_instructions_block_methods,
+ .tp_getset = py_instructions_block_getseters
+
+ };
+
+ parent_mod = PyImport_ImportModule("gobject");
+ if (parent_mod == NULL) return false;
+
+ py_instructions_block_type.tp_base = (PyTypeObject *)PyObject_GetAttrString(parent_mod, "GObject");
+ Py_DECREF(parent_mod);
+
+ if (PyType_Ready(&py_instructions_block_type) < 0)
+ return false;
+
+ if (!py_instructions_block_define_constants(py_instructions_block_type.tp_dict))
+ return false;
+
+ Py_INCREF(&py_instructions_block_type);
+ ret = PyModule_AddObject(module, "InstrBlock", (PyObject *)&py_instructions_block_type);
+
+ return (ret == 0);
+
+}
diff --git a/plugins/pychrysa/analysis/block.h b/plugins/pychrysa/analysis/block.h
new file mode 100644
index 0000000..2169ed2
--- /dev/null
+++ b/plugins/pychrysa/analysis/block.h
@@ -0,0 +1,39 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * block.h - prototypes pour l'équivalent Python du fichier "analysis/block.h"
+ *
+ * Copyright (C) 2013 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_ANALYSIS_BLOCK_H
+#define _PLUGINS_PYOIDA_ANALYSIS_BLOCK_H
+
+
+#include <Python.h>
+#include <stdbool.h>
+
+
+
+/* Prend en charge l'objet 'pychrysalide.analysis.InstrBlock'. */
+bool register_python_instructions_block(PyObject *);
+
+
+
+#endif /* _PLUGINS_PYOIDA_ANALYSIS_BLOCK_H */
diff --git a/plugins/pychrysa/analysis/blocks/Makefile.am b/plugins/pychrysa/analysis/blocks/Makefile.am
new file mode 100644
index 0000000..46e99ce
--- /dev/null
+++ b/plugins/pychrysa/analysis/blocks/Makefile.am
@@ -0,0 +1,17 @@
+
+noinst_LTLIBRARIES = libpychrysaanalysisblocks.la
+
+libpychrysaanalysisblocks_la_SOURCES = \
+ flow.h flow.c \
+ module.h module.c \
+ virtual.h virtual.c
+
+libpychrysaanalysisblocks_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/pychrysa/analysis/blocks/flow.c b/plugins/pychrysa/analysis/blocks/flow.c
new file mode 100644
index 0000000..216156c
--- /dev/null
+++ b/plugins/pychrysa/analysis/blocks/flow.c
@@ -0,0 +1,149 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * flow.h - équivalent Python du fichier "analysis/blocks/flow.c"
+ *
+ * Copyright (C) 2013 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 "flow.h"
+
+
+#include <pygobject.h>
+
+
+#include <analysis/blocks/flow.h>
+
+
+
+
+
+
+
+
+/* Fournit les adresses limites d'un bloc d'exécution. */
+static PyObject *py_flow_block_get_boundary_addresses(PyObject *, void *);
+
+
+
+
+
+
+
+
+/******************************************************************************
+* *
+* Paramètres : self = classe représentant une instruction. *
+* closure = adresse non utilisée ici. *
+* *
+* Description : Fournit les adresses limites d'un bloc d'exécution. *
+* *
+* Retour : Valeur associée à la propriété consultée. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static PyObject *py_flow_block_get_boundary_addresses(PyObject *self, void *closure)
+{
+ PyObject *result; /* Trouvailles à retourner */
+ GFlowBlock *block; /* Version native */
+ vmpa_t start; /* Adresse de départ du bloc */
+ vmpa_t end; /* Dernière adresse du bloc */
+
+ block = G_FLOW_BLOCK(pygobject_get(self));
+ g_flow_block_get_boundary_addresses(block, &start, &end);
+
+ result = Py_BuildValue("(KK)", start, end);
+
+ return result;
+
+}
+
+
+
+
+
+
+
+
+
+/******************************************************************************
+* *
+* Paramètres : module = module dont la définition est à compléter. *
+* *
+* Description : Prend en charge l'objet 'pychrysalide....blocks.FlowBlock'. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool register_python_flow_block(PyObject *module)
+{
+ PyObject *parent_mod; /* Module de la classe parente */
+ int ret; /* Bilan d'un appel */
+
+ static PyMethodDef py_flow_block_methods[] = {
+ { NULL }
+ };
+
+ static PyGetSetDef py_flow_block_getseters[] = {
+ {
+ "boundary_addresses", (getter)py_flow_block_get_boundary_addresses, (setter)NULL,
+ "Provide the boundary addresses of the current flow block.", NULL
+ },
+ { NULL }
+ };
+
+ static PyTypeObject py_flow_block_type = {
+
+ PyObject_HEAD_INIT(NULL)
+
+ .tp_name = "pychrysalide.analysis.blocks.FlowBlock",
+ .tp_basicsize = sizeof(PyGObject),
+
+ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+
+ .tp_doc = "PyChrysalide basic flow block",
+
+ .tp_methods = py_flow_block_methods,
+ .tp_getset = py_flow_block_getseters
+
+ };
+
+ parent_mod = PyImport_ImportModule("pychrysalide.analysis");
+ if (parent_mod == NULL) return false;
+
+ py_flow_block_type.tp_base = (PyTypeObject *)PyObject_GetAttrString(parent_mod, "InstrBlock");
+ Py_DECREF(parent_mod);
+
+ if (PyType_Ready(&py_flow_block_type) < 0)
+ return false;
+
+ Py_INCREF(&py_flow_block_type);
+ ret = PyModule_AddObject(module, "FlowBlock", (PyObject *)&py_flow_block_type);
+
+ pygobject_register_class(module, "GFlowBlock", G_TYPE_FLOW_BLOCK, &py_flow_block_type,
+ Py_BuildValue("(O)", py_flow_block_type.tp_base));
+
+ return (ret == 0);
+
+}
diff --git a/plugins/pychrysa/analysis/blocks/flow.h b/plugins/pychrysa/analysis/blocks/flow.h
new file mode 100644
index 0000000..f18fca1
--- /dev/null
+++ b/plugins/pychrysa/analysis/blocks/flow.h
@@ -0,0 +1,39 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * flow.h - prototypes pour l'équivalent Python du fichier "analysis/blocks/flow.h"
+ *
+ * Copyright (C) 2013 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_PYCHRYSA_ANALYSIS_BLOCKS_FLOW_H
+#define _PLUGINS_PYCHRYSA_ANALYSIS_BLOCKS_FLOW_H
+
+
+#include <Python.h>
+#include <stdbool.h>
+
+
+
+/* Prend en charge l'objet 'pychrysalide.analysis.blocks.FlowBlock'. */
+bool register_python_flow_block(PyObject *);
+
+
+
+#endif /* _PLUGINS_PYCHRYSA_ANALYSIS_BLOCKS_FLOW_H */
diff --git a/plugins/pychrysa/analysis/blocks/module.c b/plugins/pychrysa/analysis/blocks/module.c
new file mode 100644
index 0000000..88ed8ac
--- /dev/null
+++ b/plugins/pychrysa/analysis/blocks/module.c
@@ -0,0 +1,68 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * module.c - intégration du répertoire blocks en tant que module
+ *
+ * Copyright (C) 2013 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 "flow.h"
+#include "virtual.h"
+
+
+
+/******************************************************************************
+* *
+* Paramètres : module = module dont la définition est à compléter. *
+* *
+* Description : Ajoute le module 'blocks' au module Python. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool add_blocks_module_to_python_module(PyObject *super)
+{
+ bool result; /* Bilan à retourner */
+ PyObject *module; /* Module Python mis en place */
+ int ret; /* Bilan d'un appel */
+
+ static PyMethodDef py_blocks_methods[] = {
+ { NULL }
+ };
+
+ module = Py_InitModule("pychrysalide.analysis.blocks", py_blocks_methods);
+ if (module == NULL) return false;
+
+ Py_INCREF(module);
+ ret = PyModule_AddObject(super, "pychrysalide.analysis.blocks", module);
+
+ result = (ret == 0);
+
+ result &= register_python_flow_block(module);
+ result &= register_python_virtual_block(module);
+
+ return result;
+
+}
diff --git a/plugins/pychrysa/analysis/blocks/module.h b/plugins/pychrysa/analysis/blocks/module.h
new file mode 100644
index 0000000..1b30d0a
--- /dev/null
+++ b/plugins/pychrysa/analysis/blocks/module.h
@@ -0,0 +1,39 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * module.h - prototypes pour l'intégration du répertoire blocks en tant que module
+ *
+ * Copyright (C) 2013 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_ANALYSIS_BLOCKS_MODULE_H
+#define _PLUGINS_PYOIDA_ANALYSIS_BLOCKS_MODULE_H
+
+
+#include <Python.h>
+#include <stdbool.h>
+
+
+
+/* Ajoute le module 'blocks' au module Python. */
+bool add_blocks_module_to_python_module(PyObject *);
+
+
+
+#endif /* _PLUGINS_PYOIDA_ANALYSIS_BLOCKS_MODULE_H */
diff --git a/plugins/pychrysa/analysis/blocks/virtual.c b/plugins/pychrysa/analysis/blocks/virtual.c
new file mode 100644
index 0000000..a87fbd3
--- /dev/null
+++ b/plugins/pychrysa/analysis/blocks/virtual.c
@@ -0,0 +1,104 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * virtual.h - équivalent Python du fichier "analysis/blocks/virtual.c"
+ *
+ * Copyright (C) 2013 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 "virtual.h"
+
+
+#include <pygobject.h>
+
+
+#include <analysis/blocks/virtual.h>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/******************************************************************************
+* *
+* Paramètres : module = module dont la définition est à compléter. *
+* *
+* Description : Prend en charge l'objet 'pychrysalide.....VirtualBlock'. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool register_python_virtual_block(PyObject *module)
+{
+ PyObject *parent_mod; /* Module de la classe parente */
+ int ret; /* Bilan d'un appel */
+
+ static PyMethodDef py_virtual_block_methods[] = {
+ { NULL }
+ };
+
+ static PyGetSetDef py_virtual_block_getseters[] = {
+ { NULL }
+ };
+
+ static PyTypeObject py_virtual_block_type = {
+
+ PyObject_HEAD_INIT(NULL)
+
+ .tp_name = "pychrysalide.analysis.blocks.VirtualBlock",
+ .tp_basicsize = sizeof(PyGObject),
+
+ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+
+ .tp_doc = "PyChrysalide basic virtual block",
+
+ .tp_methods = py_virtual_block_methods,
+ .tp_getset = py_virtual_block_getseters
+
+ };
+
+ parent_mod = PyImport_ImportModule("pychrysalide.analysis");
+ if (parent_mod == NULL) return false;
+
+ py_virtual_block_type.tp_base = (PyTypeObject *)PyObject_GetAttrString(parent_mod, "InstrBlock");
+ Py_DECREF(parent_mod);
+
+ if (PyType_Ready(&py_virtual_block_type) < 0)
+ return false;
+
+ Py_INCREF(&py_virtual_block_type);
+ ret = PyModule_AddObject(module, "VirtualBlock", (PyObject *)&py_virtual_block_type);
+
+ pygobject_register_class(module, "GVirtualBlock", G_TYPE_VIRTUAL_BLOCK, &py_virtual_block_type,
+ Py_BuildValue("(O)", py_virtual_block_type.tp_base));
+
+ return (ret == 0);
+
+}
diff --git a/plugins/pychrysa/analysis/blocks/virtual.h b/plugins/pychrysa/analysis/blocks/virtual.h
new file mode 100644
index 0000000..4c56876
--- /dev/null
+++ b/plugins/pychrysa/analysis/blocks/virtual.h
@@ -0,0 +1,39 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * virtual.h - prototypes pour l'équivalent Python du fichier "analysis/blocks/virtual.h"
+ *
+ * Copyright (C) 2013 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_PYCHRYSA_ANALYSIS_BLOCKS_VIRTUAL_H
+#define _PLUGINS_PYCHRYSA_ANALYSIS_BLOCKS_VIRTUAL_H
+
+
+#include <Python.h>
+#include <stdbool.h>
+
+
+
+/* Prend en charge l'objet 'pychrysalide.analysis.blocks.VirtualBlock'. */
+bool register_python_virtual_block(PyObject *);
+
+
+
+#endif /* _PLUGINS_PYCHRYSA_ANALYSIS_BLOCKS_VIRTUAL_H */
diff --git a/plugins/pychrysa/analysis/module.c b/plugins/pychrysa/analysis/module.c
index 05c2e2e..0dfb5e0 100644
--- a/plugins/pychrysa/analysis/module.c
+++ b/plugins/pychrysa/analysis/module.c
@@ -26,7 +26,10 @@
#include "binary.h"
+#include "block.h"
+#include "routine.h"
#include "binaries/module.h"
+#include "blocks/module.h"
@@ -61,7 +64,10 @@ bool add_analysis_module_to_python_module(PyObject *super)
result = (ret == 0);
result &= register_python_loaded_binary(module);
+ result &= register_python_binary_routine(module);
+ result &= register_python_instructions_block(module);
result &= add_binaries_module_to_python_module(module);
+ result &= add_blocks_module_to_python_module(module);
return result;
diff --git a/plugins/pychrysa/analysis/routine.c b/plugins/pychrysa/analysis/routine.c
new file mode 100644
index 0000000..97834c5
--- /dev/null
+++ b/plugins/pychrysa/analysis/routine.c
@@ -0,0 +1,205 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * routine.c - équivalent Python du fichier "analysis/routine.c"
+ *
+ * Copyright (C) 2013 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 "routine.h"
+
+
+#include <pygobject.h>
+
+
+#include <analysis/routine.h>
+
+
+
+
+/* Crée un nouvel objet Python de type 'BinaryRoutine'. */
+static PyObject *py_binary_routine_new(PyTypeObject *, PyObject *, PyObject *);
+
+/* Fournit les blocs basiques de la routine. */
+static PyObject *py_binary_routine_get_basic_blocks(PyObject *, void *);
+
+
+
+/* Décrit le prototype de la routine sous forme de caractères. */
+static PyObject *py_binary_routine_str(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 'BinaryRoutine'. *
+* *
+* Retour : Instance Python mise en place. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static PyObject *py_binary_routine_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+ PyObject *result; /* Création à retourner */
+
+ result = pygobject_new(G_OBJECT(g_binary_routine_new()));
+
+ return result;
+
+}
+
+
+
+
+
+/******************************************************************************
+* *
+* Paramètres : self = classe représentant une routine binaire. *
+* closure = adresse non utilisée ici. *
+* *
+* Description : Fournit les blocs basiques de la routine. *
+* *
+* Retour : Ensemble de blocs déterminés via les instructions. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static PyObject *py_binary_routine_get_basic_blocks(PyObject *self, void *closure)
+{
+ PyObject *result; /* Eléments à retourner */
+ GBinRoutine *routine; /* Version native */
+ GInstrBlock *blocks; /* Blocs basiques de routine */
+
+ routine = G_BIN_ROUTINE(pygobject_get(self));
+ blocks = g_binary_routine_get_basic_blocks(routine);
+
+ result = pygobject_new(G_OBJECT(blocks));
+
+ return result;
+
+}
+
+
+
+
+
+/******************************************************************************
+* *
+* Paramètres : self = classe représentant une routine binaire. *
+* *
+* Description : Décrit le prototype de la routine sous forme de caractères. *
+* *
+* Retour : Chaîne de caractères. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static PyObject *py_binary_routine_str(PyObject *self)
+{
+ PyObject *result; /* Chaîne à retourner */
+ GBinRoutine *routine; /* Version native */
+ char *string; /* Description à libérer */
+
+ routine = G_BIN_ROUTINE(pygobject_get(self));
+ string = g_binary_routine_to_string(routine);
+
+ result = PyString_FromString(string);
+
+ free(string);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : module = module dont la définition est à compléter. *
+* *
+* Description : Prend en charge l'objet 'pychrysalide.analysis.LoadedBinary'.*
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool register_python_binary_routine(PyObject *module)
+{
+ PyObject *pygobj_mod; /* Module Python-GObject */
+ int ret; /* Bilan d'un appel */
+
+ static PyMethodDef py_binary_routine_methods[] = {
+ { NULL }
+ };
+
+ static PyGetSetDef py_binary_routine_getseters[] = {
+ {
+ "basic_blocks", (getter)py_binary_routine_get_basic_blocks, (setter)NULL,
+ "Provide the basic blocks of the binary routine.", NULL
+ },
+ { NULL }
+ };
+
+ static PyTypeObject py_binary_routine_type = {
+
+ PyObject_HEAD_INIT(NULL)
+
+ .tp_name = "pychrysalide.analysis.BinaryRoutine",
+ .tp_basicsize = sizeof(PyGObject),
+
+ .tp_str = py_binary_routine_str,
+
+ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+
+ .tp_doc = "PyChrysalide binary routine",
+
+ .tp_methods = py_binary_routine_methods,
+ .tp_getset = py_binary_routine_getseters,
+ .tp_new = (newfunc)py_binary_routine_new
+
+ };
+
+ pygobj_mod = PyImport_ImportModule("gobject");
+ if (pygobj_mod == NULL) return false;
+
+ py_binary_routine_type.tp_base = (PyTypeObject *)PyObject_GetAttrString(pygobj_mod, "GObject");
+ Py_DECREF(pygobj_mod);
+
+ if (PyType_Ready(&py_binary_routine_type) < 0)
+ return false;
+
+ Py_INCREF(&py_binary_routine_type);
+ ret = PyModule_AddObject(module, "BinaryRoutine", (PyObject *)&py_binary_routine_type);
+
+ pygobject_register_class(module, "GBinRoutine", G_TYPE_BIN_ROUTINE, &py_binary_routine_type,
+ Py_BuildValue("(O)", py_binary_routine_type.tp_base));
+
+ return (ret == 0);
+
+}
diff --git a/plugins/pychrysa/analysis/routine.h b/plugins/pychrysa/analysis/routine.h
new file mode 100644
index 0000000..1f3d054
--- /dev/null
+++ b/plugins/pychrysa/analysis/routine.h
@@ -0,0 +1,39 @@
+
+/* OpenIDA - Outil d'analyse de fichiers binaires
+ * routine.h - prototypes pour l'équivalent Python du fichier "analysis/routine.h"
+ *
+ * Copyright (C) 2013 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_ANALYSIS_ROUTINE_H
+#define _PLUGINS_PYOIDA_ANALYSIS_ROUTINE_H
+
+
+#include <Python.h>
+#include <stdbool.h>
+
+
+
+/* Prend en charge l'objet 'pychrysalide.analysis.BinaryRoutine'. */
+bool register_python_binary_routine(PyObject *);
+
+
+
+#endif /* _PLUGINS_PYOIDA_ANALYSIS_ROUTINE_H */