From 944fc0a5638bfe77fc65e514fbdd945d8a652635 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Sat, 15 Sep 2012 08:19:09 +0000 Subject: Shown all Android permissions with links to the code. git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@262 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a --- ChangeLog | 51 ++++++++ configure.ac | 2 + plugins/pychrysa/Makefile.am | 7 +- plugins/pychrysa/arch/instruction.c | 36 ++++++ plugins/pychrysa/gui/Makefile.am | 20 +++ plugins/pychrysa/gui/module.c | 68 ++++++++++ plugins/pychrysa/gui/module.h | 39 ++++++ plugins/pychrysa/gui/panels/Makefile.am | 17 +++ plugins/pychrysa/gui/panels/module.c | 68 ++++++++++ plugins/pychrysa/gui/panels/module.h | 39 ++++++ plugins/pychrysa/gui/panels/panel.c | 213 ++++++++++++++++++++++++++++++++ plugins/pychrysa/gui/panels/panel.h | 44 +++++++ plugins/pychrysa/pychrysa.c | 3 + plugins/pychrysa/quirks.c | 32 ++++- plugins/pychrysa/quirks.h | 7 ++ plugins/python/androperms/androperms.py | 67 ++++++++-- plugins/python/androperms/panel.py | 78 +++++------- src/Makefile.am | 64 +++++----- src/analysis/routine.c | 4 +- src/analysis/type.c | 2 +- src/arch/instruction.c | 19 +++ src/arch/instruction.h | 3 + src/gui/Makefile.am | 3 +- src/gui/menus/Makefile.am | 2 +- src/gui/panels/panel.c | 2 - 25 files changed, 788 insertions(+), 102 deletions(-) create mode 100644 plugins/pychrysa/gui/Makefile.am create mode 100644 plugins/pychrysa/gui/module.c create mode 100644 plugins/pychrysa/gui/module.h create mode 100644 plugins/pychrysa/gui/panels/Makefile.am create mode 100644 plugins/pychrysa/gui/panels/module.c create mode 100644 plugins/pychrysa/gui/panels/module.h create mode 100644 plugins/pychrysa/gui/panels/panel.c create mode 100644 plugins/pychrysa/gui/panels/panel.h diff --git a/ChangeLog b/ChangeLog index 667e23b..a2e548b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,54 @@ +12-09-15 Cyrille Bagard + + * configure.ac: + Add the new Makfiles from the plugins/pychrysa/gui and + plugins/pychrysa/gui/panels directories to AC_CONFIG_FILES. + + * plugins/pychrysa/arch/instruction.c: + Provide the keyword used in an instruction. + + * plugins/pychrysa/gui/Makefile.am: + * plugins/pychrysa/gui/module.c: + * plugins/pychrysa/gui/module.h: + * plugins/pychrysa/gui/panels/Makefile.am: + * plugins/pychrysa/gui/panels/module.c: + * plugins/pychrysa/gui/panels/module.h: + * plugins/pychrysa/gui/panels/panel.c: + * plugins/pychrysa/gui/panels/panel.h: + New entries: allow plugins to add panels in the editor. + + * plugins/pychrysa/Makefile.am: + Reorganize binaries. + + * plugins/pychrysa/pychrysa.c: + Store the global reference area and load the gui module. + + * plugins/pychrysa/quirks.c: + * plugins/pychrysa/quirks.h: + Update Gil access (!) and store the global reference here. + + * plugins/python/androperms/androperms.py: + * plugins/python/androperms/panel.py: + Show all Android permissions with links to the code. + + * src/analysis/routine.c: + * src/analysis/type.c: + Cosmetic. + + * src/arch/instruction.c: + * src/arch/instruction.h: + Provide the keyword used in an instruction. + + * src/gui/Makefile.am: + * src/gui/menus/Makefile.am: + Reorganize binaries. + + * src/gui/panels/panel.c: + Remove dead code. + + * src/Makefile.am: + Reorganize and rename all binaries. + 12-08-20 Cyrille Bagard * pixmaps/drop_bottom_hover.png: diff --git a/configure.ac b/configure.ac index 9f369da..23804fb 100644 --- a/configure.ac +++ b/configure.ac @@ -242,6 +242,8 @@ AC_CONFIG_FILES([Makefile plugins/pychrysa/debug/Makefile plugins/pychrysa/format/Makefile plugins/pychrysa/glibext/Makefile + plugins/pychrysa/gui/Makefile + plugins/pychrysa/gui/panels/Makefile plugins/python/Makefile plugins/python/androperms/Makefile plugins/python/apkfiles/Makefile diff --git a/plugins/pychrysa/Makefile.am b/plugins/pychrysa/Makefile.am index f8c08db..d57c9f5 100644 --- a/plugins/pychrysa/Makefile.am +++ b/plugins/pychrysa/Makefile.am @@ -12,11 +12,12 @@ pychrysa_la_LIBADD = \ arch/libpychrysaarch.la \ debug/libpychrysadebug.la \ format/libpychrysaformat.la \ - glibext/libpychrysaglibext.la + glibext/libpychrysaglibext.la \ + gui/libpychrysagui.la pychrysa_la_LDFLAGS = -module -avoid-version $(LIBGTK_LIBS) $(LIBXML_LIBS) $(LIBPYTHON_LIBS) \ $(LIBPYGOBJECT_LIBS) \ - -L../../src/panels/ -lpanels -L../../src/.libs -loidadisass -loidagtkext \ + -L../../src/panels/ -lpanels -L../../src/.libs -L../../src/gui/.libs -lchrysagui -lchrysadisass -lchrysagtkext \ -L../../src/plugins/.libs -lplugins @@ -26,4 +27,4 @@ AM_CPPFLAGS = AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) $(COMPLIANCE_FLAGS) -SUBDIRS = analysis arch debug format glibext +SUBDIRS = analysis arch debug format glibext gui diff --git a/plugins/pychrysa/arch/instruction.c b/plugins/pychrysa/arch/instruction.c index 80cc4ee..bed937b 100644 --- a/plugins/pychrysa/arch/instruction.c +++ b/plugins/pychrysa/arch/instruction.c @@ -72,6 +72,9 @@ static PyObject *py_arch_instruction_get_iter(PyObject *); /* Fournit la valeur associée à une propriété donnée. */ static PyObject *py_arch_instruction_get_location(PyObject *, char *); +/* Fournit le nom humain de l'instruction manipulée. */ +static PyObject *py_arch_instruction_get_keyword(PyObject *, void *); + /* ---------------------------------------------------------------------------------- */ @@ -347,6 +350,35 @@ static PyObject *py_arch_instruction_get_location(PyObject *self, char *name) /****************************************************************************** * * +* Paramètres : self = classe représentant une instruction. * +* unused = adresse non utilisée ici. * +* * +* Description : Fournit le nom humain de l'instruction manipulée. * +* * +* Retour : Valeur associée à la propriété consultée. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_arch_instruction_get_keyword(PyObject *self, void *unused) +{ + PyObject *result; /* Trouvailles à retourner */ + GArchInstruction *instr; /* Version native */ + const char *kw; /* Valeur récupérée */ + + instr = G_ARCH_INSTRUCTION(pygobject_get(self)); + kw = g_arch_instruction_get_keyword(instr); + + result = PyString_FromString(kw); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : module = module dont la définition est à compléter. * * * * Description : Prend en charge l'objet 'pychrysalide.arch.ArchInstruction'. * @@ -379,6 +411,10 @@ bool register_python_arch_instruction(PyObject *module) "address", (getter)py_arch_instruction_get_location, (setter)NULL, "Provide the location of the instruction in memory.", "address" }, + { + "keyword", (getter)py_arch_instruction_get_keyword, (setter)NULL, + "Give le name of the assembly instruction.", NULL + }, { NULL } }; diff --git a/plugins/pychrysa/gui/Makefile.am b/plugins/pychrysa/gui/Makefile.am new file mode 100644 index 0000000..48fde30 --- /dev/null +++ b/plugins/pychrysa/gui/Makefile.am @@ -0,0 +1,20 @@ + +noinst_LTLIBRARIES = libpychrysagui.la + +libpychrysagui_la_SOURCES = \ + module.h module.c + +libpychrysagui_la_LIBADD = \ + panels/libpychrysaguipanels.la + +libpychrysagui_la_LDFLAGS = + + +INCLUDES = $(LIBGTK_CFLAGS) $(LIBXML_CFLAGS) $(LIBPYTHON_CFLAGS) $(LIBPYGOBJECT_CFLAGS) \ + -I../../../src + +AM_CPPFLAGS = + +AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) $(COMPLIANCE_FLAGS) + +SUBDIRS = panels diff --git a/plugins/pychrysa/gui/module.c b/plugins/pychrysa/gui/module.c new file mode 100644 index 0000000..bee46df --- /dev/null +++ b/plugins/pychrysa/gui/module.c @@ -0,0 +1,68 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * module.c - intégration du répertoire gui en tant que module + * + * Copyright (C) 2012 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 "panels/module.h" + + + +/****************************************************************************** +* * +* Paramètres : module = module dont la définition est à compléter. * +* * +* Description : Ajoute le module 'gui' au module Python. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool add_gui_module_to_python_module(PyObject *super) +{ + bool result; + PyObject *module; + int ret; /* Bilan d'un appel */ + + static PyMethodDef py_gui_methods[] = { + { NULL } + }; + + module = Py_InitModule("pychrysalide.gui", py_gui_methods); + if (module == NULL) return false; + + Py_INCREF(module); + ret = PyModule_AddObject(super, "pychrysalide.gui", module); + + result = (ret != 0); + + if (ret != 0) /* ... */; + + result &= add_gui_panels_module_to_python_module(module); + + return true; + +} diff --git a/plugins/pychrysa/gui/module.h b/plugins/pychrysa/gui/module.h new file mode 100644 index 0000000..0c909d3 --- /dev/null +++ b/plugins/pychrysa/gui/module.h @@ -0,0 +1,39 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * module.h - prototypes pour l'intégration du répertoire gui en tant que module + * + * Copyright (C) 2012 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_GUI_MODULE_H +#define _PLUGINS_PYCHRYSA_GUI_MODULE_H + + +#include +#include + + + +/* Ajoute le module 'gui' au module Python. */ +bool add_gui_module_to_python_module(PyObject *); + + + +#endif /* _PLUGINS_PYCHRYSA_GUI_MODULE_H */ diff --git a/plugins/pychrysa/gui/panels/Makefile.am b/plugins/pychrysa/gui/panels/Makefile.am new file mode 100644 index 0000000..b383293 --- /dev/null +++ b/plugins/pychrysa/gui/panels/Makefile.am @@ -0,0 +1,17 @@ + +noinst_LTLIBRARIES = libpychrysaguipanels.la + +libpychrysaguipanels_la_SOURCES = \ + module.h module.c \ + panel.h panel.c + + +libpychrysaguipanels_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/gui/panels/module.c b/plugins/pychrysa/gui/panels/module.c new file mode 100644 index 0000000..7c26dac --- /dev/null +++ b/plugins/pychrysa/gui/panels/module.c @@ -0,0 +1,68 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * module.c - intégration du répertoire arch en tant que module + * + * Copyright (C) 2012 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 "panel.h" + + + +/****************************************************************************** +* * +* Paramètres : module = module dont la définition est à compléter. * +* * +* Description : Ajoute le module 'gui.panels' au module Python. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool add_gui_panels_module_to_python_module(PyObject *super) +{ + bool result; + PyObject *module; + int ret; /* Bilan d'un appel */ + + static PyMethodDef py_gui_panels_methods[] = { + { NULL } + }; + + module = Py_InitModule("pychrysalide.gui.panels", py_gui_panels_methods); + if (module == NULL) return false; + + Py_INCREF(module); + ret = PyModule_AddObject(super, "pychrysalide.gui.panels", module); + + result = (ret != 0); + + if (ret != 0) /* ... */; + + result &= register_python_panel_item(module); + + return true; + +} diff --git a/plugins/pychrysa/gui/panels/module.h b/plugins/pychrysa/gui/panels/module.h new file mode 100644 index 0000000..6d7415c --- /dev/null +++ b/plugins/pychrysa/gui/panels/module.h @@ -0,0 +1,39 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * module.h - prototypes pour l'intégration du répertoire gui.panels en tant que module + * + * Copyright (C) 2012 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_GUI_PANELS_MODULE_H +#define _PLUGINS_PYCHRYSA_GUI_PANELS_MODULE_H + + +#include +#include + + + +/* Ajoute le module 'gui.panels' au module Python. */ +bool add_gui_panels_module_to_python_module(PyObject *); + + + +#endif /* _PLUGINS_PYCHRYSA_GUI_PANELS_MODULE_H */ diff --git a/plugins/pychrysa/gui/panels/panel.c b/plugins/pychrysa/gui/panels/panel.c new file mode 100644 index 0000000..c35e9a0 --- /dev/null +++ b/plugins/pychrysa/gui/panels/panel.c @@ -0,0 +1,213 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * panel.c - équivalent Python du fichier "gui/panels/panel.c" + * + * Copyright (C) 2012 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 "panel.h" + + +#include + + +#include "../../quirks.h" + + + +/* Crée un nouvel objet Python de type 'PanelItem'. */ +static PyObject *py_panel_item_new(PyTypeObject *, PyObject *, PyObject *); + +/* Place un panneau dans l'ensemble affiché. */ +static PyObject *py_panel_item_dock(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 'PanelItem'. * +* * +* Retour : Instance Python mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_panel_item_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + PyObject *result; /* Instance à retourner */ + const char *name; /* Désignation humaine */ + const char *lname; /* Nom version longue */ + PyGObject *widget; /* Composant visuel du panneau */ + const char *path; /* Placement à l'affichage */ + int ret; /* Bilan de lecture des args. */ + GEditorItem *item; /* Version GLib du format */ + + ret = PyArg_ParseTupleAndKeywords(args, kwds, "ssOs", + (char *[]) { "name", "lname", "widget", "path", NULL }, + &name, &lname, &widget, &path); + if (!ret) return Py_None; + + item = g_panel_item_new(get_internal_ref(), name, lname, + GTK_WIDGET(pygobject_get(widget)), path); + + result = py_panel_item_from_c(G_PANEL_ITEM(item)); + g_object_unref(item); + + return (PyObject *)result; + +} + + +/****************************************************************************** +* * +* Paramètres : item = instance existante GLib. * +* * +* Description : Crée un nouvel objet Python de type 'PanelItem'. * +* * +* Retour : Instance Python mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +PyObject *py_panel_item_from_c(GPanelItem *item) +{ + PyObject *module; /* Module d'appartenance */ + PyTypeObject *type; /* Type Python correspondant */ + + module = PyImport_ImportModule("pychrysalide.gui.panels"); + type = (PyTypeObject *)PyObject_GetAttrString(module, "PanelItem"); + Py_DECREF(module); + + pychrysalide_set_instance_data(G_OBJECT(item), type); + + return pygobject_new(G_OBJECT(item)); + +} + + +/****************************************************************************** +* * +* Paramètres : self = classe représentant un binaire. * +* args = arguments fournis à l'appel. * +* * +* Description : Place un panneau dans l'ensemble affiché. * +* * +* Retour : Py_None. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_panel_item_dock(PyObject *self, PyObject *args) +{ + GPanelItem *item; /* Panneau à manipuler */ + + item = G_PANEL_ITEM(pygobject_get(self)); + + g_panel_item_dock(item); + + return Py_None; + +} + + + + + + + + + + + + + + + + +/****************************************************************************** +* * +* Paramètres : module = module dont la définition est à compléter. * +* * +* Description : Prend en charge l'objet 'pychrysalide.gui.panels.PanelItem'. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool register_python_panel_item(PyObject *module) +{ + PyObject *pygobj_mod; /* Module Python-GObject */ + int ret; /* Bilan d'un appel */ + + static PyMethodDef py_panel_item_methods[] = { + { + "dock", (PyCFunction)py_panel_item_dock, + METH_NOARGS, + "DIsplay the panel item in the right place." + }, + { NULL } + }; + + static PyGetSetDef py_panel_item_getseters[] = { + { NULL } + }; + + static PyTypeObject py_panel_item_type = { + + PyObject_HEAD_INIT(NULL) + + .tp_name = "pychrysalide.gui.panels.PanelItem", + .tp_basicsize = sizeof(PyGObject), + + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + + .tp_doc = "PyChrysalide panel item", + + .tp_methods = py_panel_item_methods, + .tp_getset = py_panel_item_getseters, + .tp_new = (newfunc)py_panel_item_new + + }; + + pygobj_mod = PyImport_ImportModule("gobject"); + if (pygobj_mod == NULL) return false; + + py_panel_item_type.tp_base = (PyTypeObject *)PyObject_GetAttrString(pygobj_mod, "GObject"); + Py_DECREF(pygobj_mod); + + if (PyType_Ready(&py_panel_item_type) < 0) + return false; + + Py_INCREF(&py_panel_item_type); + ret = PyModule_AddObject(module, "PanelItem", (PyObject *)&py_panel_item_type); + + return (ret == 0); + +} diff --git a/plugins/pychrysa/gui/panels/panel.h b/plugins/pychrysa/gui/panels/panel.h new file mode 100644 index 0000000..8d06094 --- /dev/null +++ b/plugins/pychrysa/gui/panels/panel.h @@ -0,0 +1,44 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * panel.h - prototypes pour l'équivalent Python du fichier "gui/panels/panel.h" + * + * Copyright (C) 2012 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_GUI_PANELS_PANEL_H +#define _PLUGINS_PYCHRYSA_GUI_PANELS_PANEL_H + + +#include +#include + +#include + + + +/* Crée un nouvel objet Python de type 'PanelItem'. */ +PyObject *py_panel_item_from_c(GPanelItem *); + +/* Prend en charge l'objet 'pychrysalide.gui.panels.PanelItem'. */ +bool register_python_panel_item(PyObject *module); + + + +#endif /* _PLUGINS_PYCHRYSA_GUI_PANELS_PANEL_H */ diff --git a/plugins/pychrysa/pychrysa.c b/plugins/pychrysa/pychrysa.c index 8b9fc50..0aa6175 100644 --- a/plugins/pychrysa/pychrysa.c +++ b/plugins/pychrysa/pychrysa.c @@ -38,6 +38,7 @@ #include "debug/module.h" #include "format/module.h" #include "glibext/module.h" +#include "gui/module.h" /* #include "analysis/py_binary.h" @@ -123,6 +124,7 @@ bool init_plugin(GPluginModule *plugin, GObject *ref) //return false; + define_internal_ref(ref); Py_Initialize(); @@ -267,6 +269,7 @@ PyMODINIT_FUNC initpychrysa(void) add_debug_module_to_python_module(module); add_format_module_to_python_module(module); add_glibext_module_to_python_module(module); + add_gui_module_to_python_module(module); add_log_to_python_module(module); add_plugin_to_python_module(module); diff --git a/plugins/pychrysa/quirks.c b/plugins/pychrysa/quirks.c index 4dcae2c..0e35f57 100644 --- a/plugins/pychrysa/quirks.c +++ b/plugins/pychrysa/quirks.c @@ -55,7 +55,7 @@ static void pygobject_data_free_fake(PyGObjectData_fake *data) PyGILState_STATE state; /* Etat interne de Python */ GSList *iter; /* Boucle de parcours */ - state = pyglib_gil_state_ensure(); + //state = pyglib_gil_state_ensure(); Py_DECREF(data->type); @@ -77,7 +77,7 @@ static void pygobject_data_free_fake(PyGObjectData_fake *data) g_free(data); - pyglib_gil_state_release(state); + //pyglib_gil_state_release(state); } @@ -94,6 +94,9 @@ static PyGObjectData_fake *pygobject_data_new_fake(void) } +static GObject *_ref = NULL; + + /****************************************************************************** * * @@ -146,3 +149,28 @@ void pychrysalide_set_instance_data(GObject *obj, PyTypeObject *type) } } + + +/****************************************************************************** +* * +* Paramètres : ref = espace de référencement global à utiliser. * +* * +* Description : Evite à Python d'avoir à manipuler les références internes. * +* * +* Retour : Adresse de l'espace de référencement global. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GObject *_get_internal_ref(GObject *ref) +{ + if (ref != NULL) + { + g_object_ref(ref); + _ref = ref; + } + + return _ref; + +} diff --git a/plugins/pychrysa/quirks.h b/plugins/pychrysa/quirks.h index 70e036e..f9c53dc 100644 --- a/plugins/pychrysa/quirks.h +++ b/plugins/pychrysa/quirks.h @@ -37,6 +37,13 @@ void pychrysalide_init_quirks(void); /* Crée l'association précise attendue par Python-GObject. */ void pychrysalide_set_instance_data(GObject *, PyTypeObject *); +/* Evite à Python d'avoir à manipuler les références internes. */ +GObject *_get_internal_ref(GObject *); + + +#define define_internal_ref(r) _get_internal_ref(r) +#define get_internal_ref() _get_internal_ref(NULL) + #endif /* _PLUGINS_PYOIDA_QUIRKS_H */ diff --git a/plugins/python/androperms/androperms.py b/plugins/python/androperms/androperms.py index 0d70edc..6d65ca4 100644 --- a/plugins/python/androperms/androperms.py +++ b/plugins/python/androperms/androperms.py @@ -1,9 +1,10 @@ #!/usr/bin/python # -*- coding: utf-8 -*- -from pychrysalide import Plugin from manifest import AndroidManifest from panel import PermsPanel +from pychrysalide import Plugin +from pychrysalide.gui.panels import PanelItem from xml.dom import minidom import gtk @@ -45,27 +46,69 @@ class AndroPerms(Plugin): print - button = gtk.Button("Hello World") - button.show() - - treestore = gtk.TreeStore(str, str, str) panel = PermsPanel() + self._build_panel_item() + + panel.filter_permissions(plist) - #self.add_wgt(panel.get_widget()) instrs = binary.get_instructions() + buffer = binary.disassembled_buffer + + + + for i in instrs: - # print i, " :: 0x%08lx" % i.address - line = binary.disassembled_buffer.find_line_by_addr(i.address) - text = line.get_text() + if i.keyword.startswith("invoke"): + + line = buffer.find_line_by_addr(i.address) + text = line.get_text() + + panel.check_call(i.address, text) + + + + + + panel.fill_tree(self._store) + self._tree.expand_all() + + + + def _build_panel_item(self): + + self._scrolled_window = gtk.ScrolledWindow() + self._scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + self._scrolled_window.show() + + self._tree = gtk.TreeView() + self._tree.set_headers_visible(False) + self._tree.show() + self._scrolled_window.add_with_viewport(self._tree) + + locations = gtk.TreeViewColumn() + self._tree.append_column(locations) + + cell = gtk.CellRendererText() + locations.pack_start(cell, False) + locations.add_attribute(cell, "text", 0) + + functions = gtk.TreeViewColumn() + self._tree.append_column(functions) + + cell = gtk.CellRendererText() + functions.pack_start(cell, True) + functions.add_attribute(cell, "text", 1) + + self._store = gtk.TreeStore(str, str) + self._tree.set_model(self._store) - if text.startswith("invoke"): - #print "[0x%08lx] " % i.address, text - pass + pi = PanelItem(name="Permissions", lname="Permissions", widget=self._scrolled_window, path="S") + pi.dock() diff --git a/plugins/python/androperms/panel.py b/plugins/python/androperms/panel.py index b852049..ca7bb90 100644 --- a/plugins/python/androperms/panel.py +++ b/plugins/python/androperms/panel.py @@ -1,5 +1,6 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- -import gtk import os @@ -8,50 +9,12 @@ class PermsPanel: def __init__(self): - - tree = gtk.TreeView() - - languages = gtk.TreeViewColumn() - languages.set_title("Programming languages") - - cell = gtk.CellRendererText() - languages.pack_start(cell, True) - languages.add_attribute(cell, "text", 0) - - treestore = gtk.TreeStore(str) - - it = treestore.append(None, ["Scripting languages"]) - treestore.append(it, ["Python"]) - treestore.append(it, ["PHP"]) - treestore.append(it, ["Perl"]) - treestore.append(it, ["Ruby"]) - - it = treestore.append(None, ["Compiling languages"]) - treestore.append(it, ["C#"]) - treestore.append(it, ["C++"]) - treestore.append(it, ["C"]) - treestore.append(it, ["Java"]) - - tree.append_column(languages) - tree.set_model(treestore) - - tree.show() - - self._view = tree - self._perms = { } + self._used = { } self._load_all_definitions() - def get_widget(self): - - return self._view - - - - - def _load_all_definitions(self): """Load the database in memory.""" @@ -69,7 +32,10 @@ class PermsPanel: if p not in self._perms: self._perms[p] = [] - self._perms[p].append(perm[0]) + call = perm[0].split("(")[0] + + if call not in self._perms[p]: + self._perms[p].append(call) def filter_permissions(self, used): @@ -83,7 +49,29 @@ class PermsPanel: self._perms = keep - # for p in self._perms: - # print p - # for v in self._perms[p]: - # print " - ", v + for p in keep: + self._used[p] = [] + + + def check_call(self, addr, line): + """Check if a call requires some rights.""" + + for p in self._perms: + + for c in self._perms[p]: + + if line.find(c) > -1: + self._used[p].append([addr, c + "()"]) + + + def fill_tree(self, store): + """Fill a treeview with all found permissions.""" + + for p in self._used: + + if len(self._used[p]) > 0: + + it = store.append(None, [p, None]) + + for f in self._used[p]: + store.append(it, ["0x%08x" % f[0], f[1]]) diff --git a/src/Makefile.am b/src/Makefile.am index 9432240..35cd031 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,7 +1,7 @@ -lib_LTLIBRARIES = liboidaglibext.la liboidadisass.la liboidagtkext.la liboidagui.la liboidaplugin.la +lib_LTLIBRARIES = libchrysaglibext.la libchrysadisass.la libchrysagtkext.la libchrysagui.la libchrysaplugin.la -bin_PROGRAMS=openida +bin_PROGRAMS = chrysalide @@ -9,14 +9,14 @@ bin_PROGRAMS=openida # Bibliothèques dynamiques ############################################################ -#--- liboidadisas +#--- libchrysadisas -liboidadisass_la_SOURCES = +libchrysadisass_la_SOURCES = -liboidadisass_la_LDFLAGS = $(LIBGTK_LIBS) $(LIBXML_LIBS) \ - -Lcommon/.libs -lcommon -L.libs -loidaglibext +libchrysadisass_la_LDFLAGS = $(LIBGTK_LIBS) $(LIBXML_LIBS) \ + -Lcommon/.libs -lcommon -L.libs -lchrysaglibext -liboidadisass_la_LIBADD = \ +libchrysadisass_la_LIBADD = \ analysis/libanalysis.la \ arch/libarch.la \ debug/libdebug.la \ @@ -25,47 +25,48 @@ liboidadisass_la_LIBADD = \ format/libformat.la -#--- liboidaglibext +#--- libchrysaglibext -liboidaglibext_la_SOURCES = +libchrysaglibext_la_SOURCES = -liboidaglibext_la_LDFLAGS = $(LIBGTK_LIBS) $(LIBGRAPH_LIBS) +libchrysaglibext_la_LDFLAGS = $(LIBGTK_LIBS) $(LIBGRAPH_LIBS) -liboidaglibext_la_LIBADD = \ +libchrysaglibext_la_LIBADD = \ glibext/libglibext.la -#--- liboidagtkext +#--- libchrysagtkext -liboidagtkext_la_SOURCES = +libchrysagtkext_la_SOURCES = -liboidagtkext_la_LDFLAGS = $(LIBGTK_LIBS) $(LIBGRAPH_LIBS) \ - -L.libs -loidadisass +libchrysagtkext_la_LDFLAGS = $(LIBGTK_LIBS) $(LIBGRAPH_LIBS) \ + -L.libs -lchrysadisass -liboidagtkext_la_LIBADD = \ +libchrysagtkext_la_LIBADD = \ graph/libgraph.la \ gtkext/libgtkext.la -#--- liboidagui +#--- libchrysagui -liboidagui_la_SOURCES = +libchrysagui_la_SOURCES = -liboidagui_la_LDFLAGS = $(LIBGTK_LIBS) \ - -L.libs -loidagtkext +libchrysagui_la_LDFLAGS = $(LIBGTK_LIBS) \ + -L.libs -lchrysagtkext -liboidagui_la_LIBADD = \ +libchrysagui_la_LIBADD = \ + gui/libgui.la \ panels/libpanels.la -#--- liboidaplugin +#--- libchrysaplugin -liboidaplugin_la_SOURCES = +libchrysaplugin_la_SOURCES = -liboidaplugin_la_LDFLAGS = $(LIBGTK_LIBS) \ - -L.libs -loidadisass -loidagui +libchrysaplugin_la_LDFLAGS = $(LIBGTK_LIBS) \ + -L.libs -lchrysadisass -lchrysagui -liboidaplugin_la_LIBADD = \ +libchrysaplugin_la_LIBADD = \ plugins/libplugins.la @@ -74,7 +75,7 @@ liboidaplugin_la_LIBADD = \ # Programme principal ############################################################ -openida_SOURCES = \ +chrysalide_SOURCES = \ configuration.h configuration.c \ editor.h editor.c \ main.c \ @@ -90,16 +91,15 @@ AM_CPPFLAGS = AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) $(COMPLIANCE_FLAGS) -openida_LDFLAGS = $(LIBGTK_LIBS) -L/usr/X11R6/lib -ldl -lm $(LIBXML_LIBS) `pkg-config --libs gthread-2.0` $(LIBPYTHON_LIBS) \ - -L.libs -loidaglibext -loidadisass -loidagtkext \ +chrysalide_LDFLAGS = $(LIBGTK_LIBS) -L/usr/X11R6/lib -ldl -lm $(LIBXML_LIBS) `pkg-config --libs gthread-2.0` $(LIBPYTHON_LIBS) \ + -L.libs -lchrysaglibext -lchrysadisass -lchrysagtkext -lchrysagui \ -Lcommon/.libs -lcommon \ -Lpanels/.libs -lpanels \ -Lplugins/.libs -lplugins -openida_LDADD = $(LIBINTL) \ - dialogs/libdialogs.la \ - gui/libgui.la +chrysalide_LDADD = $(LIBINTL) \ + dialogs/libdialogs.la diff --git a/src/analysis/routine.c b/src/analysis/routine.c index b4fc51f..7151fdc 100644 --- a/src/analysis/routine.c +++ b/src/analysis/routine.c @@ -744,7 +744,7 @@ char *_g_binary_routine_to_string(const GBinRoutine *routine, Routine2StringOpti { case RTT_CONSTRUCTOR: result = strdup(g_binary_routine_get_name(routine)); - result = stradd(result, "::"); + result = stradd(result, "." /* FIXME */); break; case RTT_DESTRUCTOR: @@ -772,7 +772,7 @@ char *_g_binary_routine_to_string(const GBinRoutine *routine, Routine2StringOpti namespace = g_openida_type_to_string(routine->namespace); result = stradd(result, namespace); - result = stradd(result, "::"); + result = stradd(result, "." /* FIXME */); free(namespace); diff --git a/src/analysis/type.c b/src/analysis/type.c index be49d98..d04e7ce 100644 --- a/src/analysis/type.c +++ b/src/analysis/type.c @@ -388,7 +388,7 @@ char *_g_openida_type_to_string(const GOpenidaType *type, bool simple) { namespace = g_openida_type_to_string(type->namespace); - result = strprep(result, "::"); + result = strprep(result, "." /* FIXME */); result = strprep(result, namespace); free(namespace); diff --git a/src/arch/instruction.c b/src/arch/instruction.c index 2d1836b..240ffbe 100644 --- a/src/arch/instruction.c +++ b/src/arch/instruction.c @@ -586,6 +586,25 @@ size_t g_arch_instruction_get_destinations(const GArchInstruction *instr, GArchI /****************************************************************************** * * +* Paramètres : instr = instruction d'assemblage à consulter. * +* * +* Description : Fournit le nom humain de l'instruction manipulée. * +* * +* Retour : Mot clef de bas niveau. * +* * +* Remarques : - * +* * +******************************************************************************/ + +const char *g_arch_instruction_get_keyword(const GArchInstruction *instr) +{ + return instr->get_text(instr, NULL/* FIXME */, 0/* FIXME */); + +} + + +/****************************************************************************** +* * * Paramètres : instr = instruction d'assemblage à représenter. * * buffer = espace où placer ledit contenu. * * syntax = type de représentation demandée. * diff --git a/src/arch/instruction.h b/src/arch/instruction.h index fd059a1..bf78bfd 100644 --- a/src/arch/instruction.h +++ b/src/arch/instruction.h @@ -118,6 +118,9 @@ size_t g_arch_instruction_get_destinations(const GArchInstruction *, GArchInstru /* --------------------- CONVERSIONS DU FORMAT DES INSTRUCTIONS --------------------- */ +/* Fournit le nom humain de l'instruction manipulée. */ +const char *g_arch_instruction_get_keyword(const GArchInstruction *); + /* Ajoute à un tampon GLib le contenu de l'instance spécifiée. */ void g_arch_instruction_print(const GArchInstruction *, GCodeBuffer *, MemoryDataSize, const bin_t *, AsmSyntax); diff --git a/src/gui/Makefile.am b/src/gui/Makefile.am index 24ba5e5..c0a03f0 100644 --- a/src/gui/Makefile.am +++ b/src/gui/Makefile.am @@ -8,8 +8,7 @@ libgui_la_SOURCES = \ libgui_la_LIBADD = \ menus/libguimenus.la \ panels/libguipanels.la \ - tb/libguitb.la \ - ../dialogs/libdialogs.la + tb/libguitb.la libgui_la_LDFLAGS = diff --git a/src/gui/menus/Makefile.am b/src/gui/menus/Makefile.am index 0f41d14..3aebdc0 100644 --- a/src/gui/menus/Makefile.am +++ b/src/gui/menus/Makefile.am @@ -12,7 +12,7 @@ libguimenus_la_SOURCES = \ libguimenus_la_LDFLAGS = -libguimenus_LIBADD = $(LIBINTL) \ +libguimenus_la_LIBADD = $(LIBINTL) \ ../../dialogs/libdialogs.la diff --git a/src/gui/panels/panel.c b/src/gui/panels/panel.c index f70a1ab..dc6a89f 100644 --- a/src/gui/panels/panel.c +++ b/src/gui/panels/panel.c @@ -669,6 +669,4 @@ static void rebuild_panels_interface(const panel_node *current) } - //g_object_unref(G_OBJECT(widget)); - } -- cgit v0.11.2-87-g4458