diff options
Diffstat (limited to 'plugins/pychrysa/arch')
-rw-r--r-- | plugins/pychrysa/arch/Makefile.am | 10 | ||||
-rw-r--r-- | plugins/pychrysa/arch/archbase.h | 20 | ||||
-rw-r--r-- | plugins/pychrysa/arch/instruction.c | 2 | ||||
-rw-r--r-- | plugins/pychrysa/arch/module.c | 47 | ||||
-rw-r--r-- | plugins/pychrysa/arch/module.h | 6 | ||||
-rw-r--r-- | plugins/pychrysa/arch/vmpa.c | 325 | ||||
-rw-r--r-- | plugins/pychrysa/arch/vmpa.h | 42 |
7 files changed, 426 insertions, 26 deletions
diff --git a/plugins/pychrysa/arch/Makefile.am b/plugins/pychrysa/arch/Makefile.am index a01d570..54b9261 100644 --- a/plugins/pychrysa/arch/Makefile.am +++ b/plugins/pychrysa/arch/Makefile.am @@ -2,10 +2,14 @@ noinst_LTLIBRARIES = libpychrysaarch.la libpychrysaarch_la_SOURCES = \ - archbase.h archbase.c \ - instruction.h instruction.c \ module.h module.c \ - processor.h processor.c + vmpa.h vmpa.c + +# libpychrysaarch_la_SOURCES = \ +# archbase.h archbase.c \ +# instruction.h instruction.c \ +# module.h module.c \ +# processor.h processor.c libpychrysaarch_la_LDFLAGS = diff --git a/plugins/pychrysa/arch/archbase.h b/plugins/pychrysa/arch/archbase.h index 8721371..b5d9811 100644 --- a/plugins/pychrysa/arch/archbase.h +++ b/plugins/pychrysa/arch/archbase.h @@ -1,8 +1,8 @@ /* Chrysalide - Outil d'analyse de fichiers binaires - * archbase.h - prototypes pour l'équivalent Python du fichier "arch/archbase.h" + * vmpa.h - prototypes pour l'équivalent Python du fichier "arch/vmpa.h" * - * Copyright (C) 2010-2012 Cyrille Bagard + * Copyright (C) 2014 Cyrille Bagard * * This file is part of Chrysalide. * @@ -22,11 +22,19 @@ */ -#ifndef _PLUGINS_PYOIDA_ARCH_ARCHBASE_H -#define _PLUGINS_PYOIDA_ARCH_ARCHBASE_H +#ifndef _PLUGINS_PYCHRYSA_ARCH_VMPA_H +#define _PLUGINS_PYCHRYSA_ARCH_VMPA_H + #include <Python.h> + + + + + + +#if 0 #include <stdbool.h> #include <arch/archbase.h> @@ -38,7 +46,9 @@ PyObject *py_vmpa_new_from_existing(vmpa_t); /* Ajoute l'objet 'arch.vmpa' au module Python. */ bool add_arch_vmpa_to_python_module(PyObject *); +#endif + -#endif /* _PLUGINS_PYOIDA_ARCH_ARCHBASE_H */ +#endif /* _PLUGINS_PYCHRYSA_ARCH_VMPA_H */ diff --git a/plugins/pychrysa/arch/instruction.c b/plugins/pychrysa/arch/instruction.c index 685d82f..efbdaa5 100644 --- a/plugins/pychrysa/arch/instruction.c +++ b/plugins/pychrysa/arch/instruction.c @@ -223,7 +223,7 @@ bool register_python_arch_instruction_iterator(PyObject *module) .tp_dealloc = (destructor)py_arch_instruction_iterator_dealloc, - .tp_flags = Py_TPFLAGS_HAVE_ITER | Py_TPFLAGS_HAVE_CLASS, + //.tp_flags = Py_TPFLAGS_HAVE_ITER | Py_TPFLAGS_HAVE_CLASS, .tp_doc = "PyChrysalide architecture instruction iterator", diff --git a/plugins/pychrysa/arch/module.c b/plugins/pychrysa/arch/module.c index 7e8fcb3..92172e0 100644 --- a/plugins/pychrysa/arch/module.c +++ b/plugins/pychrysa/arch/module.c @@ -25,9 +25,7 @@ #include "module.h" -#include "instruction.h" - - +#include "vmpa.h" @@ -45,28 +43,49 @@ bool add_arch_module_to_python_module(PyObject *super) { - bool result; - PyObject *module; + bool result; /* Bilan à retourner */ + PyObject *module; /* Sous-module mis en place */ int ret; /* Bilan d'un appel */ - static PyMethodDef py_arch_methods[] = { - { NULL } + static PyModuleDef py_chrysalide_arch_module = { + + .m_base = PyModuleDef_HEAD_INIT, + + .m_name = "pychrysalide.arch", + .m_doc = "Python module for Chrysalide.arch", + + .m_size = -1, + }; - module = Py_InitModule("pychrysalide.arch", py_arch_methods); + result = false; + + module = PyModule_Create(&py_chrysalide_arch_module); if (module == NULL) return false; + ret = PyState_AddModule(super, &py_chrysalide_arch_module); + if (ret != 0) goto aamtpm_exit; + + ret = _PyImport_FixupBuiltin(module, "pychrysalide.arch"); + if (ret != 0) goto aamtpm_exit; Py_INCREF(module); - ret = PyModule_AddObject(super, "pychrysalide.arch", module); + ret = PyModule_AddObject(super, "arch", module); + if (ret != 0) goto aamtpm_exit; + + result = true; + + result &= register_python_vmpa(module); - result = (ret == 0); + aamtpm_exit: - if (ret != 0) /* ... */; + if (!result) + { + printf("something went wrong in %s...\n", __FUNCTION__); + /* ... */ - result &= register_python_arch_instruction(module); - result &= register_python_arch_instruction_iterator(module); + } - return true; + return result; } diff --git a/plugins/pychrysa/arch/module.h b/plugins/pychrysa/arch/module.h index 8017f76..403ec8a 100644 --- a/plugins/pychrysa/arch/module.h +++ b/plugins/pychrysa/arch/module.h @@ -22,8 +22,8 @@ */ -#ifndef _PLUGINS_PYOIDA_ARCH_MODULE_H -#define _PLUGINS_PYOIDA_ARCH_MODULE_H +#ifndef _PLUGINS_PYCHRYSALIDE_ARCH_MODULE_H +#define _PLUGINS_PYCHRYSALIDE_ARCH_MODULE_H #include <Python.h> @@ -36,4 +36,4 @@ bool add_arch_module_to_python_module(PyObject *); -#endif /* _PLUGINS_PYOIDA_ARCH_MODULE_H */ +#endif /* _PLUGINS_PYCHRYSALIDE_ARCH_MODULE_H */ diff --git a/plugins/pychrysa/arch/vmpa.c b/plugins/pychrysa/arch/vmpa.c new file mode 100644 index 0000000..b429699 --- /dev/null +++ b/plugins/pychrysa/arch/vmpa.c @@ -0,0 +1,325 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * vmpa.c - équivalent Python du fichier "arch/vmpa.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 "vmpa.h" + + +#include <src/arch/vmpa.h> + + + + + + + +typedef struct _py_vmpa_t +{ + PyObject_HEAD + + vmpa2_t addr; + +} py_vmpa_t; + + + + +/* Fournit une représentation d'une variable 'vmpa_t'. */ +static PyObject *py_vmpa_to_str(PyObject *); + + + + +/* Effectue une conversion d'un objet Python en type 'vmpa_t'. */ +static bool convert_pyobj_to_vmpa(PyObject *, vmpa2_t *); + +/* Effectue une opération de type 'add' avec le type 'vmpa'. */ +static PyObject *py_vmpa_nb_add(PyObject *, PyObject *); + + + + + +/****************************************************************************** +* * +* Paramètres : obj = objet Python à traiter. * +* * +* Description : Fournit une représentation d'une variable 'vmpa_t'. * +* * +* Retour : Chaîne de caractère pour Python. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_vmpa_to_str(PyObject *obj) +{ + vmpa2_t *addr; + + addr = &((py_vmpa_t *)obj)->addr; + + return PyUnicode_FromFormat("<phy=%d, virt=0x%08x>", addr->physical, addr->virtual); + +} + + + + + + + +/****************************************************************************** +* * +* Paramètres : obj = objet Python à tenter de convertir. * +* addr = structure équivalente pour Chrysalide. * +* * +* Description : Effectue une conversion d'un objet Python en type 'vmpa_t'. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool convert_pyobj_to_vmpa(PyObject *obj, vmpa2_t *addr) +{ + bool result; /* Résulats à retourner */ + PyTypeObject *py_vmpa_type; /* Type Python pour 'vmpa' */ + int ret; /* Bilan d'un appel */ + PY_LONG_LONG value; /* Valeur de type générique */ + int overflow; /* Détection d'une grosse val. */ + + result = false; + + py_vmpa_type = get_python_vmpa_type(); + + ret = PyObject_IsInstance(obj, (PyObject *)py_vmpa_type); + + /* S'il n'y a rien à faire... */ + if (ret == 1) + { + *addr = ((py_vmpa_t *)obj)->addr; + result = true; + } + + /* Sinon on demande à Python... */ + else + { + value = PyLong_AsLongLongAndOverflow(obj, &overflow); + + if (value == -1 && (overflow == 1 || PyErr_Occurred())) + PyErr_Clear(); + + else + { + init_vmpa(addr, value, value); + result = true; + } + + } + + return result; + +} + + + + +/****************************************************************************** +* * +* Paramètres : o1 = premier élément concerné par l'opération. * +* o2 = second élément concerné par l'opération. * +* * +* Description : Effectue une opération de type 'add' avec le type 'vmpa'. * +* * +* Retour : Résultat de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_vmpa_nb_add(PyObject *o1, PyObject *o2) +{ + PyObject *result; /* Résultat à retourner */ + vmpa2_t addr1; /* Première adresse à traiter */ + vmpa2_t addr2; /* Seconde adresse à traiter */ + PyTypeObject *py_vmpa_type; /* Type Python pour 'vmpa' */ + + if (!convert_pyobj_to_vmpa(o1, &addr1)) + return NULL; + + if (!convert_pyobj_to_vmpa(o2, &addr2)) + return NULL; + + py_vmpa_type = get_python_vmpa_type(); + + result = PyObject_CallObject((PyObject *)py_vmpa_type, NULL); + + init_vmpa(&((py_vmpa_t *)result)->addr, + addr1.physical + addr2.physical, + addr1.virtual + addr2.virtual); + + return result; + +} + + + + +void log_simple_message(/*LogMessageType*/ int type, const char *msg) +{ + +} + + +void log_variadic_message(/*LogMessageType*/ int type, const char *fmt, ...) +{ + + +} + + +void change_editor_items_current_view_content(void/*GtkViewPanel*/ *view) +{ + + +} + + + + +/****************************************************************************** +* * +* Paramètres : - * +* * +* Description : Fournit un accès à une définition de type à diffuser. * +* * +* Retour : Définition d'objet pour Python. * +* * +* Remarques : - * +* * +******************************************************************************/ + +PyTypeObject *get_python_vmpa_type(void) +{ + static PyNumberMethods py_vmpa_nb_proto = { + + .nb_add = py_vmpa_nb_add, + + /* + binaryfunc nb_add; + binaryfunc nb_subtract; + binaryfunc nb_multiply; + binaryfunc nb_remainder; + binaryfunc nb_divmod; + ternaryfunc nb_power; + unaryfunc nb_negative; + unaryfunc nb_positive; + unaryfunc nb_absolute; + inquiry nb_bool; + unaryfunc nb_invert; + binaryfunc nb_lshift; + binaryfunc nb_rshift; + binaryfunc nb_and; + binaryfunc nb_xor; + binaryfunc nb_or; + unaryfunc nb_int; + void *nb_reserved; + unaryfunc nb_float; + + binaryfunc nb_inplace_add; + binaryfunc nb_inplace_subtract; + binaryfunc nb_inplace_multiply; + binaryfunc nb_inplace_remainder; + ternaryfunc nb_inplace_power; + binaryfunc nb_inplace_lshift; + binaryfunc nb_inplace_rshift; + binaryfunc nb_inplace_and; + binaryfunc nb_inplace_xor; + binaryfunc nb_inplace_or; + + binaryfunc nb_floor_divide; + binaryfunc nb_true_divide; + binaryfunc nb_inplace_floor_divide; + binaryfunc nb_inplace_true_divide; + + unaryfunc nb_index; + + */ + + }; + + static PyTypeObject py_vmpa_type = { + + PyVarObject_HEAD_INIT(NULL, 0) + + .tp_name = "pychrysalide.arch.vmpa", + .tp_basicsize = sizeof(py_vmpa_t), + + .tp_as_number = &py_vmpa_nb_proto, + + .tp_str = py_vmpa_to_str, + + .tp_flags = Py_TPFLAGS_DEFAULT, + + .tp_doc = "Python object for vmpa_t" + + }; + + return &py_vmpa_type; + +} + + + + +/****************************************************************************** +* * +* Paramètres : module = module dont la définition est à compléter. * +* * +* Description : Prend en charge l'objet 'pychrysalide.arch.vmpa'. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool register_python_vmpa(PyObject *module) +{ + PyTypeObject *py_vmpa_type; /* Type Python pour 'vmpa' */ + int ret; /* Bilan d'un appel */ + + py_vmpa_type = get_python_vmpa_type(); + + py_vmpa_type->tp_new = PyType_GenericNew; + + if (PyType_Ready(py_vmpa_type) != 0) + return false; + + Py_INCREF(py_vmpa_type); + ret = PyModule_AddObject(module, "vmpa", (PyObject *)py_vmpa_type); + + return (ret == 0); + +} diff --git a/plugins/pychrysa/arch/vmpa.h b/plugins/pychrysa/arch/vmpa.h new file mode 100644 index 0000000..6ee00b2 --- /dev/null +++ b/plugins/pychrysa/arch/vmpa.h @@ -0,0 +1,42 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * vmpa.h - prototypes pour l'équivalent Python du fichier "arch/vmpa.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_ARCH_VMPA_H +#define _PLUGINS_PYCHRYSALIDE_ARCH_VMPA_H + + +#include <Python.h> +#include <stdbool.h> + + + +/* Fournit un accès à une définition de type à diffuser. */ +PyTypeObject *get_python_vmpa_type(void); + +/* Prend en charge l'objet 'pychrysalide.arch.vmpa'. */ +bool register_python_vmpa(PyObject *); + + + +#endif /* _PLUGINS_PYCHRYSALIDE_ARCH_VMPA_H */ |