/* OpenIDA - Outil d'analyse de fichiers binaires * pyoida.c - plugin permettant des extensions en Python * * Copyright (C) 2009 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 Foobar. If not, see . */ #include "pyoida.h" #include #include #include #include "analysis/module.h" #include "arch/module.h" #include "format/module.h" /* #include "analysis/py_binary.h" #include "analysis/py_line.h" #include "analysis/py_line_code.h" #include "analysis/roptions.h" */ #include "plugin.h" #include "py_log.h" #include "../../src/common/environment.h" #include "plugin.h" static GObject *_ref = NULL; static PyObject *pyoida_get_current_binary(PyObject *self, PyObject *args) { GOpenidaBinary *binary; /* Structure à copier */ binary = (GOpenidaBinary *)g_object_get_data(_ref, "current_binary"); return pybinary_new_from_existing(binary); } static PyMethodDef SpamMethods[] = { {"current_binary", pyoida_get_current_binary, METH_NOARGS, "Give the current analyzed binary."}, {NULL, NULL, 0, NULL} /* Sentinel */ }; static PyObject *__mod; /****************************************************************************** * * * Paramètres : ref = espace de référencement global. * * * * Description : Initialise le greffon permettant l'usage de Python. * * * * Retour : true. * * * * Remarques : - * * * ******************************************************************************/ bool init_plugin(GObject *ref) { char *paths; /* Emplacements de greffons */ char *path; /* Chemin à fouiller */ char *save; /* Sauvegarde pour ré-entrance */ DIR *dir; /* Répertoire à parcourir */ struct dirent entry; /* Elément trouvé */ struct dirent *next; /* Prochain élément fourni */ int ret; /* Bilan d'un appel système */ char *filename; /* Chemin d'accès reconstruit */ GPluginModule *plugin; printf("Init pyoida\n"); _ref = ref; /* Définition des zones d'influence */ add_to_env_var("PYTHONPATH", PLUGINS_DIR G_DIR_SEPARATOR_S "python", ";"); paths = get_env_var("PYTHONPATH"); /* Intialisations Python */ //return false; Py_Initialize(); initpyoida(); /* Chargement des greffons */ printf("Paths :: '%s'\n", paths); for (path = strtok_r(paths, ";", &save); path != NULL; path = strtok_r(NULL, ";", &save)) { dir = opendir(path); if (dir == NULL) { perror("opendir"); continue; } printf("CHEMIN :: '%s'\n", path); for (ret = readdir_r(dir, &entry, &next); ret == 0 && next != NULL; ret = readdir_r(dir, &entry, &next)) { if (entry.d_name[0] == '.') continue; filename = strdup(entry.d_name); filename = stradd(filename, "."); filename = stradd(filename, "__init__"); printf(" - entry :: '%s'\n", filename); plugin = g_python_plugin_new(entry.d_name, filename); if (plugin == NULL) printf("No suitable Python plugin found in '%s'\n", filename); /* FIXME : LOG(...) */ else { printf("ok pour %s\n", filename); add_plugin_to_main_list(plugin); } free(filename); } closedir(dir); break; /* FIXME */ } //Py_Finalize(); return true; } /****************************************************************************** * * * Paramètres : plugin = greffon à consulter. * * * * Description : Indique les opérations offertes par un greffon donné. * * * * Retour : Action(s) offerte(s) par le greffon. * * * * Remarques : - * * * ******************************************************************************/ PluginAction get_plugin_action(const GPluginModule *plugin) { PluginAction result; /* Combinaison à retourner */ result = PGA_NONE; return result; } #if PY_VERSION_HEX >= 0x03000000 /* Python 3.x code */ static struct PyModuleDef spammodule = { PyModuleDef_HEAD_INIT, "pyoida", /* name of module */ "pyoida_doc", /* module documentation, may be NULL */ -1, /* size of per-interpreter state of the module, or -1 if the module keeps state in global variables. */ SpamMethods }; PyMODINIT_FUNC PyInit_pyoida(void) { printf("Passage 3\n"); (void) PyModule_Create(&spammodule); } #else /* Python 2.x code */ typedef struct { PyObject_HEAD PyObject *md_dict; } PyModuleObject; PyMODINIT_FUNC initpyoida(void) { PyObject *module; printf("Passage 2\n"); module = Py_InitModule("pyoida", SpamMethods); __mod = module; //add_analysis_roptions_to_python_module(module); add_analysis_module_to_python_module(module); add_arch_module_to_python_module(module); add_format_module_to_python_module(module); add_log_to_python_module(module); add_plugin_to_python_module(module); } #endif