diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2015-09-11 20:40:24 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2015-09-11 20:40:24 (GMT) |
commit | 18648e4e8763a3bc005d6fae51eae3d1528d7d29 (patch) | |
tree | 05feca5b6c5575b2a048b60130e3207b9f2c355a /plugins | |
parent | 9f8c79e3b272960b48bfd85a24f4b5cb5651df2d (diff) |
Created an interface from the original GBinContent object.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@576 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/mobicore/mclf-int.c | 2 | ||||
-rw-r--r-- | plugins/mobicore/mclf.c | 2 | ||||
-rw-r--r-- | plugins/pychrysa/analysis/Makefile.am | 4 | ||||
-rw-r--r-- | plugins/pychrysa/analysis/content.c (renamed from plugins/pychrysa/glibext/bincontent.c) | 136 | ||||
-rw-r--r-- | plugins/pychrysa/analysis/content.h (renamed from plugins/pychrysa/glibext/bincontent.h) | 8 | ||||
-rw-r--r-- | plugins/pychrysa/analysis/contents/Makefile.am | 14 | ||||
-rw-r--r-- | plugins/pychrysa/analysis/contents/file.c | 199 | ||||
-rw-r--r-- | plugins/pychrysa/analysis/contents/file.h | 42 | ||||
-rw-r--r-- | plugins/pychrysa/analysis/contents/module.c | 92 | ||||
-rw-r--r-- | plugins/pychrysa/analysis/contents/module.h | 39 | ||||
-rw-r--r-- | plugins/pychrysa/analysis/module.c | 4 | ||||
-rw-r--r-- | plugins/pychrysa/core/formats.c | 190 | ||||
-rw-r--r-- | plugins/pychrysa/core/formats.h | 42 | ||||
-rw-r--r-- | plugins/pychrysa/format/dex/dex.c | 2 | ||||
-rw-r--r-- | plugins/pychrysa/format/elf/elf.c | 2 | ||||
-rw-r--r-- | plugins/pychrysa/glibext/Makefile.am | 1 | ||||
-rw-r--r-- | plugins/pychrysa/glibext/module.c | 2 | ||||
-rw-r--r-- | plugins/ropgadgets/select.c | 3 |
18 files changed, 700 insertions, 84 deletions
diff --git a/plugins/mobicore/mclf-int.c b/plugins/mobicore/mclf-int.c index cb4dbb3..a4dd3b7 100644 --- a/plugins/mobicore/mclf-int.c +++ b/plugins/mobicore/mclf-int.c @@ -62,7 +62,7 @@ bool read_mclf_header(GMCLFFormat *format, mclf_header_t *header, SourceEndian e printf("Mem type : 0x%08x\n", header->v1.mem_type); result &= g_binary_content_read_u32(content, &pos, endian, &header->v1.num_instances); - result &= g_binary_content_get_raw(content, &pos, 16, (bin_t *)&header->v1.uuid); + result &= g_binary_content_read_raw(content, &pos, 16, (bin_t *)&header->v1.uuid); result &= g_binary_content_read_u32(content, &pos, endian, &header->v1.driver_id); result &= g_binary_content_read_u32(content, &pos, endian, &header->v1.num_threads); diff --git a/plugins/mobicore/mclf.c b/plugins/mobicore/mclf.c index 829a488..99ff7ed 100644 --- a/plugins/mobicore/mclf.c +++ b/plugins/mobicore/mclf.c @@ -74,7 +74,7 @@ const char *mclf_is_matching(GBinContent *content, GExeFormat *parent) init_vmpa(&addr, 0, VMPA_NO_VIRTUAL); - status = g_binary_content_get_raw(content, &addr, 4, (bin_t *)magic); + status = g_binary_content_read_raw(content, &addr, 4, (bin_t *)magic); status &= (memcmp(magic, MC_SERVICE_HEADER_MAGIC_STR, 4) == 0); diff --git a/plugins/pychrysa/analysis/Makefile.am b/plugins/pychrysa/analysis/Makefile.am index 8b0609d..c014dfd 100644 --- a/plugins/pychrysa/analysis/Makefile.am +++ b/plugins/pychrysa/analysis/Makefile.am @@ -4,12 +4,14 @@ noinst_LTLIBRARIES = libpychrysaanalysis.la libpychrysaanalysis_la_SOURCES = \ binary.h binary.c \ block.h block.c \ + content.h content.c \ module.h module.c \ routine.h routine.c libpychrysaanalysis_la_LIBADD = \ binaries/libpychrysaanalysisbinaries.la \ blocks/libpychrysaanalysisblocks.la \ + contents/libpychrysaanalysiscontents.la \ db/libpychrysaanalysisdb.la libpychrysaanalysis_la_LDFLAGS = @@ -20,4 +22,4 @@ AM_CPPFLAGS = $(LIBGTK_CFLAGS) $(LIBXML_CFLAGS) $(LIBPYTHON_CFLAGS) $(LIBPYGOBJE AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) $(COMPLIANCE_FLAGS) -SUBDIRS = binaries blocks db +SUBDIRS = binaries blocks contents db diff --git a/plugins/pychrysa/glibext/bincontent.c b/plugins/pychrysa/analysis/content.c index 085c9af..a37aa44 100644 --- a/plugins/pychrysa/glibext/bincontent.c +++ b/plugins/pychrysa/analysis/content.c @@ -1,6 +1,6 @@ /* Chrysalide - Outil d'analyse de fichiers binaires - * bincontent.c - prototypes pour l'équivalent Python du fichier "glibext/gbincontent.c" + * content.c - prototypes pour l'équivalent Python du fichier "analysis/content.c" * * Copyright (C) 2015 Cyrille Bagard * @@ -22,20 +22,15 @@ */ -#include "bincontent.h" +#include "content.h" #include <pygobject.h> -#include <glibext/gbincontent.h> +#include <analysis/content.h> -#include "../arch/vmpa.h" - - -/* Crée un nouvel objet Python de type 'BinContent'. */ -static PyObject *py_binary_content_new(PyTypeObject *, PyObject *, PyObject *); /* Fournit une empreinte unique (SHA256) pour les données. */ static PyObject *py_binary_content_get_checksum(PyObject *, PyObject *); @@ -48,51 +43,6 @@ static PyObject *py_binary_content_read_u8(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 'BinContent'. * -* * -* Retour : Instance Python mise en place. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_binary_content_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PyObject *result; /* Instance à retourner */ - const char *filename; /* Nom du fichier à charger */ - int ret; /* Bilan de lecture des args. */ - GBinContent *content; /* Version GLib du contenu */ - - ret = PyArg_ParseTuple(args, "s", &filename); - if (!ret) Py_RETURN_NONE; - - content = g_binary_content_new_from_file(filename); - - result = pygobject_new(G_OBJECT(content)); - g_object_unref(content); - - return result; - -} - - /****************************************************************************** * * * Paramètres : self = contenu binaire à manipuler. * @@ -114,9 +64,12 @@ static PyObject *py_binary_content_get_checksum(PyObject *self, PyObject *args) content = G_BIN_CONTENT(pygobject_get(self)); - checksum = g_binary_content_get_cheksum(content); + //checksum = g_binary_content_get_cheksum(content); - result = PyUnicode_FromString(checksum); + printf("YEAH\n"); + fflush(NULL); + + result = PyUnicode_FromString("checksum"); return result; @@ -204,10 +157,6 @@ static PyObject *py_binary_content_read_u8(PyObject *self, PyObject *args) - - - - /****************************************************************************** * * * Paramètres : - * @@ -220,12 +169,52 @@ static PyObject *py_binary_content_read_u8(PyObject *self, PyObject *args) * * ******************************************************************************/ + +static PyMethodDef py_binary_content_methods[] = { + { "get_checksum", py_binary_content_get_checksum, + METH_NOARGS, + "get_checksum($self, /)\n--\n\nCompute a SHA256 hash as chechsum of handled data." + }, + { "compute_size", py_binary_content_compute_size, + METH_NOARGS, + "compute_size($self, /)\n--\n\nCompute the quantity of readable bytes." + }, + { "read_u8", py_binary_content_read_u8, + METH_VARARGS, + "read_u8($self, addr, /)\n--\n\nRead an unsigned byte from a given position." + }, + { NULL } +}; + +static PyGetSetDef py_binary_content_getseters[] = { + { NULL } +}; + +PyTypeObject py_binary_content_type = { + + PyVarObject_HEAD_INIT(NULL, 0) + + .tp_name = "pychrysalide.analysis.contents.BinContent", + .tp_basicsize = sizeof(PyObject), + + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + + .tp_doc = "PyChrysalide binary content", + + .tp_methods = py_binary_content_methods, + //.tp_getset = py_binary_content_getseters + +}; + + + PyTypeObject *get_python_binary_content_type(void) { +#if 0 static PyMethodDef py_binary_content_methods[] = { - { "get_cheksum", py_binary_content_get_checksum, + { "get_checksum", py_binary_content_get_checksum, METH_NOARGS, - "get_cheksum($self, /)\n--\n\nCompute a SHA256 hash as chechsum of handled data." + "get_checksum($self, /)\n--\n\nCompute a SHA256 hash as chechsum of handled data." }, { "compute_size", py_binary_content_compute_size, METH_NOARGS, @@ -246,19 +235,18 @@ PyTypeObject *get_python_binary_content_type(void) PyVarObject_HEAD_INIT(NULL, 0) - .tp_name = "pychrysalide.glibext.BinContent", - .tp_basicsize = sizeof(PyGObject), + .tp_name = "pychrysalide.analysis.contents.BinContent", + .tp_basicsize = sizeof(PyObject), - .tp_flags = Py_TPFLAGS_DEFAULT, + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, .tp_doc = "PyChrysalide binary content", .tp_methods = py_binary_content_methods, - .tp_getset = py_binary_content_getseters, - .tp_new = (newfunc)py_binary_content_new + //.tp_getset = py_binary_content_getseters }; - +#endif return &py_binary_content_type; } @@ -284,19 +272,25 @@ bool register_python_binary_content(PyObject *module) py_binary_content_type = get_python_binary_content_type(); - py_binary_content_type->tp_base = &PyGObject_Type; - py_binary_content_type->tp_basicsize = py_binary_content_type->tp_base->tp_basicsize; + //py_binary_content_type->tp_base = &PyGObject_Type; + //py_binary_content_type->tp_basicsize = py_binary_content_type->tp_base->tp_basicsize; + + //py_binary_content_type->tp_base = &PyObject_Type; + //py_binary_content_type->tp_basicsize = py_binary_content_type->tp_base->tp_basicsize; + /* if (PyType_Ready(py_binary_content_type) != 0) return false; + */ + /* Py_INCREF(py_binary_content_type); ret = PyModule_AddObject(module, "BinContent", (PyObject *)py_binary_content_type); if (ret != 0) return false; + */ dict = PyModule_GetDict(module); - pygobject_register_class(dict, "BinContent", G_TYPE_BIN_CONTENT, py_binary_content_type, - Py_BuildValue("(O)", py_binary_content_type->tp_base)); + pyg_register_interface(dict, "BinContent", G_TYPE_BIN_CONTENT, py_binary_content_type); return true; diff --git a/plugins/pychrysa/glibext/bincontent.h b/plugins/pychrysa/analysis/content.h index b6ae9a5..230bfe1 100644 --- a/plugins/pychrysa/glibext/bincontent.h +++ b/plugins/pychrysa/analysis/content.h @@ -1,6 +1,6 @@ /* Chrysalide - Outil d'analyse de fichiers binaires - * bincontent.h - prototypes pour l'équivalent Python du fichier "glibext/gbincontent.h" + * content.h - prototypes pour l'équivalent Python du fichier "analysis/content.h" * * Copyright (C) 2015 Cyrille Bagard * @@ -22,8 +22,8 @@ */ -#ifndef _PLUGINS_PYCHRYSA_GLIBEXT_BINCONTENT_H -#define _PLUGINS_PYCHRYSA_GLIBEXT_BINCONTENT_H +#ifndef _PLUGINS_PYCHRYSA_ANALYSIS_CONTENT_H +#define _PLUGINS_PYCHRYSA_ANALYSIS_CONTENT_H #include <Python.h> @@ -39,4 +39,4 @@ bool register_python_binary_content(PyObject *); -#endif /* _PLUGINS_PYCHRYSA_GLIBEXT_BINCONTENT_H */ +#endif /* _PLUGINS_PYCHRYSA_ANALYSIS_CONTENT_H */ diff --git a/plugins/pychrysa/analysis/contents/Makefile.am b/plugins/pychrysa/analysis/contents/Makefile.am new file mode 100644 index 0000000..ff835e3 --- /dev/null +++ b/plugins/pychrysa/analysis/contents/Makefile.am @@ -0,0 +1,14 @@ + +noinst_LTLIBRARIES = libpychrysaanalysiscontents.la + +libpychrysaanalysiscontents_la_SOURCES = \ + file.h file.c \ + module.h module.c + +libpychrysaanalysiscontents_la_LDFLAGS = + + +AM_CPPFLAGS = $(LIBGTK_CFLAGS) $(LIBXML_CFLAGS) $(LIBPYTHON_CFLAGS) $(LIBPYGOBJECT_CFLAGS) \ + -I../../../../src + +AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) $(COMPLIANCE_FLAGS) diff --git a/plugins/pychrysa/analysis/contents/file.c b/plugins/pychrysa/analysis/contents/file.c new file mode 100644 index 0000000..b145662 --- /dev/null +++ b/plugins/pychrysa/analysis/contents/file.c @@ -0,0 +1,199 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * file.c - prototypes pour l'équivalent Python du fichier "analysis/contents/file.c" + * + * Copyright (C) 2015 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * 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 "file.h" + + +#include <pygobject.h> + + +#include <analysis/contents/file.h> + + + +/* Crée un nouvel objet Python de type 'BinContent'. */ +static PyObject *py_file_content_new(PyTypeObject *, 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 'BinContent'. * +* * +* Retour : Instance Python mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_file_content_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + PyObject *result; /* Instance à retourner */ + const char *filename; /* Nom du fichier à charger */ + int ret; /* Bilan de lecture des args. */ + GBinContent *content; /* Version GLib du contenu */ + + ret = PyArg_ParseTuple(args, "s", &filename); + if (!ret) Py_RETURN_NONE; + + content = g_file_content_new(filename); + + result = pygobject_new(G_OBJECT(content)); + g_object_unref(content); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : - * +* * +* Description : Fournit un accès à une définition de type à diffuser. * +* * +* Retour : Définition d'objet pour Python. * +* * +* Remarques : - * +* * +******************************************************************************/ + + + +PyMethodDef py_file_content_methods[] = { + { NULL } +}; + +PyGetSetDef py_file_content_getseters[] = { + { NULL } +}; + +PyTypeObject py_file_content_type = { + + PyVarObject_HEAD_INIT(NULL, 0) + + .tp_name = "pychrysalide.analysis.contents.FileContent", + .tp_basicsize = sizeof(PyGObject), + + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + + .tp_doc = "PyChrysalide binary file content", + + /* + .tp_methods = py_file_content_methods, + .tp_getset = py_file_content_getseters, + .tp_new = (newfunc)py_file_content_new + */ + +}; + + + +PyTypeObject *get_python_file_content_type(void) +{ +#if 0 + static PyMethodDef py_file_content_methods[] = { + { NULL } + }; + + static PyGetSetDef py_file_content_getseters[] = { + { NULL } + }; + + static PyTypeObject py_file_content_type = { + + PyVarObject_HEAD_INIT(NULL, 0) + + .tp_name = "pychrysalide.analysis.contents.FileContent", + .tp_basicsize = sizeof(PyGObject), + + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | 1 << 9, + + .tp_doc = "PyChrysalide binary file content", + + /* + .tp_methods = py_file_content_methods, + .tp_getset = py_file_content_getseters, + .tp_new = (newfunc)py_file_content_new + */ + + }; +#endif + return &py_file_content_type; + +} + + +/****************************************************************************** +* * +* Paramètres : module = module dont la définition est à compléter. * +* * +* Description : Prend en charge l'objet 'pychrysalide.glibext.BinContent'. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ +#include "../content.h" +bool register_python_file_content(PyObject *module) +{ + PyTypeObject *py_file_content_type; /* Type Python 'BinContent' */ + int ret; /* Bilan d'un appel */ + PyObject *dict; /* Dictionnaire du module */ + + py_file_content_type = get_python_file_content_type(); + + //py_file_content_type->tp_base = &PyGObject_Type; + //py_file_content_type->tp_basicsize = py_file_content_type->tp_base->tp_basicsize; + + /* + if (PyType_Ready(py_file_content_type) != 0) + return false; + */ + + /* + Py_INCREF(py_file_content_type); + ret = PyModule_AddObject(module, "FileContent", (PyObject *)py_file_content_type); + if (ret != 0) return false; + */ + + dict = PyModule_GetDict(module); + pygobject_register_class(dict, "FileContent", G_TYPE_FILE_CONTENT, py_file_content_type, + Py_BuildValue("(O)", &PyGObject_Type/*py_file_content_type->tp_base*/, + get_python_binary_content_type())); + + /* + if (PyType_Ready(py_file_content_type) != 0) + return false; + */ + + + return true; + +} diff --git a/plugins/pychrysa/analysis/contents/file.h b/plugins/pychrysa/analysis/contents/file.h new file mode 100644 index 0000000..a9edcef --- /dev/null +++ b/plugins/pychrysa/analysis/contents/file.h @@ -0,0 +1,42 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * file.h - prototypes pour l'équivalent Python du fichier "analysis/contents/file.h" + * + * Copyright (C) 2015 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * 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_CONTENTS_FILE_H +#define _PLUGINS_PYCHRYSA_ANALYSIS_CONTENTS_FILE_H + + +#include <Python.h> +#include <stdbool.h> + + + +/* Fournit un accès à une définition de type à diffuser. */ +PyTypeObject *get_python_file_content_type(void); + +/* Prend en charge l'objet 'pychrysalide.glibext.BinContent'. */ +bool register_python_file_content(PyObject *); + + + +#endif /* _PLUGINS_PYCHRYSA_ANALYSIS_CONTENTS_FILE_H */ diff --git a/plugins/pychrysa/analysis/contents/module.c b/plugins/pychrysa/analysis/contents/module.c new file mode 100644 index 0000000..f97ba27 --- /dev/null +++ b/plugins/pychrysa/analysis/contents/module.c @@ -0,0 +1,92 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * module.c - intégration du répertoire contents en tant que module + * + * Copyright (C) 2013 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * 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 <assert.h> + + +#include "file.h" + + + +/****************************************************************************** +* * +* Paramètres : module = module dont la définition est à compléter. * +* * +* Description : Ajoute le module 'contents' au module Python. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ +#include "../content.h" +bool add_analysis_contents_module_to_python_module(PyObject *super) +{ + bool result; /* Bilan à retourner */ + PyObject *module; /* Sous-module mis en place */ + int ret; /* Bilan d'un appel */ + + static PyModuleDef py_chrysalide_contents_module = { + + .m_base = PyModuleDef_HEAD_INIT, + + .m_name = "pychrysalide.analysis.contents", + .m_doc = "Python module for Chrysalide.analysis.contents", + + .m_size = -1, + + }; + + result = false; + + module = PyModule_Create(&py_chrysalide_contents_module); + if (module == NULL) return false; + + ret = PyState_AddModule(super, &py_chrysalide_contents_module); + if (ret != 0) goto loading_failed; + + ret = _PyImport_FixupBuiltin(module, "pychrysalide.analysis.contents"); + if (ret != 0) goto loading_failed; + + Py_INCREF(module); + ret = PyModule_AddObject(super, "contents", module); + if (ret != 0) goto loading_failed; + + result = true; + + result &= register_python_binary_content(module); + + + result &= register_python_file_content(module); + + loading_failed: + + assert(result); + + return result; + +} diff --git a/plugins/pychrysa/analysis/contents/module.h b/plugins/pychrysa/analysis/contents/module.h new file mode 100644 index 0000000..35ff722 --- /dev/null +++ b/plugins/pychrysa/analysis/contents/module.h @@ -0,0 +1,39 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * module.h - prototypes pour l'intégration du répertoire contents en tant que module + * + * Copyright (C) 2013 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * 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_CONTENTS_MODULE_H +#define _PLUGINS_PYOIDA_ANALYSIS_CONTENTS_MODULE_H + + +#include <Python.h> +#include <stdbool.h> + + + +/* Ajoute le module 'contents' au module Python. */ +bool add_analysis_contents_module_to_python_module(PyObject *); + + + +#endif /* _PLUGINS_PYOIDA_ANALYSIS_CONTENTS_MODULE_H */ diff --git a/plugins/pychrysa/analysis/module.c b/plugins/pychrysa/analysis/module.c index d45a3f1..2520d42 100644 --- a/plugins/pychrysa/analysis/module.c +++ b/plugins/pychrysa/analysis/module.c @@ -30,9 +30,11 @@ #include "binary.h" #include "block.h" +#include "content.h" #include "routine.h" #include "binaries/module.h" #include "blocks/module.h" +#include "contents/module.h" #include "db/module.h" @@ -85,10 +87,12 @@ bool add_analysis_module_to_python_module(PyObject *super) result &= register_python_loaded_binary(module); result &= register_python_instr_block(module); + //result &= register_python_binary_content(module); result &= register_python_binary_routine(module); result &= add_analysis_binaries_module_to_python_module(module); result &= add_analysis_blocks_module_to_python_module(module); + result &= add_analysis_contents_module_to_python_module(module); result &= add_analysis_db_module_to_python_module(module); loading_failed: diff --git a/plugins/pychrysa/core/formats.c b/plugins/pychrysa/core/formats.c new file mode 100644 index 0000000..5c10ba8 --- /dev/null +++ b/plugins/pychrysa/core/formats.c @@ -0,0 +1,190 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * formats.c - équivalent Python du fichier "core/formats.c" + * + * Copyright (C) 2014 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * 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 "formats.h" + + +#include <pygobject.h> + + +#include <core/formats.h> + + +#include "../helpers.h" + + + +/* Fournit le nom humain du format binaire visé. */ +static PyObject *py_formats_get_binary_format_name(PyObject *, PyObject *); + +/* Définit les constantes pour les paramètres. */ +static bool py_formats_define_constants(PyTypeObject *); + + + +/****************************************************************************** +* * +* Paramètres : self = NULL car méthode statique. * +* args = non utilisé ici. * +* * +* Description : Fournit le nom humain du format binaire visé. * +* * +* Retour : Désignation humaine trouvée ou None. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_formats_get_binary_format_name(PyObject *self, PyObject *args) +{ + PyObject *result; /* Désignation à retourner */ + const char *key; /* Nom court du format */ + int ret; /* Bilan de lecture des args. */ + const char *name; /* Désignation humaine */ + + ret = PyArg_ParseTuple(args, "s", &key); + if (!ret) return NULL; + + name = get_binary_format_name(key); + + if (name != NULL) + result = PyUnicode_FromString(name); + + else + { + result = Py_None; + Py_INCREF(result); + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : - * +* * +* Description : Fournit un accès à une définition de type à diffuser. * +* * +* Retour : Définition d'objet pour Python. * +* * +* Remarques : - * +* * +******************************************************************************/ + +PyTypeObject *get_python_formats_type(void) +{ + static PyMethodDef py_formats_methods[] = { + + { "get_binary_format_name", py_formats_get_binary_format_name, + METH_VARARGS | METH_STATIC, + "get_binary_format_name(key, /)\n--\n\nGive access to the main configuration of Chrysalide." + }, + { NULL } + + }; + + static PyTypeObject py_formats_type = { + + PyVarObject_HEAD_INIT(NULL, 0) + + .tp_name = "pychrysalide.core.formats", + .tp_basicsize = sizeof(PyObject), + + .tp_flags = Py_TPFLAGS_DEFAULT, + + .tp_doc = "Python object for parameters", + + .tp_methods = py_formats_methods + + }; + + return &py_formats_type; + +} + + +/****************************************************************************** +* * +* Paramètres : obj_type = type dont le dictionnaire est à compléter. * +* * +* Description : Définit les constantes pour les paramètres. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool py_formats_define_constants(PyTypeObject *obj_type) +{ + bool result; /* Bilan à retourner */ + + result = true; + + result &= PyDict_AddIntMacro(obj_type, FMS_MATCHED); + result &= PyDict_AddIntMacro(obj_type, FMS_FORWARDED); + result &= PyDict_AddIntMacro(obj_type, FMS_UNKNOWN); + + result &= PyDict_AddIntMacro(obj_type, FMS_COUNT); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : module = module dont la définition est à compléter. * +* * +* Description : Prend en charge l'objet 'pychrysalide.core.formats'. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool register_python_formats(PyObject *module) +{ + PyTypeObject *py_formats_type; /* Type Python pour 'formats' */ + int ret; /* Bilan d'un appel */ + + py_formats_type = get_python_formats_type(); + + py_formats_type->tp_new = PyType_GenericNew; + + if (PyType_Ready(py_formats_type) != 0) + return false; + + if (!py_formats_define_constants(py_formats_type)) + return false; + + Py_INCREF(py_formats_type); + ret = PyModule_AddObject(module, "formats", (PyObject *)py_formats_type); + + return (ret == 0); + +} diff --git a/plugins/pychrysa/core/formats.h b/plugins/pychrysa/core/formats.h new file mode 100644 index 0000000..f4fe2db --- /dev/null +++ b/plugins/pychrysa/core/formats.h @@ -0,0 +1,42 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * formats.h - prototypes pour l'équivalent Python du fichier "core/formats.h" + * + * Copyright (C) 2014 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * 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_PYCHRYSALIDE_CORE_FORMATS_H +#define _PLUGINS_PYCHRYSALIDE_CORE_FORMATS_H + + +#include <Python.h> +#include <stdbool.h> + + + +/* Fournit un accès à une définition de type à diffuser. */ +PyTypeObject *get_python_formats_type(void); + +/* Prend en charge l'objet 'pychrysalide.core.formats'. */ +bool register_python_formats(PyObject *); + + + +#endif /* _PLUGINS_PYCHRYSALIDE_CORE_FORMATS_H */ diff --git a/plugins/pychrysa/format/dex/dex.c b/plugins/pychrysa/format/dex/dex.c index a11af52..08c48f0 100644 --- a/plugins/pychrysa/format/dex/dex.c +++ b/plugins/pychrysa/format/dex/dex.c @@ -33,7 +33,7 @@ #include "../executable.h" -#include "../../glibext/bincontent.h" +#include "../../analysis/content.h" diff --git a/plugins/pychrysa/format/elf/elf.c b/plugins/pychrysa/format/elf/elf.c index a292c91..07e5130 100644 --- a/plugins/pychrysa/format/elf/elf.c +++ b/plugins/pychrysa/format/elf/elf.c @@ -32,7 +32,7 @@ #include "../executable.h" -#include "../../glibext/bincontent.h" +#include "../../analysis/content.h" diff --git a/plugins/pychrysa/glibext/Makefile.am b/plugins/pychrysa/glibext/Makefile.am index 0a61da2..74def8a 100644 --- a/plugins/pychrysa/glibext/Makefile.am +++ b/plugins/pychrysa/glibext/Makefile.am @@ -2,7 +2,6 @@ noinst_LTLIBRARIES = libpychrysaglibext.la libpychrysaglibext_la_SOURCES = \ - bincontent.h bincontent.c \ bufferline.h bufferline.c \ codebuffer.h codebuffer.c \ configuration.h configuration.c \ diff --git a/plugins/pychrysa/glibext/module.c b/plugins/pychrysa/glibext/module.c index 0cb96a7..b34b91e 100644 --- a/plugins/pychrysa/glibext/module.c +++ b/plugins/pychrysa/glibext/module.c @@ -28,7 +28,6 @@ #include <assert.h> -#include "bincontent.h" #include "bufferline.h" #include "codebuffer.h" #include "configuration.h" @@ -81,7 +80,6 @@ bool add_glibext_module_to_python_module(PyObject *super) result = true; - result &= register_python_binary_content(module); result &= register_python_buffer_line(module); result &= register_python_code_buffer(module); result &= register_python_config_param(module); diff --git a/plugins/ropgadgets/select.c b/plugins/ropgadgets/select.c index 514b6ca..53995e5 100644 --- a/plugins/ropgadgets/select.c +++ b/plugins/ropgadgets/select.c @@ -36,6 +36,7 @@ #include <analysis/project.h> +#include <analysis/contents/file.h> #include <common/cpp.h> #include <common/extstr.h> #include <core/formats.h> @@ -1326,7 +1327,7 @@ static GBinFormat *load_external_format_for_rop_gadgets(GObject *ref) /* Récupération du contenu binaire */ - content = g_binary_content_new_from_file(filename); + content = g_file_content_new(filename); if (content == NULL) { push_status_printing_of_rop_search_step(ref, "loading", _("unable to get the binary content"), false); |